ARM linux的启动部分源代码简略分析
S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io = mini2440_map_io,
.init_machine = mini2440_init,
.init_irq = s3c24xx_init_irq,
.timer = &s3c24xx_timer,
MACHINE_END
然后,machine_desc结构体的name成员的值被赋给全局变量machine_name。
第681行,若bootloader没有传递tag列表给内核,则检测machine_desc结构体的boot_params字段,看看特定的平台是否传递了标记列表。
第730、731、732行分别将machine_desc结构体的init_irq、timer和init_machine成员值赋给了三个全局变量init_arch_irq、system_timer和init_machine,即是设置特定体系结构的指针。初始化的后面阶段自然会用到。
start_kernel()函数调用同文件下的rest_init(void)函数,rest_init(void)函数调用 kernel_thread()函数以启动第一个核心线程,该线程执行kernel_init()函数,而原执行序列会调用cpu_idle(),等待调度。
作为核心线程的kernel_init()函数继续完成一些设置,并在最后调用同文件下的init_post()函数,而该函数挂在根文件系统,打开/dev/console设备,重定向stdin、stdout和stderr到控制台。之后,它搜索文件系统中的init程序(也可以由“init=”命令行参数指定init程序),并使用run_init_process()函数执行init程序。(事实上,run_init_process()函数又调用了kernel_execve()来实际执行程序)。搜索init程序的顺序为/sbin/init、/etc/init、/bin/init、和/bin/sh。在嵌入式系统中,多数情况下,可以给内核传入一个简单的shell脚本来启动必需的嵌入式应用程序。
至此,漫长的Linux内核引导和启动过程就结束了,而kernel_init()对应的由rest_init(void)函数创建的第一个线程也进入用户模式。
参考文献:
arm 嵌入式LINUX启动过程:
http://blog.ednchina.com/yujiebaomei/4153/message.aspx
http://www.cnblogs.com/bluepointcq/articles/490954.html
ARMlinux启 相关文章:
- ARM Linux 更新启动画面(11-21)
- ARM Linux启动分析headarmv.S内幕(11-09)
- arm linux 启动流程(11-09)
- ARM Linux 的启动过程(11-09)
- arm linux 启动流程之 进入内核(11-09)
- ARM Linux启动代码分析(11-09)