跟踪分析Linux内核的启动过程小解

跟踪分析Linux内核的启动过程

“20135224陈实  + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

进入相应文件夹,用qemu虚拟机开启内核kernel参数后内容文件

(img根据视频是个镜像文件,个人理解应该是硬件模拟器之类的)

 

 

利用GDB调试内核,对于GDB常用命令可以参考以往资料:http://www.cnblogs.com/chuishi/p/4841231.html

设置断点(break)展示视屏中的2个函数(trap_init中的start——kernel ,rest_init):

一些实验中的知识点:

引用相关文字论述:

计算机的启动过程概述x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置。http://wenku.baidu.com/view/4e5c49eb172ded630b1cb699.htmlBIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。这里一般是把硬盘的第一个扇区MBR和活动分区的引导程序加载到内存(即加载BootLoader),加载完整后把控制权交给BootLoader。引导程序BootLoader开始负责操作系统初始化,然后起动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录,比如root (hd0,0),kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4M.img内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。

initrd文件的功能主要有两个:1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules) 2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去

总结

引用原话:道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)

总的来说,就是通过先找到开始内核最原始的启动函数将要启动的各项必要进程装载好,然后对用户开放第一个用户态进程,也就是1号进程,再由1号进程去调度其他的线程或者进程,这样通过先启动1个进程来实现全部功能调度的方式符合我们思维处理模式,可以很好地利用资源与再现良好局部性的特点

posted @ 2016-03-12 16:09  20135224陈实  阅读(307)  评论(1编辑  收藏  举报