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

一.下载Linux内核源代码

首先创建一个LinuxKernel的目录,然后从https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz下载Linux-5.0.1的压缩包,接着对其进行解压操作。

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 install build-essential flex bison libssl-dev libelf-dev libncurses-dev

 

三.配置编译内核

make i386_defconfig #生成32位x86的配置文件,x86_64_defconfig为64为配置
make menuconfig      #开启文本菜单选项,对窗口有限制,尽量调大窗口

此时可能会执行失败,报这样的错误

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

只要在配置文件首选项里面将终端的初始尺寸调大,然后再重启就可以。

执行完make menuconfig命令会弹出这个界面,

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

依次选择Kernel hacking、Compile-time checks and compiler options、Compile the kernel with debug info,然后再保存,最后离开退出图形化界面。

所有这些完成之后,就可以开始编译内核了,时间可能会比较长。

make 或 make -j*       # *为cpu核心数

 

四.制作根文件系统

1.通过QEMU虚拟机加载内核


cd.. #返回上级目录
sudo apt install qemu #安装qemu
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage

2.构造MenuOS

git clone https://github.com/mengning/menu.git
mkdir rootfs     #创建rootfs目录
cd menu
sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装
make rootfs
 

在执行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。然后执行make rootf命令会弹出如下的界面

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

 

五.验证

1.分别将TCP通信程序的服务端和客户端集成到MenuOS中

集成服务端到MenuOS中

cd ..
git clone https://github.com/mengning/linuxnet.git
cd linuxtnet/lab2
make
cd ../../menu/
make rootfs

集成客户端到MenuOS中

cd ..
cd linuxnet/lab3
make rootfs

在执行make rootfs命令前,同样需要修改Makefile文件下的内容。

在QEMU下输入replyhi和hello,能够正常运行。

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

 

六.gdb调试跟踪内核代码

1.重新配置编译内核使之携带调试信息

make defconfig
make menuconfig

在弹出的界面中依次选择Kernel hacking—>Compile-time checks and compiler options  ---> [*] Compile the kernel with debug info,然后保存退出。

make  #重新编译,时间较长

2.在qemu中启动gdb server

qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S

可以看到在新打开的qemu虚拟机上,整个是一个黑屏,此时qemu在等待gdb的连接。

3.建立gdb与gdbserver之间的连接,加载vmlinux中的符号表,设置断点

#打开另一个终端输入
gdb
file ~/LinuxKernel/linux-5.0.1/vmlinux
break start_kernel    #设置断点
target remote:1234  
c             #继续
list          #查看上下文

结果如下所示

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

 

参考资料:

https://github.com/mengning/net

 

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