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

实验楼-第四周作业

跟踪分析 Linux 内核的启动过程

1、启动实验楼内核

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

打开QEMU并启动Linux内核,其中-s 使得启动QEMU时自动开启一个GDB服务器,并允许通过GDB 1234接口连接到QEMU实例

-S选项使 QEMU 在启动时暂停 CPU 的执行,等待 GDB 的连接。可以使用 GDB 的 continue 命令来继续执行 CPU,允许我们在调试器中事先设置好断点

如图所示,内核启动后被冻结,等待GDB连接

2、通过GDB连接内核进程

3、调试Linux内核启动进程

(1)设置调试断点

在启动内核进程前,设置关键函数的断点,查看函数所属的进程部分和相关功能,以及函数的执行频率

(2)continue执行内核启动进程

1*初始化体系结构,完成架构相关的初始化,设置内存映射、初始化 CPU

2*初始化时钟和时间管理系统

3*内存管理系统初始化

4*中断系统初始化

5*进程调度系统初始化

6*其他核心子系统初始化

在rest_init 函数中,设置断点break kernel_thread、break kernel_init

Kernel_init完成了一些额外的初始化工作,并最终启动用户态的 init 进程

4、总结

start_kernel:核心的硬件初始化和内核子系统初始化。

setup_arch:架构相关的硬件初始化。

mm_init:内存管理系统的初始化。

sched_init:进程调度器初始化。

rest_init:启动内核线程和 init 进程。

kernel_init:加载用户空间的 init 程序,完成最终初始化。

5、问题

1&Kernel_thread函数执行频率:

在通过GDB对Linux内核启动进行调试的过程中,针对Kernel_thread 的断点多次触发,最后不得不删除了该断点检测:

内核启动初始化过程中,kernel_thread 函数多次执行的主要目的是为系统创建并初始化多个内核线程,以满足系统运行的不同需求。内核线程需要面临初始化系统服务中的多个并发处理需求,此在内核启动服务中起到了比较底层的支撑作用,导致了kernerl_thread需要多次执行以满足后续服务的需要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值