一、下载Linux内核源代码
下载网址为:https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
然后将压缩包拷贝到home目录下,使用下述命令解压得到tar包
xz -d linux-5.0.1.tar.xz
接下来解压tar得到Linux-5.0.1文件夹
tar -xvf linux-5.0.1.tar
二、安装内核编译工具
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
三、配置编译内核
1、生成64位x86的配置文件
make x86_64_defconfig
2、开启文本菜单选项
make menuconfig
在出现图形界面中 依次选择Kernel hacking,Compile-time checks and compiler options,[*]Compile the kernel with debug info再选定Save。然后逐步选定Exit,直到退出该界面。
3、最后在linux-5.0.1内核目录下编译内核,执行make命令。
四、通过QEMU虚拟机加载内核
1、首先要下载安装QEMU
sudo apt install qemu qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage
2、构造MenuOS
git clone https://github.com/mengning/menu.git cd menu sudo apt-get install libc6-dev-i386 #在64位环境下编译32位需安装
在make rootfs之前先修改Makefile文件,将
qemu -kernel ../linux-3.0.16/arch/x86/boot/bzImage -initrd ../rootfs.img
修改为
qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img
编译以后,MenuOS启动成功在能看到如下界面
五、测试MenuOS上可以实现TCP客户端和服务器发送和接收hello/hi
1、把程序集成到MenuOS上
先将代码下载到MenuOS上
git clone https://github.com/mengning/linuxnet.git
首先集成服务器端,
cd ./linuxnet/lab2 make
然后集成客户端,需要修改一下lab3下Makefile的内容,将:
qemu -kernel ../../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img
修改为:
qemu-systtem-x86_64 -kernel ../../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img
然后对Lab3进行make,最后在menu文件下make rootfs把它集成到MenuOS中,完成之后我们就可以在MenuOS中进行测试
2、MenuOS测试
在QEMU下输入如下命令:
Replyhi Hello
出现下图所示则代表网络正常
六、GDB进行内核代码跟踪
首先,修改menu目录下的Makefie文件
qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img
将其修改为:
qemu -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img -append nokaslr -s -S
然后建立gdb与gdbserver之间的连接,打开一个新的命令行窗口,执行 gdb 指令,进入调试
file ~/LinuxKernel/linux-5.0.1/vmlinux # # 在gdb界面中targe remote之前加载符号表 break start_kernel # 断点的设置可以在target remote之前,也可以在之后 target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行 c #按c 让qemu上的Linux继续运行 list #输入list指令可以查看断点处的代码。
能够看到断点处的代码,可以发现在main.c的line 538处中断,结果如下: