构建调试Linux内核网络代码的环境MenuOS系统

  本次实验在实验楼的远程实验环境完成。下面对按照实验流程进行简单梳理。

运行MenuOS

  实验楼环境中已经存在编译完成的内核,运行以下命令启动虚拟机运行MenuOS。

$ cd ~/LinuxKernel/
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

  在虚拟机中启动MenuOS后的界面如下图。注意按住Ctrl+Alt组合将鼠标从虚拟机界面中释放。  

GDB跟踪内核启动

  输入以下命令重启MenuOS,可以看到相较之前的启动命令,这次新增了-s和-S选项。-S表示暂停启动时的CPU的执行;而-s是-gdb tcp::1234 选项的简写。若不想使用 1234 端口,则可以使用 -gdb tcp:xxxx 来取代 -s 选项。

$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

  接下来打开新的终端窗口,在进入~/LinuxKernel目录之后,依次输入以下命令:

# 打开 GDB 调试器
$ gdb

# 在 GDB 中输入以下命令:

# 在 gdb 界面中 targe remote 之前加载符号表
(gdb)file linux-3.18.6/vmlinux 

# 建立 gdb 和 gdbserver 之间的连接
(gdb)target remote:1234

# 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel 

# 按 c 让qemu上的Linux继续运行
(gdb)c                  

  通过GDB服务可以跟踪内核执行流,并定位到指定断点。

集成Socket聊天程序

  首先,下载程序的源码。

$ cd ~/LinuxKernel  
$ git clone https://github.com/mengning/linuxnet.git

  然后执行以下命令分别安装server和client端程序

$ cd ~/LinuxKernel/linuxnet/lab2
$ make
$ cd ../lab3
$ make rootfs

  可以看到MenuOS网络栈可以正常工作,程序在终端输出预期内容。

posted @ 2019-12-10 18:08  smarxdray  阅读(168)  评论(0编辑  收藏  举报