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

咏月东南 2019-12-11

一、构建调试系统

下载内核:

make -p /lab3/linuxkernel
//这里可以选择从国内镜像下载内核,官网下载速度太慢,国内镜像地址
//http://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/linux5.0.1.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux5.0.1.tar.xz
//解压进入
xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar 
cd linux-5.0.1

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

   安装内核编译工具,这里需要注意的是我们使用的是centOS8,和老师给的实验指导用的Ubuntu安装命令是不同的,centOS安装指令为yum,且安装的包名是有变化的;

Ubuntu下:

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

centOS下:

1     yum groupinstall "Development Tools"
2     yum install openssl-devel elfutils-libelf-devel ncurses-libs ncurses-devel

配置编译内核:

  make i386_defconfig 
  // configuration written to .config
  make menuconfig//在菜单模式下选择开启哪些内核功能
   //这里要注意将Compile the kernel with debug info选上,这样会有调试信息
  make //编译内核

安装QEMU虚拟机:

1     yum -y install qemu-kvm

构造menuOS:

git clone https://github.com/mengning/menu.git
    cd menu
    sudo yum install libc6-dev-i386 // 在64位环境下编译32位需安装
    make rootfs
    //注意这里编译可能会出问题,缺少c的静态库,安装即可
    cd ..
    qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -    initrd rootfs.img 8     qemu-system-x86_64 -kernel linux5.0.1/arch/x86_64/boot/bzImage  -initrd rootfs.img

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

至此,调试环境menuOS就搭建好了;

二、menuOS上运行网络程序

将服务端程序加载到menuOS:

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

将客户端程序加载到menuOS:

1     cd ~/LinuxKernel  
2     cd linuxnet/lab3
3     make rootfs

这里需要注意的是上述克隆下来的文件中,要将Makefile文件里关于Linux的版本修改为当前版本,即menuOS用的Linux内核,为linux 5.0.1;

然后menuOS系统就出现了reolyhi和hello命令,执行,发现可以完成通信;

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

三、通过gdb可以跟踪到内核代码

cd ~/linuxlab/menu
    vim Makefile
    //修改其中的参数,在qemu后面加上-append nokaslr -s -S参数
    make rootfs
    //执行完后出现一个stop的qemu,处于等待连接状态

    //重新打开一个终端
    gdb
    file ~/lib3/linuxkernel/linux-5.0.1/vmlinux
    //连接刚刚停止的qemu
    target remote:1234 
    //在start_kernel处设置断点
    b start_kernel

    run 
    //可以看到已经在start_kernel函数处停止运行了

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

如有需要,可以设置更多断点用以调试程序,例如可以通过break rest_init,在rest_init处设置断点,并可以使用list可以查看到rest_init前后的代码

相关推荐