构建调试Linux内核网络代码的环境MenuOS系统
一,在本地构建MenuOS系统
1.1下载并编译Linux源代码
首先确定一下实验环境。
uname -a
得到的结果如下:
Linux im26 4.4.0-165-generic #193-Ubuntu SMP Tue Sep 17 17:42:52 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
接下来需要下载linux源代码并进行编译,首先输入如下命令以完成下载:
~/LinuxKernel$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.2.tar.xz
这里需要注意的一个问题是此处的LinuxKernel文件夹需要使用mkdir命令进行创建。
下载完成后即进入编译环节,在此之前,需要先将下载的文件解压并提取:
~/LinuxKernel$ xz -d linux-5.4.2.tar.xz ~/LinuxKernel$ tar -xvf linux-5.4.2.tar
上述步骤完成后,依次安装编译依赖然后进行编译:
~/LinuxKernel$ sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev ~/LinuxKernel$ cd linux-5.4.2 ~/LinuxKernel/linux-5.4.2$ make i386_defconfig ~/LinuxKernel/linux-5.4.2$ make
编译完成后结果如下:

1.2安装qemu虚拟机并搭建MenuOS
首先自然需要下载qemu并安装,
~/LinuxKernel$ sudo apt install qemu
完成之后使用qemu将我们之前编译过得内核的镜像加载到qemu中:
~/LinuxKernel$ qemu-system-i386 -kernel linux-5.4.2/arch/x86/boot/bzImage
接下来的内容就是构建MenuOS了,依然是下载编译:
~/LinuxKernel$ git clone https://github.com/mengning/menu.git ~/LinuxKernel$ cd menu ~/LinuxKernel/menu$ sudo apt-get install libc6-dev-i386
通过如下步骤修改Makefile中的启动命令和对应的文件位置:
~/LinuxKernel/menu$ vim Makefile ~/LinuxKernel/menu$ make rootfs
接着输入如下命令打开虚拟机:
qemu-system-i386 -kernel linux-5.4.2/arch/x86/boot/bzImage -initrd rootfs.img
至此处实验第一步完成,结果如下:
二,集成TCP客户端与服务器功能
首先下载相关的文件,修改其中的Makefile以集成网络功能:
~/LinuxKernel$ git clone https://github.com/mengning/linuxnet.git ~/LinuxKernel$ cd linuxnet/lab3 ~/LinuxKernel/linuxnet/lab3$ vim Makefile ~/LinuxKernel/linuxnet/lab3$ make rootfs
打开虚拟机,此时相关的网络命令已经集成到虚拟机中,尝试调用,结果如下。

三,使用GDB跟踪内核代码
首先需要对内核重新进行编译:
~/LinuxKernel/linux-5.4.2$ make menuconfig
进入如下页面后依次选择:kernel hacking—>Compile-time checks and compiler options—> [*] compile the kernel with debug info,在最后一个选项处,选择底部的save后进入如下页面:

确认后连续使用Esc回到终端,重新进行编译:
~/LinuxKernel/menu$ make
编译完成后,即可启动带gdbserver的MenuOS,命令如下:
~/LinuxKernel$ qemu-system-i386 -kernel linux-5.4.2/arch/x86/boot/bzImage -initrd rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S
上面的命令各参数的含义如下:
-kernel 后面跟的是要调试的内核bzImage
-initrd 后面跟的是文件系统
-append 后面跟的是虚拟机的cmdline
-S 表示guest虚拟机一启动就会暂停
-s 表示监听tcp:1234端口等待GDB的连接
此时虚拟机虽然启动,但是处于暂停状态:

重新打开一个端口运行gdbserver:
gdb (gdb) file ~/LinuxKernel/linux-5.4.2/vmlinux (gdb) target remote:1234 (gdb) break start_kernel (gdb) break sys_socketcall
其中,vmlinux是一个包含linux kernel的静态链接的可执行文件,即编译出来的最原始的文件。在通过target命令连接到虚拟机的端口后,设置两个断点。
完成以上步骤后继续键入:
(gdb) c
回到虚拟机界面,原先停止的界面运行到下一个断点:


浙公网安备 33010602011771号