构建调试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网络栈可以正常工作,程序在终端输出预期内容。