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

工作环境:虚拟机下Ubuntu18.04.3(64位)

一、下载编译内核

首先在主目录下创建Linux Kernel文件夹,然后下载内核,解压,命令如下:

mkdir LinuxKernel  
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 
cd linux-5.0.1

这里有一个小建议:如果内核下载过慢,可以考虑换个源,方法:将/etc/apt/source.list拷贝,然后双击拷贝文件,点击其他,切换源(我用的是aliyu)

安装编译内核所需要的依赖包,这里可以一起install,但是建议一条一条执行,条理清楚,不容易乱:

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

编译内核

cd /linux-5.0.1/
sudo cp /boot/config-xxx -r .config #使用现存内核的配置文件:(xxx处使用TAB补全)
sudo make oldconfig
sudo make localmodconfig
sudo make menuconfig

出现如下界面:

依次选择 Kernel hacking ->Compile-time checks and compiler options ->[ ]Compile the kernel with debug info,然后点击Y键,选择“save”,然后一路“exit”

sudo make

编译内核时间一般在30分钟左右

如果想要升级内核可以键入以下命令(不建议随便升级内核)

sudo make modules_install  安装modules
sudo make install   #升级
sudo shutdown -r now  #重启
uname -a  #查看内核版本

二、装载QEMU

cd ..   #回到上个目录
sudo apt install qemu #下载qemu
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage  #在64位环境下编译32位需安装
mkdir rootfs  #制作qemu根目录
git clone https://github.com/mengning/menu.git 
cd menu
sudo apt-get install libc6-dev-i386  #在64位环境下编译32位

此时需要修改~/MenuOS/menu目录下Makefile文件下的一行内容,因为实验楼的系统是Linux 3.18.6,这里要改为5.0.1,修改之后如下qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img(注意在Makefile修改命令时开头需加上TAB键,否则会报错)

 

make rootfs

 

进入如下界面:输入help

 

三、验证MenuOS的网络

将TCP网络通信程序的服务端集成到MenuOS 系统中,命令如下


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

再将TCP网络通信程序的客户端集成到MenuOS系统中,在此之前需要先修改lab3下的Makefile文件,使其内容如下:

qemu-system-x86_64 -kernel ../../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img

cd ..
cd ./linuxnet/lab3
make rootfs

客户端和服务端都集成入MenuOS后,此时可以在QEMU下输入replyhi,然后输入hello得到如下结果:


四 gdb调试
先修改menu目录下的Makefie文件,在上一次修改的那一行末尾添加  -append nokaslr -s -S
重启qemu:
cd ../../menu
make rootfs

千万不要关闭此终端和QEMU界面
再重新开启一终端,如在MenuOS目录所在的用户家目录下,在这个终端内使用gdb,输入如下命令:
gdb
file ~/MenuOS/linux-5.0.1/vmlinux
target remote:1234
break start_kernel
c
list

结果如下图,可以清楚看到gdb追踪到start_kernel函数,断点在init/mian.c的538行:





posted @ 2019-12-10 20:58  耶稣都留不住  阅读(173)  评论(0编辑  收藏  举报