• 构建调试Linux内核网络代码的环境MenuOS系统——网络程序设计课第三次作业


    此次实验主要是构建MenuOS,并将之前使用过的通信程序集成到其中,并构建gdb环境。大致的步骤为:

      1.下载后编译linux 5.0.1内核

      2.准备qemu模拟器

      3.制作根文件系统,构造MenuOS并装载进qemu

      4.将通信程序集成进MenuOS,测试其网络环境

      5.构建gdb环境

      实验环境:64位ubuntu版本: 16.04.3  内核版本:4.15.0

    下面依次展开:

    一、下载linux 5.0.1内核源代码并编译

      首先,在用户根目录下建立新目录命名为kerneldir

      其次,进入kerneldir目录下,使用wget命令下载linux内核源码

      然后,两次解压.tar.xz文件

    mkdir kerneldir
    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

      接下来,进行内核代码的编译

      首先,安装内核编译工具并生成64位的配置文件

    sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
    make x86_64_defconfig  #生成64位x86的配置文件
    

      下面进行配置编译内核:(在linux-5.0.1目录下)

    make menuconfig
    

      执行完该命令后会进入图形化界面,在此界面中完成配置,具体如下:

      Kernel hacking >Compile-time checks and compiler options>Compile the kernel with debug info 输入y。 完成后在下方选择save ,然后一步步退出

      还是在linux-5.0.1目录下,输入并执行make命令进行编译。

     

    二、准备qemu模拟器,并将内核装载进qemu

      首先,安装qemu模拟器

    sudo apt install qemu

      然后,git clone老师所给出的MenuOS文件。这里,附加一点。在使用git clone时速度很慢,而且经常断流。修改dns后也未有改善。这里提供一种亲测可行的办法:使用国内的网站“码云”做中转站,将老师所给的github的仓库导入到码云,然后修改git clone后

    的地址为码云的地址。具体操作如下:

      1.登入码云,点击网页右上角+号>新建仓库后进入如下界面,选择公开 和 导入已有仓库,已有仓库地址填写老师所给的地址后完成创建,等待仓库的复制导入

      2.在键入git clone命令来获取MenuOS的文件时,将路径改为你刚刚创建的路径,如git clone https://gitee.com/dexttter/xxxxx.git(仅做举例,并没有这个项目)

        其次,创建rootfs目录,作为MenuOS的根目录。目录树的结构因人而异,只不过要记得修改Makefile文件中的相关路径。建议路径为:rootfs和menu都位于kerneldir目录下,是并列关系,这样在后面的makefile文件中就不用修改路径关系了,只需要

    修改内核版本。

    sudo apt-get install libc6-dev-i386  #安装libc6-dev-i386
    sudo ln -s /usr/bin/qemu-system-x86_64  /usr/bin/qemu #建立一个软链接 之后可以直接执行qemu

      修改menu下的makefile文件,将linux内核版本改为5.0.1。

      修改完成后,

    make rootfs  #初始化根目录

      

       到这里,我们完成了对MenuOS的装载

    三、将通信程序集成进MenuOS中以测试其网络环境

      首先,在kerneldir目录下,git clone linuxnet项目(这里也是使用码云作为中转,和上面一样)   

    cd ~/kerneldir/linuxnet/lab2
    make

      make lab2后进入menu目录,将lab2中的replyhi集成进MenuOS

    make rootfs

      同理,将lab3集成进MenuOS。注意,这里需要修改lab3中的linux内核版本为5.0.1。完成后键入并执行make rootfs命令

       我们可以看到,replyhi和hello都已经集成进了MenuOS中,输入并执行replyhi命令后输入hello,收到hi回复。到这里完成了对menuos网络环境的测试,没有问题。

      

       值得一提的是,这里将lab3集成进MenuOS只是暂时的,而lab2却是真正的嵌入了menuos中,因为在lab2的makefile文件中我们可以看到:

      

       make的过程是将lab_2下test_reply.c文件拷贝并覆盖了menu目录下的test.c文件,将syswrapper.h文件拷贝到了menu目录下,这对menu的源码做出了直接的修改,所以“永久性”地修改了menuos,即将replyhi集成到了menuos中

      而lab3的make过程却并非如此,因此如果我们想将lab3的内容”永久性“地集成进menuos,要么修改lab3的makefile文件,要么手动地将lab3的C代码源文件导入menuos中。这里,我选用了后者——即直接将lab3中的main.c文件拷贝进menu目录下并覆盖(

      注意:menuos下源码为test.c文件,所以我们把lab3的main.c搬过来后也要修改为同名文件test.c)。

      这样,在以后我们用qemu启动menuos时,都会保证replyhi和hello命令都已经集成进了menuos,如下图所示:

      

    四、构建gdb环境

      

    qemu -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img -s -S #老师所给出的指令在进行跟踪时,输入continue命令时会出现无反应的现象,参考前面同学的博客,在命令中添加
    -append  nokaslr 可以正确调试内核,亲测可行
    qemu -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img -append  nokaslr -s -S

      执行完上述命令,将启动gdb server,qemu会黑屏

      此时打开一个新的终端以连接到gdb server:

    gdb
    file ~/kerneldir/linux-5.0.1/vmlinux   #在gdb界面中targe remote之前加载符号表
    break start_kernel  #断点的设置可以在target remote之前,也可以在之后
    target remote:1234 #建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
    c #按c 让qemu上的Linux继续运行
    list #输入list指令可以查看断点处的代码

      

       运行结果如上图所示,ok,已经完成gdb环境的构建,并且追踪到了start_kernel内核函数。

      

      

  • 相关阅读:
    大数据量下的SQL Server数据库自身优化
    NodeJS 学习笔记
    SOA、ESB、NServiceBus、云计算 总结
    .NET及.NET Core系统架构
    TCP/IP协议、HTTP协议、SOCKET通讯详解
    web压测工具http_load
    前端面试问题答案汇总--通识篇
    前端面试问题答案汇总--高级篇
    前端面试问题答案汇总--进阶篇
    前端面试问题答案汇总--基础版
  • 原文地址:https://www.cnblogs.com/hhssqq9999/p/12011899.html
Copyright © 2020-2023  润新知