Linux5.0内核的启动过程, 跟踪分析Linux内核的启动过程
学号后三位:426。原创作品转来自: https://github.com/mengning/linuxkernel/ ”
举例跟踪分析Linux内核5.0系统调用处理过程
- 编译内核5.0
- qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
- 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析
https://github.com/mengning/menu - 给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中注明“原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ ”,博客内容的具体要求如下:
- 题目自拟,内容围绕系统调用进行;
- 博客中需要使用实验截图
- 博客内容中需要仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程
- 总结部分需要阐明自己对系统调用工作机制的理解。
实验环境
- Ubuntu 16.04
- gcc
实验步骤:
1.下载内核5.0.2版本 下载menuOS
wget wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.2tar.xz
xz -d linux-5.0.2.tar.xz
tar -xvf linux-5.0.2.tar
git clone https://github.com/mengning/menu.git
安装内核编译⼯工具
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
cd linux-5.0.2
配置编译内核
make i386_defconfig #⽣生成32位x86的配置⽂文件
make menuconfig #开启⽂文本菜单选项,对窗⼝口有限制,尽量量调⼤大窗口找到kernel hacking,->Compile-time checks and compiler options,选择 [*]compile the kernel with debug info 保存退出
make -j8 可以让编译的速度快很多
然后切换到Menu目录
cd ../menu
修改Makefile文件
将内核改为自己对应的内核版本
然后编译make rootfs 生成一个镜像文件 rootfs.img
qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd rootfs.img 启动镜像文件
跟踪调试内核启动
qemu-system-i386 -kernel linux-5.0.2/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr
开启一个新的终端
cd linuxkernel/linux-5.0.2
gdb
(gdb)vmlinux
(gdb) target remote:1234
我的学号后两位是26。对应的系统调用函数是:Ptrace vim /usr/include/asm/unistd_32.h
系统调用的触发及参数传递
- 当调用一个系统调用时,CPU从用户态切换到内核态并开始执行一个system_call和系统调用内核函数。在Linux中通过执行int 0x80来触发系统调用,内核为每个系统调用分配一个系统调用号,用户态进程必须明确指明系统调用号,需要使用EAX寄存器来传递。
- 系统调用可能需要参数,但是不能通过像用户态进程函数中将参数压栈的方式传递,因为用户态和内核态有不同的堆栈,必须通过寄存器的方式传递参数。
- 概括:EAX用来传递系统调用号,EBX、ECX、EDX、ESI、EDI、EBP用来传递参数,若参数较多,则把指向内存的指针存入寄存器。