内核启动流程分析(基于韦东山视频修改)
来源:互联网 发布:php空间销售系统源码 编辑:程序博客网 时间:2024/05/10 11:38
内核启动流程分析(基于韦东山视频修改)
内核代码启动流程:内核首先运行arch/arm/kernel/head.S
第一阶段
Head.s函数
1. 确认CPU ID
S3C2410 CPU ID为0x41129200
如果CPU ID & 掩码 = 0x41009200 ,则审核通过
如果错误会发生“p error”
2. 确认开发板型号
在arch/arm/tools/mach-types 记录了各个arm开发板的编号,对应三星的smdk2410的编号为193
如果匹配会发生“a error”
3. 建立页表
4. 启动mmu
5. 清bss段,复制数据段,设置栈指针(为调用C函数做准备)
第二阶段
6. 调用start_kernel函数init/main.c(内核的第一个C函数,详细调用关系见附录1)
(1)打印版本信息
(2)setup_arch和setup_commndline(处理uboot传入内核的启动参数)
(3)console_init (初始化控制台)
(4)其他系列初始完成后,调用reset_init
7. rest_init函数中调用关系如下
kernel_init函数
->prepare_namespace函数
-> mount_root()函数 //挂接根文件系统
->(1)打开三个文件(标准输入,标准输出,标准出错)open(dev/consle) sys_dup(0) sys_dup(0)
->Init_Post函数 //执行应用程序
8. init_post函数
(2)运行第一个应用程序(一般是linuxrc ,而linuxrc是指向busybox的链接,所以其实运行的第一个程序就是busybox,见附录3
9. Busybox的运行
busybox调用的第一个函数就是init_main,在这个函数中完成了三项工作:
1应用程序配置文件读取
2.解析应用程序配置文件
3.执行用户应用程序
详细的调用关系如下:
Busybox->init_main
->Parase_inittab
->File=fopen(INITTAB,”r”);//打开配置文件,见附录2
->执行一些列new_init_action函数(1.创建一个init_action结构2.把这个结构放入init_action_list链表,这个时候只是得到链表,并没有开始执行)
->run_actions(SYSINIT)//执行sysint类的程序
->run_actions(WAIT)
->run_actions(ONCE)
While(1)
{
-> run_actions(RESPAWN)
-> run_actions(ASKFIRST)
}//注意:其他类型的执行时机是当用户给init进程发送信号时,用信号处理函数调用的(例如shutdown)
至此内核启动完毕,等待用户输入#......................................................................
OYEAH!
从内核的启动过程分析得出,最小的根文件系统必须包含:
1. dev/console dev/null
2. 来源于busybox的sbin/init
3. 应用程序配置文件/etc/inittab
4. 配置文件指定的应用程序(例如bin/sh)
5. c库的支持
linuxrc ->/etc/inittab
->/etc/init.d/rcs
->/usr/etc/rc.local //可以在里面定义用户应用程序
->/etc/profile/
附录1start_kernel相关调用关系:*************************************************
图片无法上传
附录2************************************************************************
在inittab中规定了那些应用程序可以执行,存放了各个应用程序的配置文件,格式如下:
Id:runlevel:action:process
其中的action:代表程序执行的时机
Process:代表应用程序或脚本
在内核代码中规定了默认的配置文件,解析后如下:
图片无法上传
而执行时机的话有以下几种
图片无法上传
附录3 initpost关于调用linuxrc的代码********************************
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING"Failed to execute %s. Attempting"
"defaults.../n",execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
在bootagrs中设定了init=linuxrc,所以一般只执行run_init_process(execute_command);,后面的就没有机会执行了,如果没有指定execute_command,那么才依次执行后面的run_init_process,如果全部没有找到,内核就Panic啦!
- 内核启动流程分析(基于韦东山视频修改)
- 内核启动流程分析(基于韦东山视频修改)
- 韦东山视频学习----内核启动流程分析之配置
- 韦东山视频---内核启动流程之编译体验学习
- 韦东山第10课-内核启动流程makefile分析
- (视频)xawtv应用程序启动代码分析-----韦东山笔记
- 韦东山第10课-内核启动
- 基于ok6410的韦东山驱动视频简要分析--lcd驱动
- 基于ok6410的韦东山驱动视频简要分析--ts驱动
- 基于ok6410的韦东山驱动视频简要分析--USB驱动 .
- 内核启动流程分析
- 内核启动流程分析
- 内核启动流程分析
- Linux内核启动流程分析(二)
- 基于MIPS(LOOGSON)架构LINUX内核启动流程源代码分析(一)--kernel_entry
- 嵌入式Linux启动流程之启动内核(基于Arm)
- 驱动浅析(观看韦东山视频)
- 学习韦东山视频心得(一)
- TCP/IP SOCKET HTTP
- bochs的检测我一下子没领悟过来
- [StoryToolKit]第一个demo
- PRINTF()输出格式控制
- c++中字符数组与字符串的转换
- 内核启动流程分析(基于韦东山视频修改)
- 使用二维指针,实现单位矩阵(z)
- taffy DB笔记
- 单片机模块化编程
- C#求解阶乘(递归、非递归版本)+冒泡排序算法
- 雅虎团队经验:网站页面性能优化的34条黄金守则
- 电话号码
- 解决xmlHttp.responseText显示的全部是HTML
- Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2