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

Posted wangp19

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建调试Linux内核网络代码的环境MenuOS系统相关的知识,希望对你有一定的参考价值。

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的配置文件
make menuconfig

之后会出现图形界面

将图中第一项选中保存退出

make #编译内核,时间较长
sudo apt install qemu  # 安装qemu虚拟机
#构造Menuos
git clone https://github.com/mengning/menu.git
cd menu
sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装
make rootfs
cd ..
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img # make i386_defconfig
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage  -initrd rootfs.img

 

2、gdb命令跟踪分析linux内核启动过程

使用跟踪分析内核启动过程的-s和-S选项启动MenuOS系统

$ qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -s -S

关于-s-S选项的说明:

  • -S freeze CPU at startup (use ’c’ to start execution)  cpu初始化前冻结
  • -s shorthand for -gdb tcp::1234 若不想使用 1234 端口,则可以使用 -gdb tcp:xxxx 来取代 -s 选项

此时窗口当前状态是被冻结的

然后另开一个shell窗口

# 打开 GDB 调试器
$ gdb

# 在 GDB 中输入以下命令:

# 在 gdb 界面中 targe remote 之前加载符号表
(gdb)file linux-5.0.1/vmlinux 

# 建立 gdb 和 gdbserver 之间的连接
(gdb)target remote:1234

# 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel 

# 按 c 让qemu上的Linux继续运行
(gdb)c                  

此时运行结果如下,内核启动到断点处,即start_kernel处停止

 

我们可以通过list命令查看到start_kernel前后的代码,当然我们也可以设置更多的断点,比如可以设置一个break rest_init,系统执行到rest_init停止,使用list可以查看到rest_init前后的代码

 

3、将网络通信程序集成到MenuOS系统中

1)将TCP网络通信程序的服务端集成到MenuOS系统中

$ cd ~/LinuxKernel  
$ git clone https://github.com/mengning/linuxnet.git
$ cd linuxnet/lab2
$ make
$ cd ../../menu/
$ make rootfs

2)将TCP网络通信程序的客户端集成到MenuOS系统中

cd ~/LinuxKernel  
cd linuxnet/lab3
make rootfs

注意将lab3目录下Makefile文件中的linux内核版本修改为linux-5.0.1,此时发现MenuOS下多出了replyhi和hello命令

输入replyhi和hello命令,查看运行结果,发现在MenuOS上能够完成TCP客户端和服务器发送和接收hello/hi

 

 参考资料:https://github.com/mengning/net/tree/master/lab3

 

以上是关于构建调试Linux内核网络代码的环境MenuOS系统的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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