本实验是构建linux内核网络代码的环境--MenuOS系统,并基于MenuOS系统调试网络程序
本实验是在Ubuntu 18.04系统下进行的。
一、下载Linux内核源代码
网址为: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
下载完成后,解压
xz -d linux-5.0.1.tar.xz
tar -xf linux-5.0.1.tar
cd linux-5.0.1
安装内核编译工具
sudo apt-get install build-essential
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install libssl-dev
sudo apt-get install libelf-dev
sudo apt-get install libncurses-dev
配置编译内核
make x86_64_defconfig
make menuconfig
make menuconfig后选择Kernel hacking -> Compile-time checks and complier options -> [*]Compile the kernel with debug info
开启内核调试模式,是为了后面用gdb调试时,可以看到系统调用接口代码。
make
编译过程有点长,大约几十分钟,本实验编译了四十分钟。也可采用 make -j 加快编译速度。
通过QEMU虚拟机加载内核
sudo apt install qemu
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage
因为只是启动了内核,并没有root fs,所以会发生Kernel panic.
接着制作root fs
cd ..
git clone https://github.com/mengning/menu.git
cd menu
sudo apt-get install libc6-dev-i386 #在64位环境下编译32位需安装
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
cd .. qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -initrd rootfs.img
至此,MenuOS系统构建完成。
二、在menuOS上加载简单的网络通信程序
git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab3
make
cd ../../menu/#这里要修改Makefile文件 跟之前修改的类似,就是适配一下
make rootfs
到此为止,已经在MenuOS上能够完成TCP客户端和服务器发送和接收hello/hi,也就是MenuOS的网络可以正常工作。
三、gdb跟踪内核代码
cd ../
qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S
重新打开一个终端
#先进入net_lab目录
gdb
file linux-5.0.1、vmlinux
target remote:1234
b start_kernel
c
list
此时内核阻塞在start_kernel函数处,输入list命令可以看到start_kernel源码上下文。
在sock_init加断点,继续观察
b sock_init
c
list
在inet_init处加断点,观察
b inet_init
c
list
以上就是用gdb根据内核代码。