基于linux5.0.1内核的网络代码环境的构建及内核函数的跟踪

  本次带着大家完成一个关于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的所有选项。

二、完成TCP客户端和服务器通信

猜你喜欢

转载自www.cnblogs.com/mjc-blog/p/12013779.html