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

一、安装linux-5.0.1

   1. 在home下创建menuOS目录,并下载 linux-5.0.1内核

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

  2. 解压内核

xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar

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

  3. 安装内核编译工具

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

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

  4. 配置并编译内核

 生成64位x86配置文件,然后配置编译内核,在出现的界面中依次选择 Kernel hacking,Compile-time checks and compiler options,[ ]Compile the kernel with debug info ,按Y,出现[*]Compile the kernel with debug info,然后依次 Save,最后 Exit。然后在执行make命令。完成后可使用虚拟机快照功能保存当前状态。

make x86_64_defconfig
make menuconfig
sudo make

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

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

   5. 在menuOS目录中下载并安装QEMU虚拟机,并用它来加载内核

sudo apt install qemu #下载QEMU
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage 
sudo apt install git   #下载git
mkdir roofs        
sudo git clone https://github.com/mengning/menu.git
cd menu
sudo apt-get install libc6-dev-i386 #安装

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

     编辑menu目录下Makefile文件的内容(可用sudo chmod 777 改变读写权限),如下图所示:

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

    在 menu 目录下 执行 make rootfs

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

 二、在menuos中实现 Hello Hi 的网络程序

    注意:先修改 lab3 文件夹下的makefile文件 如 上上图所示。

cd ..
sudo git clone https://github.com/mengning/linuxnet.git
cd ./linuxnet/lab2
sudo make
cd ../../menu/
sudo make rootfs

在menuos中执行replyhi 和 hello 即可实现简单网络通信。

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

三、实现gdb调试

qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S
#可以看到在新打开的qemu虚拟机上,整个是一个黑屏,此时qemu在等待gdb的连接
#-S freeze CPU at startup (use ’c’ to start execution)
#-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
#nokaslr KASLR是kernel address space layout randomization的缩写

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

 在linux-5.0.1目录下新打开一个终端,执行以下命令,即可进行gdb调试:

gdb
file vmlinux #加载vmlinux中的符号表
target remote:1234  #建立gdb和gdbserver之间的连接
b start_kernel #在start_kernel处设置断点

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