Linux内核分析 实验三:跟踪分析Linux内核的启动过程

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

 一. 实验过程shell

一、打开shell,输入启动指令,内核启动完成后进入menu程序,支持三个命令help、version和quit。bash

二、而后使用gdb跟踪调试内核,输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 网络

三、按住Ctrl+ALt键打开一个新的Shell窗口,并输入如下代码。函数

  1. gdb
  2. (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote以前加载符号表
  3. (gdb)target remote:1234 # 创建gdb和gdbserver之间的链接,按c 让qemu上的Linux继续运行
  4. (gdb)break start_kernel # 断点的设置能够在target remote以前,也能够在以后

将break 放在start处输入C ,观察qemu学习

输入list能够查看断点附近的代码。ui

查看linux-3.18.6的内核代码。这里有不少个文件目录。spa

其中arch包括了所支持的多种CPU体系结构,这里咱们只关内心面的x86文件夹就行了。操作系统

其余还有如drivers为驱动相关代码。fs为文件系统相关内核代码,ipc是进程相关代码,mm是存储管理代码,net是和网络相关的内核代码等等。、3d

init为初始化相关的模块,在init/main.c/start_kernel中以后开始C代码的操做系统初始化,最后执行第一个用户态进程init。。

在start_kernel函数中能够看到不少_init相关函数,涉及到操做系统启动相关的多种初始化操做。

这里的init_task为至关于0号进程的pcb。   还有sched_init();为进程调度相关初始化。trap_init();为中断相关的内核代码。等等。

这里看到start_kernel 最后一句 rest_init().

当操做系统为空闲时,就会执行这个idle程序。

 

总结:

浅入的学习了xLinux内核的启动过程。

学习了gdb的操做使用。

x86 CPU启动的第一个动做CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,由于16位CPU有20根地址线),即BIOS程序的位置。BIOS例行程序检测完硬件并完成相应的初始化以后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。引导程序BootLoader开始负责操做系统初始化,而后起动操做系统。启动操做系统时通常会指定kernel、initrd和root所在的分区和目录。内核启动过程包括start_kernel以前和以后,以前所有是作初始化的汇编指令,以后开始C代码的操做系统初始化,最后执行第一个用户态进程init。通常分两阶段启动,先是利用initrd的内存文件系统,而后切换到硬盘文件系统继续启动。

相关文章
相关标签/搜索