原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
Linux启动过程:
启动第一步--加载BIOS
启动第二步--读取MBR
启动第三步--Boot Loader
启动第四步--加载内核
启动第五步--用户层init依据inittab文件来设定运行等级
启动第六步--init进程执行rc.sysinit
启动第七步--启动内核模块
启动第八步--执行不同运行级别的脚本程序
启动第九步--执行/etc/rc.d/rc.local
启动第十步--执行/bin/login程序,进入登录状态
打开实验楼的shell,输入:
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
就会出现如下内容:
在Linux-3.18.6版本中,我们会看到以下几个目录:
arch包括了所有和体系结构相关的核心代码
COPYING下是GPL版权申明
CREDITS下是光荣榜。对Linux做出过很大贡献的一些人的信息。
documentation下是一些文档,没有内核代码,可惜都是English的,是对每个目录作用的具体说明。
drivers中是系统中所有的设备驱动程序。
fs存放Linux支持的文件系统代码和各种类型的文件操作代码。
include包括编译核心所需要的大部分头文件。
init包含核心的初始化代码(不是系统的引导代码)。
ipc包含了核心进程间的通信代码。
Kernel内核管理的核心代码。
MAINTAINERS存放了维护人员列表,对当前版本的内核各部分都有谁负责。
Makefile第一个Makefile文件。
mm包含了所有独立于 cpu 体系结构的内存管理代码。
modules存放了已建好的、可动态加载的模块文件目录,是个空目录,用于存放编译时产生的模块目标文件。
net里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
ReadMe里是核心及其编译配置方法简单介绍
REPORTING-BUGS里是有关报告Bug 的一些内容
Rules.make里是各种Makefilemake所使用的一些共同规则
scripts包含用于配置核心的脚本文件等。
gdb调试内核
start_kernel启动分析
1、lockdep_init():初始化内核依赖关系表,初始化hash表
2、boot_init_stack_canary():为栈增加保护机制,预防一些缓冲区溢出之类的攻击
3、tick_init():初始化内核时钟系统
4、boot_cpu_init():激活当前CPU
5、setup_arch():对不同体系结构的CPU设置不同的参数、选项等
6、trap_init():初始化硬件中断,函数中设置了很多中断门
7、mm_init():建立内核的内存分配器
8、sched_init():初始化任务调度
9/init_IRQ():中断向量的初始化