环境准备
切换内核
下载linux-5.0.1内核源码,解压
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
配置编译内核,使其带有gdb调试环境
make defconfig
make menuconfig
Kernel hacking —> Compile-time checks and compiler options ---> [*] Compile the kernel with debug info
开始编译
make
#或者用
make -j* #*为分配cpu数量,越大编译越快
升级当前系统内核
sudo make modules_install # 安装前通过系统快照备份系统,以防出现故障前功尽弃
sudo make install
sudo update-grub
reboot
uname -a
安装QEMU虚拟机
sudo apt install qemu
构造MenuOS
下载MenuOS源代码,安装编译工具
git clone https://github.com/mengning/menu.git
cd menu
sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装
修改makefile文件中的内核版本和qemu启动方式
制作根目录文件
make rootfs
Gdb调试
启动QEMU后界面为黑屏,gdbserver正等待gdb调试
建立gdb连接
重开一个终端,运行gdb
(gdb)file linux-5.0.1/vmlinux #读取符表
(gdb)target remote:1234 #建立连接
追踪内核源码
(gdb)break start_kernel #设置断点
(gab)c #运行至断点
list #查看break_kernel源码
测试网络功能
下载hello/hi网络通信程序,将其集成至MenuOS中
cd ~
git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab3
对lab3中的makefile做与上面gdb调试同样的修改,之后运行MenuOS
make
make rootfs
运行gdb,直接continue后MenuOS正常运行
在MenuOS中运行replyhi/hello
追踪三次握手协议的tcp_v4_connect 函数
(gdb)file linux-5.0.1/vmlinux
(gdb)break tcp_v4_connect
(gdb)c
MenuOS>>replyhi
MenuOS>>hello
(gdb)list