《Linux内核原理与分析》第四周作业
一、启动menu程序
在实验楼的配置环境打开shell,内核启动完成后将进入menu程序
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

二、调试跟踪内核
在shell中输入以下命令
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# 关于-s和-S选项的说明:
# 1. -S
# -S freeze CPU at startup (use ’c’ to start execution)
# 2. -s
# -s shorthand for -gdb tcp::1234
# 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

打开另一个shell窗口,使用gdb 跟踪调试内核
# 打开 GDB 调试器
$ gdb
# 在 GDB 中输入以下命令:
# 在gdb界面中targe remote之前加载符号表
(gdb)file linux-3.18.6/vmlinux
# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)target remote:1234
# 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel

断点设置后,输入c,继续运行程序,程序将在start_kernel处暂停

使用list,查看start_kernel()函数上文代码

再在函数rest_init处设置一个断点,输入c继续运行

使用list查看断点rest_init附近代码

总结
start_kernel 是 Linux 内核的入口点之一,位于 init/main.c 中。它的主要任务是初始化系统的硬件和数据结构,最终启动 init 进程。可以通过设置断点 b start_kernel 来观察内核启动的早期阶段。
rest_init 函数,负责启动系统中的两个最核心的进程:
1、idle 进程(进程号0):
- 这是内核调度器的初始进程,专门在系统空闲时运行。在 SMP 系统中,它会为每个 CPU 创建一个
idle进程。 cpu_idle是这个进程的主要函数,它让 CPU 进入低功耗状态,等待调度新任务。
2、init 进程(进程号1):
kernel_thread函数在此处用于创建init进程。init进程是用户空间的第一个进程,它最终会从磁盘加载用户空间的init可执行文件(通常是/sbin/init或/bin/init)。
在 GDB 中可以通过断点 b kernel_init 来跟踪 init 进程的创建过程。
Linux 内核的启动过程可以概括为:
1、start_kernel 阶段:
- 系统从硬件启动开始,通过 BIOS 或者 UEFI 加载内核映像。
start_kernel负责初始化系统架构、内存管理、调度器、中断系统等核心功能。
2、rest_init 阶段:
- 内核创建两个重要的进程:
idle进程(进程0)和init进程(进程1)。 idle进程是调度器空闲时运行的进程,它负责在系统没有其他任务时让 CPU 进入空闲状态。
3、init 进程启动:
init进程是系统启动过程中最重要的用户空间进程。它负责加载和启动其他系统服务和守护进程。init进程的进程号为 1,是所有用户空间进程的祖先。
4、idle 进程:
idle进程是 CPU 空闲时的默认进程,它通过cpu_idle函数在系统调度中循环运行。
总结而言,Linux 系统的启动过程首先通过 start_kernel 完成硬件初始化,创建 idle 进程和 init 进程,并最终启动用户空间的初始化进程(/sbin/init)。idle 进程作为调度器的空闲任务,而 init 进程作为所有用户进程的父进程。
219

被折叠的 条评论
为什么被折叠?



