Linux内核分析实验三----跟踪分析Linux内核的启动过程

时间:2023-12-09 13:40:43

一、Linux内核源代码介绍

1、根目录

arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码。

init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点)。

ipc:进程间通信

kernel:Linux内核的核心代码

关注readme文件

二、构造一个简单的Linux系统MenuOS

1、在实验楼环境下:

cd LinuxKernel/

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

即可启动内核,完成后进入menu程序,支持三个命令help、version和quit。

2、使用自己的Linux系统环境搭建MenuOS的过程

# 下载内核源代码编译内核

cd ~/LinuxKernel/

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz

xz -d linux-3.18.6.tar.xz

tar -xvf linux-3.18.6.tar(解压)

cd linux-3.18.6

make i386_defconfig

make # 一般要编译很长时间,少则20分钟多则数小时

# 制作根文件系统

cd ~/LinuxKernel/

mkdir rootfs

git clone https://github.com/mengning/menu.git  # 如果被墙,可以使用附件menu.zip

cd menu

gcc -o init linktable.c menu.c test.c -m32 -static –lpthread(init是第一个用户态进程,是1号进程,采用的是静态编译的方式)

cd ../rootfs

cp ../menu/init ./

find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img(img镜像文件)

# 启动MenuOS系统

cd ~/LinuxKernel/

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

3、重新配置编译Linux使之携带调试信息

(1)在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息

kernel hacking—>

[*] compile the kernel with debug info

(2)make重新编译(时间较长)

4、使用gdb跟踪调试内核

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:

# -S freeze CPU at startup (use ’c’ to start execution)

# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口

gdb

(gdb)file linux-3.18.6/vmlinux # 在gdb界面中target remote之前加载符号表    file home/shiyanlou/LinuxKernel/vmlinux

(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

三、跟踪调试Linux内核

Linux内核分析实验三----跟踪分析Linux内核的启动过程

Linux内核分析实验三----跟踪分析Linux内核的启动过程

Linux内核分析实验三----跟踪分析Linux内核的启动过程