• 构建调试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 #查看断点处的源码
    
    

  • 相关阅读:
    LeetCode Find Duplicate File in System
    LeetCode 681. Next Closest Time
    LeetCode 678. Valid Parenthesis String
    LeetCode 616. Add Bold Tag in String
    LeetCode 639. Decode Ways II
    LeetCode 536. Construct Binary Tree from String
    LeetCode 539. Minimum Time Difference
    LeetCode 635. Design Log Storage System
    LeetCode Split Concatenated Strings
    LeetCode 696. Count Binary Substrings
  • 原文地址:https://www.cnblogs.com/huangmengyu/p/12031231.html
Copyright © 2020-2023  润新知