跟踪分析Linux内核的启动过程
一、1 在自己安装的Linux环境下先下载内核源代码,使用命令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解压tar.xz文件(命令中具体的xz 等还没弄懂),使用cd进入linux-3.18.6目录下。
2 进行编译,使用命令make i386_defconfig(这个命令还没弄明白)以及make ,编译的是32位的x86体系结构,编译内核结束
3 制作根文件系统 使用命令 mkdir rootfs,制作根文件系统创建一个目录用于存放根文件系统,git clone https://github.com/mengning/menu.git,这一步是将menu从gitthub上克隆下来,由于电脑上没有下载git,,使用命令sudo apt install git 进行下载
使用cd 进入menu系统,使用命令gcc -o init linktable.c menu.c test.c -m32 -static –lpthread意义是用gcc进行编译成一个32位静态的,lpthread是表示要连接到pthread的库这里省略了lib,使用命令cd ../rootfs,其中..表示当前目录的上级目录。使用命令cp ../menu/init ./把init拷贝到rootfs中,(过程中有一个失误就是把命令打错了,所以出现了没有那个文件或目录)
使用命令find . | cpio -o -H newc |gzip -9 > ../rootfs.img,系统启动后会默认启动1号进程init进程,使用cpio方式将rootfs下的所有文件打包成rootfs.img,成为一个镜像文件。则根文件系统的镜像已经完成
4 启动,使用命令 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img进行启动,由于我Linux没有安装qemu,在输入命令是显示没有找到该命令使用命令sudo apt-get install qemu,但是不知道为什么依然不可以。于是我使用实验楼完成了以下操作。
二、进入内核根文件系统
输入命令 cd LinuxKernel进入LinuxKernel目录,再通过qemu -kernel linux-3.18.6/arch/x86/bzImage -initrd rootfs.img进行启动,指定内核的bzImag,指定initrd,意思就是指明一个根文件系统,根文件系统为rootf.imag。内核启动加载了根文件系统,那么根文件系统中的可执行文件img执行。
三、用gdb进行调试跟踪,
运用命令qemu -kernel linux-3.18.6/arch/x86/bzImage -initrd rootfs.img -s -S启动内核,其中-S目的是在CPU初始化前将其冻结,-s指在gdb tcp::1234创建了一个gdbserver.这个命令使得我们可以通过tcp的1234端口连接gdb进行调试。
所以我们打开另外一个窗口, 进入~/LinuxKernel 目录,然后输入gdb回车。
使用命令file linux-3.18.6/vmlinux,在gdb界面中将内核镜像表加载进来,令然后输入target remote:1234 连接gdb,但是不知道为什么一直显示连接超时
在内核启动的起点设置一个断点,命令为 break start_kernel,没有出现代码。。。因此在使用命令c时也显示没有被运行。