构建调试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内核函数。

  

  

原文地址:https://www.cnblogs.com/hhssqq9999/p/12011899.html