构建调试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

  回到虚拟机界面,原先停止的界面运行到下一个断点:

posted @ 2019-12-11 18:17  二六二六二  阅读(163)  评论(0)    收藏  举报