邵帅 原创作品转载请注明出处 《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大法好!