工作环境:虚拟机下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行: