构建调试Linux内核网络代码的环境MenuOS系统
1.下载linux kernel源码,并配置所需库
mkdir linuxkernel
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-get install aptitude //我的ubuntu版本使用apt-get来安转内核编译所需库会出现依赖问题,所以我使用 aptitude来安装 sudo aptitude install build-essential flex bison libssl-dev libelf-dev libncurses-dev make i386_defconfig
截止目前:
2.配置debug信息
make menuconfig 进入GUI界面
kernel hacking-->compile-time checks and compiler options -->[]compile the kernel with debug info-->按Y-->save-->esc退出GUI界面
3.编译
make
制作根文件系统:
1)安装qemu命令:
sudo apt install qemu
2)构造menuOS
git clone https://github.com/mengning/menu.git mkdir rootfs //安装libc6-dev-i386 sudo apt-get install libc6-dev-i386 //修改MakeFile qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img #修改前 qemu-system-i386 -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img #修改后 make rootfs
4.验证MenuOS的网络
1)将TCP网络通信程序的服务端集成到MenuOS系统中
cd linuxkernel git clone https://github.com/mengning/linuxnet.git cd linuxnet/lab2 make cd ../../menu make rootfs
2)将TCP网络通信程序的客户端集成到MenuOS系统中
cd linuxkernel cd linuxnet/lab3 sudo vim Makefile //修改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 rootfs
//在GUI中输入replyhi,输入hello,收到hi,证明MenuOS网络正常工作。
5.gdb调试
1)重启QEMU
cd linuxkernel/menu sudo vim Makefile //修改Makefile #qemu -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img -append nokaslr -s -S make rootfs
结果:
2)连接gdb server并调试
重开终端:
gdb file ~/linuxkernel/linux-5.0.1/vmlinux target remote:1234 #设置断点对start_kernel进行跟踪 break start_kernel c #继续运行 list #查看上下文
结果显示gdb可以追踪到start_kernel
函数,断点在init/mian.c
的538行
继续在rest_init处设置断点
break rest_init c
断点在init/mian.c
的402行