zoukankan      html  css  js  c++  java
  • 构建调试Linux内核网络代码的环境MenuOS系统

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

    实验环境:ubuntu16.04.6 64位

    下载并编译linux内核

    • 下载linux-5.0.1内核源代码
    #下载地址
    https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
    #在家目录下新建工作目录
    mkdir LinuxKernel
    #将下载好的压缩包拷贝到LinuxKernel目录,然后解压
    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 #开启文本菜单选项,对窗口有限制,尽量调大窗口
    #Kernel hacking -> Compile-time checks and compiler options -> [*] Compile the kernel with debug info
    #配置内核使之携带调试信息,保存并退出
    make #编译,时间较长
    #产出为bzImage文件
    

    通过QEMU虚拟机加载内核并构造MenuOS

    cd ~/LinuxKernel
    sudo apt install qemu
    qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage
    #下载MenuOS
    git clone https://github.com/mengning/menu.git
    cd menu
    sudo apt-get install libc6-dev-i386
    vim Makefile
    #修改“qemu...”这一行 为:
    qemu-system-i386 -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img
    make rootfs #构建一个根文件系统
    

    在MenuOS上完成TCP客户端和服务器发送和接收hello/hi,验证MenuOS的网络可以正常工作

    • 将TCP网络通信程序的服务器端集成到MenuOS系统
    cd ~/LinuxKernel
    sudo git clone https://github.com/mengning/linuxnet.git
    cd linuxnet/lab2 #服务器端目录
    vim Makefile
    

    需要保证文件拷贝路径是正确的:

    make
    cd ../../menu/
    make rootfs
    
    • 将TCP网络通信程序的客户端集成到MenuOS系统中
    cd ~/LinuxKernel/linuxnet/lab3
    
    vim Makefile
    #修改“qemu...”这一行 为:
    qemu-system-i386 -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img
    
    sudo make rootfs
    

    在qemu虚拟机中使用help命令可以发现replyhi和hello已经集成到系统中,成为一条命令:

    在QEMU窗口中依次输入命令 replyhihello

    说明MenuOS的网络可以正常工作。

    截图证实通过gdb可以跟踪到内核代码,比如start_kernel、sys_socketcall等内核函数

    首先构建Linux内核的gdb调试环境:

    • 配置并编译内核使之携带调试信息(已经在第一步完成)

    • 在qemu中启动gdb server:

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

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

    • 建立gdb与gdbserver之间的连接:

    在另外一个终端运行gdb,然后在gdb界面中运行如下命令:

    gdb #进入gdb命令行
    
    #首先需要在gdb界面中targe remote之前加载符号表,否则无法根据符号设置断点
    file ~/LinuxKernel/linux-5.0.1/vmlinux
    #在gdb界面中设置断点
    break start_kernel #断点的设置可以在target remote之前,也可以在之后
    
    target remote:1234 #则可以建立gdb和gdbserver之间的连接
    按c 让qemu上的Linux继续运行
    list #查看断点处的源码
    
    

  • 相关阅读:
    攻克python3-进程
    攻克python3-线程
    攻克python3-socket
    攻克python3-面向对象
    攻克python3-装饰器
    攻克python3-函数
    攻克python3-文件操作
    算法基础
    MongoDB存储基础教程
    Python操作Excle
  • 原文地址:https://www.cnblogs.com/huangmengyu/p/12031231.html
Copyright © 2011-2022 走看看