本次带着大家完成一个关于linux内核及网络的有趣的实验,即在linux内核的基础上构建一个只有很少命令的Menu OS系统,然后在Menu OS的终端上完成TCP的C/S通信程序,最后通过linux系统下自带的调试器gdb跟踪内核的函数,看看它们的原理。
实验目标:
- 通过本地Linux系统完成构建调试Linux内核网络代码的环境MenuOS系统
- 截图证实已经在MenuOS上能够完成TCP客户端和服务器发送和接收hello/hi,也就是MenuOS的网络可以正常工作
- 截图证实通过gdb可以跟踪到内核代码,比如start_kernel、sys_socketcall等内核函数
实验环境
内核代码:Linux 5.0.1;
Ubuntu虚拟机:运行环境,本次使用VM Ware15.5安装的Ubuntu16.04;
qemu:本次使用的模拟器,运行内核代码;
gdb:linux下的断点调试工具;
实验过程
一、构建MenuOS系统
1、下载linux内核到kernel目录并解压:
mkdir kernel wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar mv linux-5.0.1.tar ./kernel cd kernel tar -xvf linux-5.0.1.tar.gz
2、在进行内核配置之前,首先安装一些必要的编译工具:
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
3、配置内核并编译:
make menuconfig
选中compile the kernel with debug info,以产生调试信息供gdb调试:
ok,保存好生成.config信息,然后开始编译内核:
make
编译时间是真的有点长,所以耐心等待啊,最后终于成功了。
4、安装强大的模拟器qemu:
sudo apt-get install qemu
成功后在shell上输入qemu在按tab,可以看到qemu支持的机器架构:
我们待会会用到qemu-system-x86_64的,别着急,一步步来。
5、制作根文件系统:
cd ~/kernel/ mkdir rootfs git clone https://github.com/mengning/menu.git cd menu gcc -pthread -o init linktable.c menu.c test.c -m32 -static cd ../rootfs cp ../menu/init ./ find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
现在已经制作好rootfs.img了,如下图:
6、用qemu启动MenuOS系统:
cd .. qemu-system-x86_64 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
出现以下界面:
好了,至此,大功告成,现在已经成功构建调试Linux内核网络代码的环境MenuOS系统,可以再往下走了。
顺便给大家提一点关于qemu常见启动和调试选项的解释:
Linux启动选项
当我们使用这些选项时,我们可以使用一个指定的内核,而没有将它安装在磁盘镜像中。这对于简单的测试各种内核是相当有用的。
- `-kernel bzImage'
- 使用bzImage作为内核映像。
- `-append cmdline'
- 使用cmdline作为内核的命令行。
- `-initrd file'
- 使用file作为初始的ram磁盘。
调试选项
- `-serial dev'
- 重定向虚拟串到主机的设备dev。可用的设备如下:
- vc
- 虚拟终端
- pty
- (Linux)伪TTY(自动分配一个新的TTY)
- null
- 空设备
- /dev/XXX"
- (Linux)使用主机的tty。例如,'/dev/ttyS0'。主机的串口参数通过模拟进行设置。
- /dev/parportN
- (Linux)使用主机的并口N。当前只可以使用SPP的并口特征。
- file:filename
- 将输出写入到文件filename中。没有字符可读。
- stdio
- (Unix)标准输入/输出
- pipe:filename
-
(Unix)有名管道filename
在图形模式下的默认设备为vc,而在非图形模式下为stdio.这个选项 可以被多次使用,最多可以模拟4个串口。
- '-parallel dev'
-
重定向虚拟并口到主机的设备dev(与串口相同的设备)。在Linux主 机上,`/dev/parportN'可以被用来使用与相应的并口相连的硬件设 备。这个选项可以使用多次,最多可以模拟3个并口。
- `-monitor dev'
-
重定向临视器到主机的设备dev(与串口相同的设备)。在图形模式 下的默认设备为vc,而在非图形模式下为stdio。
- '-s'
- 等待gdb连接到端口1234.
- `-p port'
- 改变gdb连接端口。
- `-S'
- 在启动时并不启动CPU(我们必须在监视器中输入'c')
'-d'
- 输出日志到/tmp/qemu.log
- `-hdachs c,h,s,[,t]'
- 强制硬盘0的物理参数(1 <= c <= 16383, 1 <= h <= 16, 1 <= s <=63),并且可以选择强制BIOS的转换模式(t=none, lba or auto).通 常QEMU可以检测这些参数.这个选项对于老的MS-DOS磁盘映像是相当 有用的.
- `-std-vga'
- 模拟一个Bochs VBE扩展的标准VGA显卡(默认情况下为Cirrus Logic GD5446 PCI VGA)
- `-loadvm file'
- 从一个保存状态启动.
- 当然还有很多其他的选项,这里就不写那么多,想知道更多可以直接去查看qemu的所有选项。