Linux5.0内核的启动过程, 跟踪分析Linux内核的启动过程

学号后三位:426。原创做品转来自: https://github.com/mengning/linuxkernel/ ”linux

  举例跟踪分析Linux内核5.0系统调用处理过程git

    • 编译内核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

实验步骤:github

1.下载内核5.0.2版本   下载menuOSvim

wget wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.2tar.xzapp

xz -d linux-5.0.2.tar.xz函数

tar -xvf linux-5.0.2.tar 工具

git clone https://github.com/mengning/menu.gitflex

 

安装内核编译⼯工具  ui

sudo apt install build-essential flex bison libssl-dev libelf-dev   libncurses-devspa

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用来传递参数,若参数较多,则把指向内存的指针存入寄存器。
相关文章
相关标签/搜索