2020-2021-1 20209302毕慧敏《Linux内核原理与分析》第四周作业

第四周作业

一、实验楼实验三

使用qemu运行内核,并用gdb跟踪调试内核从start_kernel到init进程启动

1.实验过程:启动实验楼Linux系统和一个简单的文件系统。

2.跟踪调试内核的启动过程

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 

-S可以使内核暂时冻结

3.另外开一个窗口,用gdb跟踪调试内核,用1234这个端口与gdbserver进行连接,并且从start_kernel设置断点进行单步调试。

 

 

在rest_init处设置一个断点,单步执行完后内核启动

二、本周知识小结

1.-s和-S的区别:

  -s:在1234端口上创建一个gdb-server

  -S:CPU初始化之前冻结起来

2.可以用list来查看函数详情。

3.gdb调试中s和n的区别:

  s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
  n: 执行一行源程序代码,此行代码中的函数调用也一并执行。

4.start_kernel函数:

  main.c中没有main函数,start_kernel()相当于C语言中的main函数,是一切的起点,在此函数被调用之前内核代码主要是用汇编语言写的。

  init_task变量相当于第一个进程的PCB

  trap_init()实现中断向量的初始化

  mm_init()实现内存管理的初始化

  sched_init()实现调度模块的初始化

5.rest_init():

  rest_init是0号进程,它创建了1号进程init和其他一些服务进程,它能够实现后续的初始化工作,正式执行内核线程和其他服务进程。

 

posted @ 2020-11-01 20:27  20209302毕慧敏  阅读(104)  评论(0编辑  收藏  举报