热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:深入理解系统调用

本文由编程笔记#小编为大家整理,主要介绍了深入理解系统调用相关的知识,希望对你有一定的参考价值。1.系统调用的概念用户态与内核态:
本文由编程笔记#小编为大家整理,主要介绍了深入理解系统调用相关的知识,希望对你有一定的参考价值。


1.系统调用的概念

用户态与内核态:

技术图片

 

32 位 Linux 进程地址空间:

技术图片

 

系统调?概述:

技术图片

 

 Linux的系统调?:

技术图片

 

 2.环境准备

编译选项:

技术图片

 

 技术图片

 

 编译内核并运行:由于还未挂载根文件系统,因此出现kernel panic。

技术图片

 

 制作根文件系统:

配置编译选项:

技术图片

 

 编写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

  技术图片

 

 3.系统调用分析

本人学号末2位为95,查看95号系统调用:

技术图片

 

 umask用于设置文件和目录的默认访问权限。

 

编写代码调用这一系统调用:


int main()
{
  asm volatile(
  "movl $0x5f,%eax
"
  "syscall
" );
  return 0;
}

静态编译后将可执行文件拷贝到rootfs/home目录下,重新生成根文件系统。

再次运行虚拟机,可以发现已经成功拷贝该文件。

技术图片

 

进行跟踪调试:

由于umask对应的内核处理函数为 __x64_sys_umask,因此在__x64_sys_umask处断点。

技术图片

 

 查看函数调用堆栈:

技术图片

 

不难发现,entry_SYSCALL_64是系统调用的入口,完成 保存现场的功能。进入该函数:

技术图片

 

 swapgs指令用于保存现场。这是在x86-64中引入的指令,类似快照的?式将保存现场和恢复现场时的CPU寄存器也通过CPU内部的存储器快速保存和恢复,近?步加快了系统调?。

继续运行,回到do_syscall函数,这个

技术图片

 

 可以发现,rax存储了系统调用号。通过系统调用表调用相应的系统调用函数,然后将返回值存入rcx寄存器中。

继续执行,回到entry_SYSCALL_64函数中,这一部分的代码用于恢复现场。

 技术图片

 

 4.总结

系统调用的流程大致如下:

首先,通过汇编指令中的系统调用号找到系统调用入口ENTRY(entry_SYSCALL_64),然后在ENTRY(entry_SYSCALL_64)中,执行swapgs保存现场。随后执行do_syscall_64方法,该方法中,执行x32_sys_call_table方法,根据rax中存储的系统调用号跳转至具体的系统调用函数,在本例中,为__x64_sys_umask。系统调用函数执行完毕后,返回ENTRY(entry_SYSCALL_64)方法,执行恢复现场操作。

 


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
白日星445533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有