深入理解系统调用

Posted xiehuichina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解系统调用相关的知识,希望对你有一定的参考价值。

本人学号末位为10

一、环境准备

上次实验已经下载好内核源码参考https://www.cnblogs.com/russian/p/12873826.html,接下来进行内核编译选项。

配置内核编译选项,首先打开debug相关选项 ;选择进入Kernel Hacking

技术图片

 

接着选择 Compile-time checks and compiler options --> 修改下列两个选项为Y

技术图片

技术图片

技术图片

 

 保存之后退出。

二、制作根文件系统

1.下载跟文件系统  :axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2  tar -jxvf busybox-1.31.1.tar.bz2     cd busybox-1.31.1 

2.制作根文件系统:make menuconfig

编译成静态链接,不用动态链接库:在setting中设置

技术图片

 

 

然后编译安装,默认会安装到元年吗目录下_install目录中    make -j$(nproc) && make install

3.接着制作内存根文件系统镜像
    mkdir rootfs
    cd rootfs
    cp ../busybox-1.31.1/_install/* ./ -rf
    mkdir dev proc sys home
    sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/
4.准备添加init脚本文件放根目录下,
    touch init.sh
    vi init.sh
    i键入内容如下:
     #!/bin/sh
     mount -t proc none /proc mount -t sysfs none /sys
     echo "Wellcome MengningOS!" echo "--------------------"
     cd home
     /bin/sh
    保存退出 :wq

    接着给init脚本添加可执行权限: chmod +x init
    打包成内存根文件系统镜像:find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
    测试挂在根文件系统,看内核启动完是否执行脚本:qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz
技术图片

 

 

三、系统调用

1.查看系统调用
    打开内核源码中中断调用号,找到与自己学号末尾相同的中断服务例程,目录为linux-5.4.34/arch/x86/entry/syscalls/syscall_64.tbl
技术图片

 

 可知第10号调用为mprotect ,对应的处理函数为__x64_sys_mprotect。

2.编写汇编调用代码

 技术图片

 

 

由于我们搭建的系统不支持动态链接,因此这里我们在使用gcc编译时要用-static静态编译参数)。

    gcc test.c -o test -static

 3.重新执行根文件系统(重新打包,用qemu运行)

    find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
    qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz
技术图片

 

 

四  gdb调试。

    1. 启动gdb调试

    首先命令行启动qemu:    

    qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s -nographic -append "console=ttyS0"
   然后重新开一个命令行,在源码目录下启动gdb
    gdb vmlinux
   接着在gdb中运行:target remote:1234

技术图片

 

 

然后给对应大的系统调用打上断点。如图成功触发断点。

技术图片

 

 2.gdb单步调试

技术图片

 

 技术图片

 

 

五 结果分析‘

    系统调用的保存现场和恢复现场;entry_SYSCALL_64是系统调用的入口点,它完成了保存现场,调用对应的内核处理函数、恢复现场、系统调用返回等工作。

技术图片

 

 汇编指令syscall 触发系统调用,通过MSR寄存器找到了中断函数入口;

技术图片

 

 可以看到,它没有使用sava_all命令保存现场,而使用了特殊的swapgs,来快照式地保存现场,加快了系统调用的速度。

技术图片

 

 接着跳转获得系统调用号,执行系统调用的内容

技术图片

 

 调用结束,恢复到用户态执行syscall_return_slowpath 函数要为恢复现场做准备

技术图片

 

 swapgs——恢复现场

 

以上是关于深入理解系统调用的主要内容,如果未能解决你的问题,请参考以下文章

深入理解系统调用

深入理解系统调用

深入理解计算机操作系统(笔记)

深入理解系统调用

深入理解系统调用

深入理解系统调用