ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:25.23KB ,
资源ID:24242915      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24242915.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Arm linux 内核移植及系统初始化过程分析.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Arm linux 内核移植及系统初始化过程分析.docx

1、Arm linux 内核移植及系统初始化过程分析第四届云计算大会门票抢购:史上最低价,每日限5张! 【分享季1】:网友推荐130个经典资源,分享再赠分!Arm linux 内核移植及系统初始化过程分析 分类: Linux2011-03-25 14:48282人阅读评论(0)收藏举报=浅谈分析Arm linux 内核移植及系统初始化的过程(一) =学习嵌入式ARM linux,主要想必三个方向发展:1、嵌入式linux应用软件开发2、linux内核的剪裁和移植3、嵌入式linux底层驱动的开发本文就Arm linux 内核移植及系统初始化过程进行分析:咨询QQ:313807838主要介绍内核移植

2、过程中涉及文件的分布及其用途,以及简单介绍系统的初始化过程。整个arm linux内核的启动可分为三个阶段:第一阶段主要是进行cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些基础设施进行初始化;最后则是更高层次的初始化,如根设备和外部设备的初始化。了解系统的初始化过程,有益于更好地移植内核。1. 内核移植2. 涉及文件分布介绍2.1. 内核移植2.2. 涉及的头文件/linux-2.6.18.8/includerootlocalhost include# tree -L 1.|- Kbuild|- acpi|- asm - asm-arm|- asm-a

3、lpha|- asm-arm -(1)|- asm-sparc|- asm-sparc64|- config|- keys|- linux -(2)|- math-emu|- media|- mtd|- net|- pcmcia|- rdma|- rxrpc|- scsi|- sound- video内核移植过程中涉及到的头文件包括处理器相关的头文件(1)和处理器无关的头文件(2)。2.3. 内核移植2.4. 涉及的源文件/linux-2.6.18.8/arch/armrootlocalhost arm# tree -L 1.|- Kconfig|- Kconfig-nommu|- Kconf

4、ig.debug|- Makefile|- boot -(2)|- common|- configs|- kernel -(3)|- lib|- mach-at91rm9200|- mach-omap1|- mach-omap2|- mach-realview|- mach-rpc|- mach-s3c2410 -(4)|- mach-sa1100|- mach-versatile|- mm -(5)|- nwfpe|- oprofile|- plat-omap|- tools -(1)- vfp(1)/linux-2.6.18.8/arch/arm/toolsrootlocalhost to

5、ols# tree -L 1.|- Makefile|- gen-mach-types- mach-typesMach-types 文件定义了不同系统平台的系统平台号。移植linux内核到新的平台上需要对新的平台登记系统平台号。Mach-types文件格式如下:# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx numbers3c2410 ARCH_S3C2410 S3C2410 182smdk2410 ARCH_SMDK2410 SMDK2410 193之所以需要这些信息,是因为脚本文件linux/arch/arm/tools/gen-mach-types需

6、要linux/arch/tools/mach-types来产生linux/include/asm-arm/mach-types.h文件,该文件中设置了一些宏定义,需要这些宏定义来为目标系统选择合适的代码。(2)linux-2.6.18.8/arch/arm/boot/compressedrootlocalhost compressed# tree -L 1.|- Makefile|- Makefile.debug|- big-endian.S|- head-at91rm9200.S2 浅谈分析Arm linux 内核移植及系统初始化的过程|- head.S|- ll_char_wr.S|- m

7、isc.c|- ofw-shark.c|- piggy.S- vmlinux.lds.inHead.s 是内核映像的入口代码,是自引导程序。自引导程序包含一些初始化程序,这些程序都是体系结构相关的。在对系统作完初始化设置工作后,调用misc.c文件中的decompress_kernel()函数解压缩内核映像到指定的位置,然后跳转到kernel的入口地址。Vmlinux.lds.in用来生成内核映像的内存配置文件。(3)linux-2.6.18.8/arch/arm/kernelrootlocalhost kernel# tree -L 1.|- Makefile|- apm.c|- armks

8、yms.c|- arthur.c|- asm-offsets.c|- bios32.c|- calls.S|- dma.c|- ecard.c|- entry-armv.S|- entry-common.S|- entry-header.S|- fiq.c|- head-common.S|- head-nommu.S|- head.S|- init_task.c|- io.c|- irq.c|- isa.c|- module.c|- process.c|- ptrace.c|- ptrace.h|- semaphore.c|- setup.c|- smp.c|- sys_arm.c|- tim

