本文共 1644 字,大约阅读时间需要 5 分钟。
本次实验基于以下工具和平台完成:
从源码仓库下载内核源码(例如5.0.1版本):
xz -d linux-5.0.1.tar.xztar -xvf linux-5.0.1.tarcd linux-5.0.1
安装编译所需依赖工具:
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
如果出现依赖错误,逐一安装缺失的工具,如:
sudo apt install libssl-dev
生成32位内核配置并编译:
make i386_defconfigmake menuconfig
在“Kernel hacking”选项中启用调试信息选项。
编译完成后,进入内核目录并生成镜像文件:
make -j4
创建rootfs文件系统:
mkdir rootfs
克隆并编译用户空间程序:
git clone https://.../menu.ccd menugcc -m32 -o init linktable.c menu.c test.c -staticcd ../rootfs
生成镜像文件:
find . | cpio -o -H newc | gzip -9 > rootfs.img
安装并配置QEMU:
sudo apt install qemusudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
启动内核并测试:
qemu -kernel linux-5.0.1/arch/x86/boot/bzImage
克隆并编译用户空间程序:
git clone https://.../menu.ccd menugcc -m32 -o init linktable.c menu.c test.c -staticcd ../rootfs
生成镜像文件并启动:
find . | cpio -o -H newc | gzip -9 > rootfs.imgqemu arch/x86/boot/bzImage -initrd rootfs.img
本次实验以172号系统调用(prctl()
)为测试目标,编写一个用户空间程序:
#include#include #include void* tmain(void* arg) { char name[32]; prctl(PR_SET_NAME, (unsigned long)"xx"); prctl(PR_GET_NAME, (unsigned long)name); printf("%s\n", name);}int main(void) { pthread_t tid; pthread_create(&tid, NULL, tmain, NULL); pthread_join(&tid, NULL); return 0;}
在本次实验中,重点分析了系统调用机制。通过调试发现,用户程序调用系统调用时,CPU切换至内核态,内核通过int 0x80
触发中断处理,根据中断门号找到对应的内核函数执行。实验过程中,通过GDB设置断点,观察了系统调用过程中的寄存器状态变化,进一步理解了系统调用的工作机制。
通过本次实验,掌握了如何在QEMU环境下调试内核,并深入理解了系统调用与中断处理的关系。
转载地址:http://rokfk.baihongyu.com/