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