第四周作业

本文详细介绍了在Linux环境下从下载内核源代码开始,经过编译、制作根文件系统直至启动内核的过程,并利用gdb进行调试跟踪,深入探讨了内核启动的关键步骤。

跟踪分析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目录下。
1249774-20171024213145519-1157329241.png

2 进行编译,使用命令make i386_defconfig(这个命令还没弄明白)以及make ,编译的是32位的x86体系结构,编译内核结束
1249774-20171024213513723-2037291460.png
3 制作根文件系统 使用命令 mkdir rootfs,制作根文件系统创建一个目录用于存放根文件系统,git clone https://github.com/mengning/menu.git,这一步是将menu从gitthub上克隆下来,由于电脑上没有下载git,,使用命令sudo apt install git 进行下载
1249774-20171024214319723-1332789469.png
1249774-20171024214844973-1576345735.png

使用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中,(过程中有一个失误就是把命令打错了,所以出现了没有那个文件或目录)
1249774-20171024215323473-1211717697.png
1249774-20171024215824926-463451950.png
使用命令find . | cpio -o -H newc |gzip -9 > ../rootfs.img,系统启动后会默认启动1号进程init进程,使用cpio方式将rootfs下的所有文件打包成rootfs.img,成为一个镜像文件。则根文件系统的镜像已经完成
1249774-20171024220817410-301458888.png
4 启动,使用命令 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img进行启动,由于我Linux没有安装qemu,在输入命令是显示没有找到该命令使用命令sudo apt-get install qemu,但是不知道为什么依然不可以。于是我使用实验楼完成了以下操作。
1249774-20171024221059254-1621503724.png
二、进入内核根文件系统
输入命令 cd LinuxKernel进入LinuxKernel目录,再通过qemu -kernel linux-3.18.6/arch/x86/bzImage -initrd rootfs.img进行启动,指定内核的bzImag,指定initrd,意思就是指明一个根文件系统,根文件系统为rootf.imag。内核启动加载了根文件系统,那么根文件系统中的可执行文件img执行。
1249774-20171024221218457-314263500.png
三、用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进行调试。
1249774-20171024221249863-216539108.png
所以我们打开另外一个窗口, 进入~/LinuxKernel 目录,然后输入gdb回车。
1249774-20171024221816410-835006508.png
使用命令file linux-3.18.6/vmlinux,在gdb界面中将内核镜像表加载进来,令然后输入target remote:1234 连接gdb,但是不知道为什么一直显示连接超时
1249774-20171024222048223-324515593.png
在内核启动的起点设置一个断点,命令为 break start_kernel,没有出现代码。。。因此在使用命令c时也显示没有被运行。
1249774-20171024222408598-1776422146.png
1249774-20171024222420832-2030350940.png

转载于:https://www.cnblogs.com/2017yaya/p/7726216.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值