构建调试Linux内核网络代码的环境MenuOS系统

本实验是构建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

构建调试Linux内核网络代码的环境MenuOS系统_第1张图片

 

 因为只是启动了内核,并没有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

构建调试Linux内核网络代码的环境MenuOS系统_第2张图片

 至此,MenuOS系统构建完成。

 

二、在menuOS上加载简单的网络通信程序

git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab3
make
cd ../../menu/#这里要修改Makefile文件 跟之前修改的类似,就是适配一下
make rootfs

构建调试Linux内核网络代码的环境MenuOS系统_第3张图片

 

 构建调试Linux内核网络代码的环境MenuOS系统_第4张图片

 到此为止,已经在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

构建调试Linux内核网络代码的环境MenuOS系统_第5张图片

 

 

 

重新打开一个终端

#先进入net_lab目录
gdb
file linux-5.0.1、vmlinux

构建调试Linux内核网络代码的环境MenuOS系统_第6张图片

 

 

target remote:1234
b start_kernel
c
list

构建调试Linux内核网络代码的环境MenuOS系统_第7张图片

 

 

此时内核阻塞在start_kernel函数处,输入list命令可以看到start_kernel源码上下文。

在sock_init加断点,继续观察

b sock_init
c
list

构建调试Linux内核网络代码的环境MenuOS系统_第8张图片

 

 

在inet_init处加断点,观察

b inet_init
c
list

构建调试Linux内核网络代码的环境MenuOS系统_第9张图片

以上就是用gdb根据内核代码。

 

你可能感兴趣的:(构建调试Linux内核网络代码的环境MenuOS系统)