李亚健 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、实验过程:
实验内容为使用gdb跟踪调试内核从start_kernel到init进程启动
1.根据实验指导按照过程,在实验楼环境下打开shell:
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
输入help指令:
2.使用gdb跟踪调试内核:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
3.另开一个shell窗口,输入gdb指令:
设置断点:
4.输入list指令:
二、分析start_kernel函数的执行过程
start_kernel( )函数完成了Linux内核的初始化工作。每个内核部件都是用这个函数进行初始化的。
1.调用sched_init()函数来初始化调度程序
2.调用build_all_zonelists()函数俩初始化内存管理
3.调用page_alloc_init()函数来初始化伙伴系统分配程序
4.调用trap_init()函数和init_IRQ()函数以初始化IDT
5.调用softing_init()函数初始化TASKLET_SOFTIRQ和HI_SOFTIRQ(软中断)
6.调用time_init()初始化系统日期时间
7.调用kmem_cache_init()函数初始化slab分配器(普通和高速缓存)
8.调用calibrate_delay()函数用于确定CPU时钟(延迟函数)
9.调用kernel_thread()函数为进程1创建内个线程,这个内核线程又会创建其他的内核线程并执行/sbin/init程序
10.在start_kernel()开始执行之后会显示linux版本,除此之外,在init程序和内核线程执行的最后阶段还会显示很多其他信息。最后,就会在控制台上出现熟悉的登陆提示,通知用户Linux内核已经启动正在运行。
三、对“Linux系统启动过程”的理解。