微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM linux的启动部分源代码简略分析

ARM linux的启动部分源代码简略分析

时间:11-09 来源:互联网 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top