构建调试Linux内核网络代码的环境MenuOS系统
一:安装、编译Linux内核
(1)下载Linux内核的源代码并解压:
官网为http://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz,解压命令如下:
xz -d linux-5.0.1.tar.xz #解压 tar -xvf linux-5.0.1.tar cd linux-5.0.1
(2)配置编译需要的信息
命令行如下:
cd /linux-5.0.1/ #进入解压出来的目录 sudo cp /boot/config-xxx -r .config #使用现存内核的配置文件 sudo make oldconfig #应用现存配置文件 sudo make localmodconfig #仅安装已有module sudo make menuconfig #进入GUI界面配置其他编译选项
得到如下GUI界面:
配置步骤:Kernel hacking、Compile-time checks and compiler options,[*]Compile the kernel with debug info,并且分别enter exit保存
3)编译
sudo make #难等!!!
二:制作根文件系统
(1) 安装qume命令如下
sudo apt install qemu
(2)构建MenuOS命令如下
mkdir rootfs git clone https://github.com/mengning/menu.git cd menu sudo apt-get install libc6-dev-i386
(3)启动MenuOS系统
make rootfs
我们可以看到以下窗口
三:检测MenuOS的网络可以正常工作
将TCP网络通信程序的客户端和服务器端分别集成到MenuOS系统中,命令如下:
cd ~/LinuxKernel #客户端
cd linuxnet/lab3
sudo gedit Makefile
make rootfs
cd ~/LinuxKernel #服务器端
git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab2
make
cd ../../menu/
sudo gedit Makefile
make rootfs
以下界面结果证实在MenuOS上能够完成TCP客户端和服务器发送和接收hello/hi,也就是MenuOS的网络可以正常工作
四、GDB调试
打开一个窗口输入以下命令
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# 关于-s和-S选项的说明:
# -S freeze CPU at startup (use ’c’ to start execution)
# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
另开一个shell窗口
gdb
(gdb)file linux-5.0.1/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
run后,可以得到如下界面,表示在start_kernel函数处停止运行,能够看到断点处的代码,结果如下
实验完成。