本次实验环境是:Ubuntu16.0.4 和 Linux5.0.1
一、下载、编译内核
1.1 下载内核
mkdir MenuOS cd MenuOS xz -d linux-5.0.1.tar.xz #解压 tar -xvf linux-5.0.1.tar cd linux-5.0.1
1.2 配置内核
//安装所需依赖包 sudo apt-get install build-essential libelf-dev libncurses-dev flex bison libssl-dev cd /linux-5.0.1/ #使用现存内核的配置文件:(xxx处使用TAB补全) sudo cp /boot/config-xxx -r .config #生成32位x86的配置文件 make i386_defconfig
#开启文本菜单选项
make menuconfig
make menuconfig出现error:Your display is too small to run menuconfig!将terminal调大即可。
之后会弹出如下图形界面,依次选择 Kernel hacking ->Compile-time checks and compiler options ->[ ]Compile the kernel with debug info
然后按Y键,选择 Save ,选择Exit直到退出。
编译
make (这个过程比较慢,可以加参数-j * ,选择编译时的cpu核数,加快编译速度)
二、Qemu加载内核
下载qemu、MenuOS
sudo apt install qemu # 安装qemu git clone https://github.com/mengning/menu.git #下载MenuOS
制作根文件系统镜像
mkdir rootfs #为MenuOS创建根目录
cd menu
sudo apt-get install libc6-dev-i386#下载在64位环境下编译32位所需库
#此时注意在初始化根目录之前要修改Makefile的内容,因为menu中配置文件是Linux 3.18.6,这里要改为5.0.1,修改之后如下
#qemu -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img
#创建软链接,直接使用qemu命令
sudo ln -s /usr/bin/qemu-system-i386 usr/bin/qemu
make rootfs
初始化根目录(这里使用MenuOS带的文件系统)
Qemu启动内核,可以看到内核正常启动
qemu -kernel linux-5.0.1/arch/x86_64/boot/bzImage -initrd rootfs.img
三、验证MenuOS的网络
cd ~/MenuOS/
#下载测试程序 git clone https://github.com/mengning/linuxnet.git cd linuxnet/lab2 make cd ../../menu/#这里要修改Makefile文件,同上 make rootfs
#另起一个终端
cd MenuOS/linuxnet/lab3
#修改Makefile文件
make rootfs
输入replyhi,输入hello,收到了hi,证明MenuOS的网络可以正常工作
四、构建Linux内核gdb调试环境
Qemu中启动内核,可以看到Qemu启动显示黑屏,此时是qemu在等待gdb的连接。
cd ~/MenuOS/menu
vi Makefile
#修改Makefile,在qemu-system-x86_64 -kernel ../linux-5.0.1/arch/x86_64/boot/bzImage -initrd ../rootfs.img末尾加上-append nokaslr -s -S
#这里-S freeze CPU at startup
-s shorthand for -gdb tcp::1234 若不想用1234端口,可以使用-gdb tcp::xx取代-s选项
make rootfs
连接gdb server调试
gdb file ~/MenuOS/linux-5.0.1/vmlinux target remote:1234 #设置断点对start_kernel进行跟踪 break start_kernel
继续在rest_init函数设置断点