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

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

一、前言

  这是网络程序设计的第三次实验,主要是学习自己编译linux内核,构建一个具有简易功能的操作系统,同时在系统上面进行调试linux内核网络代码。这次实验跟着老师给的指导资料以及和同学们的讨论,最终总算顺利做完。

二、实验步骤

1、下载Linux内核源代码并进行解压

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
#进入文件夹 cd linux-5.0.1

 2、安装内核编译工具

sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev

 3、配置编译内核,因为我做的是32位的,所以直接是第一个命令

make i386_defconfig #生成32位x86的配置文件,x86_64_defconfig为64为配置

4、配置编译需要debug信息

这一步需要讲窗口放大,不然会提示窗口太小的错误

make menuconfig      
#开启文本菜单选项,对窗口有限制,尽量调大窗口
具体操作步骤:(感谢肖坤同学的指导https://www.cnblogs.com/Alexkk/p/11997737.html)
1:选择 Kernel hacking 2:选择 Compile-time checks and compiler options 3:选择 [ ]Compile the kernel with debug info 4:按Y 前面就多了一个 [*] Compile the kernel with debug info 5:选择 save 6:按 esc,直到退出图形化界面
 

5、配置好后开始编译内核,时间会比较长

make

6、升级当前系统内核
这是老师给的指导,但是由于尝试几次都是错误,后来好像是不用升级也能完成的,就没有进行内核的升级了

sudo make modules_install # ⚠️安装前通过系统快照备份系统,以防出现故障前功尽弃
sudo make installmnsudo update-grub
reboot
uname -a
Linux ubuntu 5.0.1 #1 SMP Wed Mar 13 14:19:31 CST 2019 x86_64 x86_64 x86_64 GNU/Linux

7、构建根文件系统,首先通过QEMU虚拟机加载内核,需要先进入linux-5.0.1的目录,如果报错说没有找到文件,就把切换路径根据自己的情况改一下

sudo apt install qemu
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage # make i386_defconfig

8、还是属于构建根文件系统,现在要构造MenuOS

修改这里如果报错,原因有可能是路径问题,比如我的最后修改的路径是从arch开始的,老师给的指导是从linux-5.0.1开始的;

如果报错是Makefile missing separator. Stop.,则是因为makefile的命令行,开头必须用tab键,目前没有发现tabstop的设定值的不同,会引起error。

#获取资源
git clone https://github.com/mengning/menu.git
#linux-5.0.1下新建目录,作为menuOS的根目录
mkdir rootfs
#安装
sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装
#进入menu,修改Makefile
cd  menu
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img   # make i386_defconfig,原来的是这样
qemu-system-x86_64 -kernel /arch/x86_64/boot/bzImage  -initrd rootfs.img   #修改为这个

9.接下来可以初始化根文件系统

切换到menu目录,make rootfs

实验结果是系统起来了!

可以查询menuOS系统具有的命令,输入help就行

下面开始进行gdb调试

1、在qemu中启动gdb server
在终端执行

qemu -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img -append nokaslr -s -S

2、建立gdb与gdbserver之间的连接,在另外一个终端运行gdb

gdb
file ~/linux-5.0.1/vmlinux  #根据自己的路径
break start_kernel
target remote:1234
c

实验结果:可以看到在start_kernel停下来了

 接下来构建MenuOS的网络功能

1、将 TCP 网络通信程序的服务端集成到 MenuOS 系统中
下载资源https://github.com/mengning/linuxnet.git,我在windows下载了再放进去,这样会快点

cd linuxnet/lab2
make
make rootfs #回到menu目录下编译,如果有错改一下Makefile

2、将 TCP 网络通信程序的客户端集成到 MenuOS 系统中

cd linuxnet/lab3
make rootfs  #注意这一步是可以直接在lab3目录执行

实验结果:

实现了menuos下tcp服务端和客户端的通信,达到实验要求

三、实验总结

这次实验的操作量比较大,在和同学讨论以及大佬的帮助下做出来了,学到了很多东西,了解了linux内核的网络通信机制,但是对于里面的详细过程还没有完全掌握,需要进一步深入学习,继续努力。

猜你喜欢

转载自www.cnblogs.com/iyuanyuan/p/12024967.html