9、e.c|- traps.c- vmlinux.lds.S内核入口处也是由一段汇编语言实现的,由head.s和head-common.s两个文件组成。Head.s 是内核的入口文件, 在head.s的末尾处 i nclude head-common.S。 经过一系列的初始化后,跳转到linux-2.6.18.8/init/main.c中的start_kernel()函数中,开始内核的基本初始化过程。/linux-2.6.18.8/initrootlocalhost init# tree.|- Kconfig|- Makefile|- calibrate.c|- do_mounts.c|- do_

10、mounts.h|- do_mounts_initrd.c|- do_mounts_md.c|- do_mounts_rd.c|- initramfs.c|- main.c- version.c(4)/linux-2.6.18.8/arch/arm/mach-s3c2410rootlocalhost mach-s3c2410# tree -L 1.|- Kconfig|- Makefile|- Makefile.boot|- bast-irq.c|- bast.h|- clock.c|- clock.h|- common-smdk.c|- common-smdk.h|- cpu.c|- cpu

11、.h|- devs.c|- devs.h|- dma.c|- gpio.c|- irq.c|- irq.h|- mach-anubis.c|- mach-smdk2410.c|- pm-simtec.c|- pm.c|- pm.h|- s3c2400-gpio.c|- s3c2400.h|- s3c2410-clock.c|- s3c2410-gpio.c|- s3c2410.c|- s3c2410.h|- sleep.S|- time.c|- usb-simtec.c- usb-simtec.h这个目录中的文件都是板级相关的,其中比较重要是如下几个:linux/arch/arm/mach-s

12、3c2410/cpu.c linux/arch/arm/mach-s3c2410/common-smdk.clinux/arch/arm/mach-s3c2410/devs.clinux/arch/arm/mach-s3c2410/mach-smdk2410.clinux/arch/arm/mach-s3c2410/Makefile.bootlinux/arch/arm/mach-s3c2410/s3c2410.c3. 处理器和设备4. 这里主要介绍处理器和设备的描述和操作过程。设备描述在linux/arch/arm/mach-s3c2410/devs.c和linux/arch/arm/mac

13、h-s3c2410/common-smdk.c中实现。最后以nand flash为例具体介绍。=浅谈分析Arm linux 内核移植及系统初始化的过程(二) =3 浅谈分析Arm linux 内核移植及系统初始化的过程。咨询QQ:3138078384.1. 处理器、设备4.2. 描述设备描述主要两个结构体完成:struct resource和struct platform_device。先来看看着两个结构体的定义:struct resource resource_size_t start;resource_size_t end;const char *name;unsigned long fl

14、ags;struct resource *parent, *sibling, *child;Resource结构体主要是描述了设备在系统中的起止地址、名称、标志以及为了链式描述方便指向本结构体类型的指针。Resource定义的实例将被添加到platform_device结构体对象中去。struct platform_device const char * name;u32 id;struct device dev;u32 num_resources;struct resource * resource;Platform_device结构体包括结构体的名称、ID号、平台相关的信息、设备的数目以及

15、上面定义的resource信息。Platform_device结构对象将被直接通过设备操作函数注册导系统中去。具体注册和注销过程在下一节介绍。4.3. 处理器、设备4.4. 操作(1) int platform_device_register(struct platform_device * pdev); 注册设备(2) void platform_device_unregister(struct platform_device * pdev); 注销设备(3) int platform_add_devices(struct platform_device *devs, int num);添加

16、设备,通过调用上面两个函数实现。4.5. 添加Nand flash设备4.6. 下面以nand flash 设备的描述为例,具体介绍下设备的描述和注册过程。/ resource结构体实例s3c_nand_resource 对nand flash 控制器描述,包括控制器的起止地址和标志。static struct resource s3c_nand_resource = 0 = .start = S3C2410_PA_NAND,.end = S3C2410_PA_NAND + S3C24XX_SZ_NAND - 1,.flags = IORESOURCE_MEM,;/platform_devic

