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

  • Linux内核启动过程
  • 首先打开并冻结实验提供的Linux系统,并开启端口来调试。
  • cd LinuxKernel/
  • qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
  • 然后在另一个shell里打开gdb进行内核的跟踪
  • gdb
  • (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
  • (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  • 设置断点
  • (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
  • 内核的启动由start_kernel函数开始
  • 查看代码具体位置
  • (gdb)list
  • start_kernel函数创建了一个全局变量init_task,即创建了PCB,其中的0号进程为idle进程
  • 然后start_kernel函数继续进行硬件初始化
  • 然后在start_kernel函数尾部调用rest_init函数
  • 这里的rest_init就是0号进程(idle进程)
  • rest_init函数中执行了kernel_thread(kernel_init,NULL,CLONE_FS)
  • 其中的kernel_init中有run_init_progress,这里initi进程即1号进程被启动
  • 然后rest_init函数中执行了pid=kernel_thread(kthreadd,NULL,CLONE_FS | CLONE_FILES)
  • 这里的kthreadd为所有内核线程的祖先,可称为2号进程
  • 至此系统就完成启动