本次实验环境是: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编译
make (这个过程比较慢,可以加参数-j * ,选择编译时的cpu核数,加快编译速度)
二、Qemu加载内核
下载qemu、MenuOS
sudo apt install qemu # 安装qemu
git clone https://github.com/mengning/menu.git #下载MenuOS
制作根文件系统镜像
mkdir rootfs #为MenuOS创建根目录
cd menusudo apt-get install libc6-dev-i386#在64位环境下编译32位#此时注意在初始化根目录之前要修改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键,否则会报错
#创建软链接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/menuvi 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函数设置断点
来源:https://www.cnblogs.com/andyflyto/p/12031421.html