2020-2021-1 20209307《Linux内核原理与分析》第四周作业
一、Linux内核源代码简介
1、计算机三大法宝
存储程序计算机
函数调用堆栈
中断机制
2、操作系统两把宝剑
中断上下文的切换
进程上下文的切换
3、函数目录
Linux-3.18.6/arch/x86
内核启动相关的代码基本都存在init目录中。
start_kernel函数相当于普通C程序的main函数。
Linux内核的核心代码在kernel目录中。
二、实验三:跟踪分析Linux内核的启动过程
构造一个简单的Linux系统MenuOS,使用如下命令打开MenuOS
cd ~/LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
完成了一个简单的内核搭建后使用gdb进行调试
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
gdb (gdb)file linux-3.18.6/vmlinux (gdb)target remote:1234 #用1234端口进行连接 (gdb)break start_kernel #断点的设置为内核启动的起点
按c键继续执行到start_kernel()函数,然后我们可以使用list命令查看停止断点的源代码。
再设置一个断点rest_init,重复上述操作
三、简单分析一下start_kernel
在init目录下的main.c中,全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程,不管分析内核的哪一部分都会涉及到start_kernel。
trap_init();初始化中断向量
mm_init();内存管理模块
sched_init();系统调度模块
start_kernel中的最后一句是rest_init,内核启动完成后,有一个call_cpu_idle,当系统中没有进程需要执行时就调用idle进程,rest_init是0号进程,它创建了1号进程init和其他的一些服务进程。
main.c中没有main函数,start_kernel()相当于C语言中的main函数,是一切的起点,在此函数被调用之前内核代码主要是用汇编语言写的,完成初始化工作。