从start_kernel到init

来源:互联网 发布:rs232c vb 编辑:程序博客网 时间:2024/05/21 11:08

邵帅 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


文件夹架构

arch:支持不同的CPU的源代码,其中的关键目录包括:Documentation、drivers、firewall、fs、include等

documentation:文档目录

fs:文件系统

init:内核启动相关的代码main.c、Makefile等基本都在该目录中。(main.c中的start_ kernel函数是Linux内核启动的起点,即初始化内核的起点)

kernel:Linux内核核心代码在kernel目录中。

lib:公用的库文件 mm:内存管理的代码 scripts:与脚本相关的代码

security:与安全相关的代码

sound目录:与声音相关的代码

tools目录:与工具相关的代码

net:与网络相关的代码

readme:介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等


 

调试内核     

       使用实验楼,用gdb进行跟踪调试内核,按照老师给的命令,首先我把断点打在start_kernel()。

       在这里BootLoader开始进行系统初始化,然后就到start_kernel()这里,在这里开始使用C语言实现全部功能。在start_kernel()函数中,将系统需要的功能进行初始化,例如RCU,时钟,哈希表等等。最后,调用了rest_init(),进行接下来的初始化。然后我把断点打在rest_init()函数处。

       可以看到显示的是start_kernel()中各种初始化信息,在rest_init()中调用kernel_thread()函数,启动内核线程,在之后的schedule()函数idle进程释放占用的cpu,把cpu给更需要的进程,最后在调用cpu_idle(),让cpu继续进入idle状态,idle进程像一个大循环,把空闲的cpu占用,分配给idle进程,把空闲进程调度给需要的进程。

         关键在kernel_thread()函数,这个函数中对设备驱动进行初始化,并且最后用init_post()进入用户空间的初始化进程,在init_post()函数中,内核进行最后的初始化,将之前的init函数和数据舍弃,释放内存,给其他进程用,最后调用consle,整个初始化结束。


总结

         整个内核初始化一步扣着一步,代码十分简洁干净,令人不禁顶礼膜拜。Linux大法好!

1 0
原创粉丝点击