17、e结构体实例s3c_device_nand定义了设备的名称、ID号并把resource对象作为其成员之一。struct platform_device s3c_device_nand = .name = s3c2410-nand,.id = -1,.num_resources = ARRAY_SIZE(s3c_nand_resource),.resource = s3c_nand_resource,;/ nand flash 的分区情况,由mtd_partition结构体定义。static struct mtd_partition smdk_default_nand_part = 0 = .n

18、ame = Boot Agent,.size = SZ_16K,.offset = 0,1 = .name = S3C2410 flash partition 1,.offset = 0,.size = SZ_2M,2 = .name = S3C2410 flash partition 2,.offset = SZ_4M,.size = SZ_4M,3 = .name = S3C2410 flash partition 3,.offset = SZ_8M,.size = SZ_2M,4 = .name = S3C2410 flash partition 4,=浅谈分析Arm linux 内核移

19、植及系统初始化的过程(三) =4、浅谈分析Arm linux 内核移植及系统初始化的过程 QQ:313807838.offset = SZ_1M * 10,.size = SZ_4M,5 = .name = S3C2410 flash partition 5,.offset = SZ_1M * 14,.size = SZ_1M * 10,6 = .name = S3C2410 flash partition 6,.offset = SZ_1M * 24,.size = SZ_1M * 24,7 = .name = S3C2410 flash partition 7,.offset = SZ_1

20、M * 48,.size = SZ_16M,;static struct s3c2410_nand_set smdk_nand_sets = 0 = .name = NAND,.nr_chips = 1,.nr_partitions = ARRAY_SIZE(smdk_default_nand_part),.partitions = smdk_default_nand_part,;/* choose a set of timings which should suit most 512Mbit* chips and beyond.*/static struct s3c2410_platform

21、_nand smdk_nand_info = .tacls = 20,.twrph0 = 60,.twrph1 = 20,.nr_sets = ARRAY_SIZE(smdk_nand_sets),.sets = smdk_nand_sets,;/* devices we initialise */ 最后将nand flash 设备加入到系统即将注册的设备集合中。 static struct platform_device _initdata *smdk_devs = &s3c_device_nand,&smdk_led4,&smdk_led5,&smdk_led6,&smdk_led7,;然

22、后通过smdk_machine_init()函数,调用设备添加函数platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs) 完成设备的注册。具体过程参见系统初始化的相关部分。5. 系统初始化5.1. 系统初始化的主干线Start_kernel() setup_arch() reset_init() kernel_thread(init ) init() do_basic_setup() driver_init() do_initcall()Start_kernel()函数负责初始化内核各个子系统,最后调用reset_init(),启动一个叫做i

23、nit的内核线程,继续初始化。Start_kernel()函数在init/main.c中实现。asmlinkage void _init start_kernel(void)char * command_line;extern struct kernel_param _start_param, _stop_param;smp_setup_processor_id();/* Need to run as early as possible, to initialize the* lockdep hash:*/lockdep_init();local_irq_disable();early_boo

24、t_irqs_off();early_init_irq_lock_class();/* Interrupts are still disabled. Do necessary setups, then* enable them*/lock_kernel();boot_cpu_init();page_address_init();printk(KERN_NOTICE);printk(linux_banner);setup_arch(&command_line); /setup processor and machine and destinate some pointers for do_ini

25、tcalls() s 5、浅谈分析Arm linux 内核移植及系统初始化的过程 咨询QQ:313807838/ for example init_machine pointer is initialized with smdk_machine_init() , and /init_machine() is called by customize_machine(), and the is processed by /arch_initcall(fn). Therefore smdk_machine_init() is issured. by edwinsetup_per_cpu_areas(

26、);smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */* Set up the scheduler prior starting any interrupts (such as the* timer interrupt). Full topology setup happens at smp_init()* time - but meanwhile we still have a ing scheduler.*/sched_init();/* Disable preemption - early bootup schedulin

27、g is extremely* fragile until we cpu_idle() for the first time.*/preempt_disable();build_all_zonelists();page_alloc_init();printk(KERN_NOTICE Kernel command line: %s/n, saved_command_line);parse_early_param();parse_args(Booting kernel, command_line, _start_param,_stop_param - _start_param,&unknown_bootoption);sort_main_extable();unwind_init();trap_init();rcu_init();init_IRQ();pidhash_init();init_timers();hrtimers_init();softirq_init(

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1