1、 搭建MenuOS系统
如果使用自己的Linux系统,则需要自己搭建MenuOS系统。以下以Ubuntu上搭建MenuOS为例。
下载内核源代码编译内核
mkdir LinuxKernel #创建一个项目目录
cd LinuxKernel
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz #下载linux-5.0.1的内核
xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar #解压缩
cd linux-5.0.1
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev#安装内核编译工具
make i386_defconfig#生成32位x86的配置文件
make menuconfig
第一项进行保存退出
make #时间较长
2、 制作根文件系统
cd ~/LinuxKernel/
sudo apt install qemu # 安装qemu命令
git clone https://github.com/mengning/menu.git
mkdir rootfs
cd menu
sudo apt-get install libc6-dev-i386 #在64位环境下编译32位安装
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu #建立一个软链接 之后可以直接执行qemu
vim Makefile #修改一下Makefile文件
qemu -kernel ../linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img #创建的根文件系统
make rootfs #初始化根目录
根据以上步骤即可构建出MenuOS。
3、构建Linux内核的gdb调试环境,以下以shiyanlou环境为例进行演示
内核启动完成后进入menu程序,使用help命令可以看到menu支持三个命令 help、version 和 quit.
使用gdb跟踪调试内核
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# 关于-s和-S选项的说明:
# 1. -S
# -S freeze CPU at startup (use ’c’ to start execution)
# 2. -s
# -s shorthand for -gdb tcp::1234
# 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
另开一个shell窗口
# 打开 GDB 调试器
$ gdb
# 在 GDB 中输入以下命令:
# 在gdb界面中targe remote之前加载符号表
(gdb)file linux-3.18.6/vmlinux
# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)target remote:1234
断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel
此时运行结果如下,内核启动到断点处,即start_kernel处停止,我们可以通过list命令查看到start_kernel前后的代码,当然我们也可以设置更多的断点,比如可以设置一个break rest_init,系统执行到rest_init停止,使用list可以查看到rest_init前后的代码。
4、将网络通信程序集成到MenuOS系统中,具体过程如下图所示
输入replyhi和hello命令,查看运行结果,发现在MenuOS上能够完成TCP客户端和服务器发送和接收hello/hi。
参考资料:https://github.com/mengning/net/tree/master/lab3