构建调试Linux内核网络代码的环境MenuOS系统
2019-12-10 20:23 19chenjian 阅读(232) 评论(0) 收藏 举报一.下载Linux内核源代码
首先创建一个LinuxKernel的目录,然后从https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz下载Linux-5.0.1的压缩包,接着对其进行解压操作。
mkdir LinuxKernel cd LinuxKernel wget https://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
二.安装内核编译工具
安装内核编译工具,可使用一条语句来完成安装。
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
三.配置编译内核
make i386_defconfig #生成32位x86的配置文件,x86_64_defconfig为64为配置 make menuconfig #开启文本菜单选项,对窗口有限制,尽量调大窗口
此时可能会执行失败,报这样的错误

只要在配置文件首选项里面将终端的初始尺寸调大,然后再重启就可以。
执行完make menuconfig命令会弹出这个界面,

依次选择Kernel hacking、Compile-time checks and compiler options、Compile the kernel with debug info,然后再保存,最后离开退出图形化界面。
所有这些完成之后,就可以开始编译内核了,时间可能会比较长。
make 或 make -j* # *为cpu核心数
四.制作根文件系统
1.通过QEMU虚拟机加载内核
cd.. #返回上级目录 sudo apt install qemu #安装qemu
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage
2.构造MenuOS
git clone https://github.com/mengning/menu.git mkdir rootfs #创建rootfs目录
cd menu
sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装
make rootfs
在执行make rootfs命令前,需要将Makefile文件下的qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img这一行修改成qemu-system-x86_64 -kernel ../../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img。然后执行make rootf命令会弹出如下的界面

五.验证
1.分别将TCP通信程序的服务端和客户端集成到MenuOS中
集成服务端到MenuOS中
cd .. git clone https://github.com/mengning/linuxnet.git cd linuxtnet/lab2 make
cd ../../menu/
make rootfs
集成客户端到MenuOS中
cd .. cd linuxnet/lab3 make rootfs
在执行make rootfs命令前,同样需要修改Makefile文件下的内容。
在QEMU下输入replyhi和hello,能够正常运行。

六.gdb调试跟踪内核代码
1.重新配置编译内核使之携带调试信息
make defconfig make menuconfig
在弹出的界面中依次选择Kernel hacking—>Compile-time checks and compiler options ---> [*] Compile the kernel with debug info,然后保存退出。
make #重新编译,时间较长
2.在qemu中启动gdb server
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S
可以看到在新打开的qemu虚拟机上,整个是一个黑屏,此时qemu在等待gdb的连接。
3.建立gdb与gdbserver之间的连接,加载vmlinux中的符号表,设置断点
#打开另一个终端输入 gdb file ~/LinuxKernel/linux-5.0.1/vmlinux break start_kernel #设置断点 target remote:1234 c #继续 list #查看上下文
结果如下所示

参考资料:
https://github.com/mengning/net
浙公网安备 33010602011771号