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

实验环境

Ubuntu 16.04 LTS

1. 下载并解压linux_5.0.1内核

cd ~/Desktop
mkdir LinuxKernel #在桌面创建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

2.  安装相关编译工具

1 sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev

3. 编译内核

在terminal中cd进入到linux-5.0.1文件夹里执行以下命令

1) 使用make allnoconfig 配置进行内核编译(编译时间较短)

1 make allnoconfig
2 make

 

2) 使用make menuconfig 进行内核编译(使内核带有debug信息)

make i386_defconfig 
make menuconfig 
make
# make menuconfig 命令执行后会出现一个图像界面, 我们需要依次选择 
#   Kernel hacking,
#   Compile-time checks and compiler options
#   Compile the kernel with debug info
#   最后Save退出

 

 执行过程截图如下图所示(省略了make menuconfig选择的过程)

在执行最后的make命令时可能会出现以下报错(软件版本问题) 

You are building kernel with non-retpoline compiler.
Please update your compiler.
arch/x86/Makefile:307: recipe for target ‘checkbin’ failed
make: *** [checkbin] Error 1

解决方法(更新软件)

sudo apt-get upgrade

 4. 制作MenuOS

cd ~/Desktop/LinuxKernel
mkdir rootfs git clone https:
//github.com/mengning/menu.git cd menu
vim Makefile
sudo apt-get install libc6-dev-i386
make rootfs

上面vim Makefile是把qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img 这一行注释掉。qemu命令在新版本qemu中已经无法使用。后面我们自己手动敲命令加载内核以及根文件系统。

上面的命令执行结束我们的目录结构如下

 5. qemu加载MenuOS系统

cd ~/Desktop/LinuxKernel
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img

运行结果如下图

 6. gdb调试menuOS

 6.1 构建GDB server

qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -append  nokaslr -s -S

和课程ppt上的命令有些许不同,因为使用ppt上的命令无法进入指定断点,上述的命令参考了Arrkwen同学的文章,在此感谢。PPT上的命令也就不在这里重复粘贴了。

6.2 连接GDB server

重开一个terminal执行下面的命令

gdb
file ~/Desktop/LinuxKernel/linux-5.0.1/vmlinux #加载符号表
break start_kernel #在main.c中的start_kernel函数处添加断点
target remote:1234 #连接GDB server
continue #让MenuOS继续执行
list #显示断点处的代码

连接成功的截图如下

 7. 将TCP服务的客户端和服务端集成进MenuOS

cd ~/Desktop/LinuxKernel
git clone https://github.com/mengning/linuxnet.git
cd linuxnet/lab5
# 修改qumu的启动命令为 qemu-system-i386 -kernel ../../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img
vim Makefile 
make rootfs

最终效果截图如下

 

 

posted @ 2019-12-10 16:29  luoyang712  阅读(622)  评论(0编辑  收藏  举报