跟踪分析Linux内核的启动过程
实验3:跟踪分析Linux内核的启动过程
姓名:李冬辉
学号:20133201
注: 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
【计算机三个法宝】
1)存储程序计算机
2)函数调用堆栈
3)中断
【操作系统两把宝剑】
1)中断上下文的切换:保存现场和恢复现场
2)进程上下文的切换
Linux内核源代码简介
- arch/ 支持不同cpu的源代码
- Documentations/ 文档存储
- init/ 内核启动相关代码
- kenerl/ 进程调度相关代码
- ipc/ 进程间通信
- lib/ 公共库文件
- mm/ 内存管理相关的代码
实验步骤
1.使用实验楼的虚拟机打开shell并输入命令cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
观察menuOS 运行。
2.在menuOS中使用自带的3个命令,观察效果。
3.使用gdb调试观察start_kernel。
4.使用gdb调试观察init。
三、总结
idle是一个进程,其pid号为 0。其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。每个处理器单元有独立的一个运行队列,而每个运行队列上又有一个idle进程,即有多少处理器单元,就有多少idle进程。
加载linux内核开始运行后,进程开始执行start_kernel()完成Linux内核的初始化工作。包括初始化页表,初始化中断向量表,初始化系统时间等。继而调用
fork(),创建第一个用户进程:
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); 这个进程就是着名的pid为1的init进程,它会继续完成剩下的初始化工作,然后execve(/sbin/init),
成为系统中的其他所有进程的祖先。这就是我们看到的init进程,进程号为1。初始化的最后linux调用scheule()整个系统就运行起来了。可以用进程查看命令来验证
# ps aux 。