3分钟了解syscall系统调用|详细易懂的流程

文章目录

  • syscall
    • 1.简介
    • 2.详细解释
    • 3.具体举例
    • 4.比喻解释
    • 5.作用
    • 6.优点
    • 7.总结
  • syscall和int 0x80有什么不同?
    • 1. 上下文切换效率
    • 2. 指令执行流程
    • 3. 兼容性
    • 总结
  • syscall 具体流程
    • 1. 用户空间准备
    • 2. 执行syscall指令
    • 3. 切换到内核态
    • 4. 内核模式下执行系统调用
    • 5. 返回用户空间

syscall

1.简介

系统调用(syscall)是操作系统提供给程序以请求内核服务的一种机制。和int 0x80提供相同的服务。

2.详细解释

在计算机系统中,操作系统控制着对硬件资源的访问。应用程序不能直接操作硬件,而是需要通过操作系统提供的接口。系统调用就是这些接口之一,允许应用程序执行诸如读写文件、发送网络请求、创建进程等操作。系统调用作为用户空间(应用程序执行的地方)和内核空间(操作系统核心部分执行的地方)之间的桥梁,确保资源使用的安全性和有效性。

3.具体举例

以Linux操作系统中的read()系统调用为例。当一个程序想要从文件中读取数据时,它会执行以下步骤:

  1. 程序调用read()函数,并提供文件描述符(文件的唯一标识)、存放数据的缓冲区地址和要读取的字节数。
  2. read()函数将这些参数传递给操作系统内核。
  3. 内核检查参数的有效性,然后从文件系统中读取数据到缓冲区。
  4. 读取完成后,控制返回给程序,程序可以使用缓冲区中的数据。

4.比喻解释

可以将系统调用比作餐厅里的服务员。就像顾客不能直接进入厨房取菜,而需要通过服务员传达他们的需求一样,应用程序也不能直接访问硬件资源,而需要通过系统调用来请求操作系统执行特定的任务。

5.作用

系统调用使应用程序能够执行文件操作、进程控制、通信等操作,同时确保了操作系统能够控制和管理资源访问,保证系统的稳定性和安全性。

6.优点

安全性: 隔离用户程序和内核,防止直接的硬件访问导致的安全问题。
易用性: 提供了标准化的接口,简化了程序对硬件的操作。
兼容性: 应用程序通过系统调用与操作系统交互,减少了对特定硬件的依赖。

7.总结

系统调用是操作系统提供给应用程序的一种重要接口,它使得程序能够安全、有效地执行需要操作系统干预的操作,如文件处理、进程管理等。尽管系统调用引入了一定的性能开销,但它的安全性和易用性使得它成为操作系统设计中不可或缺的一部分。

syscall和int 0x80有什么不同?

1. 上下文切换效率

INT 80h:指令 INT 80h 触发软件中断。执行时,CPU 需要在处理中断之前保存程序的当前状态,包括各种寄存器。此过程是一个上下文切换,它涉及大量开销,因为 CPU 实质上是在暂停一个任务以启动另一个任务。

syscall: 该 syscall 指令旨在最大限度地减少需要保存和恢复的状态量,从而减少上下文切换开销。这是从用户模式到内核模式的更直接的过渡,需要更少的 CPU 时间和资源使用

2. 指令执行流程

INT 80h: 使用 INT 80h ,中断处理机制更复杂。CPU 必须跳转到中断向量,然后中断向量指向相应的内核例程。这会增加额外的步骤并增加指令的路径长度。
syscall: syscall 提供更直接的路径。它使用特殊的 CPU 寄存器直接跳转到内核中的系统调用处理程序。这种较短的路径意味着仅向内核发送系统调用请求所花费的 CPU 周期更少。

3. 兼容性

虽然 syscall 效率更高,但只能用于特定的CPU体系架构。INT 80h具有向后兼容性,对于不可以使用syscall的机器或旧软件上尤为重要。

总结

SYSCALL减少了上下文切换和简化了指令执行流程,性能更高,但对旧机器的兼容性不如int 80h.

syscall 具体流程

当执行系统调用的时候,具体的执行流程如下。
请添加图片描述

1. 用户空间准备

在用户空间中,在执行 syscall 指令之前,应用程序会设置系统调用号及其参数。这通常是通过将系统调用号放在寄存器中(对于 x86-64 体系结构)并将参数放在其他 RAX 寄存器(如 RDI, RSI, RDX, R10, R8 和 R9 )中来完成的。

2. 执行syscall指令

应用程序执行syscall CPU 指令。和add,mov一样,这是专为转换到内核模式以执行系统调用而设计的 CPU 指令。读取到该指令后,CPU就会依次完成下面工作。

3. 切换到内核态

CPU从用户态(ring 3)切换到内核模式(ring 0),以获得更高的执行权限。
这一步步骤的具体流程

1. 最小的上下文保存
a). CPU 自动将指令指针RIP保存到寄存器中 RCXRIP 指向应用程序中应在系统调用完成后执行的指令
b). 将包含 CPU 当前状态的 RFLAGS 寄存器保存到寄存器中R11 。这包括中断启用/禁用标志等标志。

这种最小的上下文保存是提升INT 80h 效率的关键改进之一。

2. 直接跳转到系统调用处理程序
CPU载入模型特定寄存器(MSR)IA32_LSTAR,其中包含内核中系统调用入口点的地址直接跳转到系统调用处理程序。这种直接跳转是相对于 INT 80h 方法的另一个效率改进,INT 80h 方法需要遍历中断描述符表。

至此,完成了内核态的切换,下面开始在内核模式下执行系统调用的程序。

4. 内核模式下执行系统调用

1. 执行调度程序
CPU 现在处于内核模式,在IA32_LSTAR 指向的地址处执行代码。这是Linux 内核中的系统调用调度程序。

调度程序从 RAX 寄存器中读取系统调用号。根据该调用号,从内核系统调用表中查找到相应的内核函数

调度程序调用系统调用号对应的函数。该函数的参数取自寄存器(RDI、RSI、RDX、R10、R8、R9)。

2. 执行内核函数
内核函数执行。这可能涉及各种操作,例如访问文件、创建进程或修改系统设置,具体取决于调用的系统调用。
完成后,内核函数通常会返回一个结果,该结果将放置在寄存器中 RAX

5. 返回用户空间

处理完系统调用后,内核需要将控制权交还给用户空间中的应用程序。
CPU执行sysret 指令。此指令针对从系统调用返回进行了优化。
sysret 恢复 CPU 的用户模式操作状态。它从 RCX 寄存器加载 RIP,从 R11 寄存器加载 RFLAGS,有效地返回到执行syscall之前的状态。
CPU 切换回用户模式,并在原始系统调用指令之后立即在应用程序中继续执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处: 众所周知CPU是用来处理游戏的逻辑运算的,而GPU是用来处理游戏中图像的。在GPU中,我们要绘制一个图像需要提交图片(纹理)到显存,然后再进行绘制(在这个过程中会产生一次DrawCall…

html websocket的基本使用

html websocket的基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"w…

【投稿】计算机-AI相关期刊/会议了解和推荐

期刊 CCF相关推荐期刊 Artificial Intelligence (AI) AI领域的旗舰刊,人家都叫AI了好叭。身边有小伙伴半年给了大修,三个审稿人,其中有两个看的非常非常详细,问了许多问题,要加一堆实验(我觉得就是相当于重做了)。大修审稿周期给了半年(我算是知道为什么顶刊都这么慢…

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统&#xff08;完整项目&#xff09; 前言1、搭建步骤及方法2、集成多种插件功能&#xff0c;实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结&#xff1a; 前言…

Python实现观察者模式

观察者模式是一种设计模式&#xff0c;其中一个对象&#xff08;称为主题&#xff09;维护一组依赖于它的对象&#xff08;称为观察者&#xff09;&#xff0c;当主题的状态发生变化时&#xff0c;它会通知所有观察者。这种模式常用于实现分布式事件处理系统。 下面是一个简单…

Scikit-Learn线性回归(三)

Scikit-Learn线性回归三&#xff1a;综合实践 1、线性回归理论回顾2、数据分析与问题提出3、简单线性回归实践4、多项式回归实践5、多元线性回归实践 1、线性回归理论回顾 2、数据分析与问题提出 3、简单线性回归实践 4、多项式回归实践 5、多元线性回归实践

C. Perfect Square(矩形旋转之后对应的坐标)

题目&#xff1a; https://codeforces.com/contest/1881/problem/C 思路&#xff1a; 旋转之后对应的坐标&#xff1a; 顺时针旋转 0 90 180 270 分别为&#xff08;i&#xff0c;j&#xff09;&#xff08;j&#xff0c;n1-i&#xff09;&#xff08;n1-i&#xff0c;n1-j&…

LeetCode每日一题 | 2397. 被列覆盖的最多行数

文章目录 题目描述问题分析程序代码&#xff08;Golang 版本&#xff09; 题目描述 原题链接 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 …

C语言,easyx,绘制一个五边形。

#include<stdio.h> #include<easyx.h>//图形库头文件 #include<math.h>//使用三角函数引用头文件 #define PI 3.14//要使用弧度制 int main() { initgraph(800,600);//创建一个窗口&#xff0c;宽度为800&#xff0c;高度为600 setorigin(400, 300);//以…

three.js相机按照指定路线在建筑模型中漫游(支持开始,暂停)

three.js相机按照指定路线在模型中漫游&#xff08;支持开始&#xff0c;暂停&#xff09; 关键点 相机运动曲线 // 相机路线 const points [new THREE.Vector3(0, 40, 300),new THREE.Vector3(50, 40, 300),new THREE.Vector3(50, 40, 50),new THREE.Vector3(150, 40, 50),…

十三、K8S之亲和性

亲和性 一、概念 在K8S中&#xff0c;亲和性&#xff08;Affinity&#xff09;用来定义Pod与节点关系的概念&#xff0c;亲和性通过指定标签选择器和拓扑域约束来决定 Pod 应该调度到哪些节点上。与污点相反&#xff0c;它主要是尽量往某节点靠。 亲和性是 Kubernetes 中非常…

详细解读QLC SSD无效编程问题-2

作者通过SimpleSSD仿真模型&#xff0c;采用SLCQLC混合模式来开展进一步的验证工作。评估过程中&#xff0c;当写入请求到达固态硬盘时&#xff0c;首先会被写入缓存&#xff08;DRAM&#xff09;&#xff0c;然后才被回写到NAND。文中引入了一个名叫做LRU(Least Recently Used…

Ajax同步调用影响加载动画展示问题

问题描述&#xff1a; 在做录入文章到时候&#xff0c;由于外部图片权限问题&#xff0c;在app展示的时候无法访问&#xff0c;所以需要在文章提交的时候做一下图片处理&#xff0c;这里使用ajax同步上传到服务器 返回url替换掉 原来的img的src&#xff1b;问题出现在点提交的…

微机原理练习题答案 13

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) 1、十六进制数5BF.C8转换成二进制数是(C) A. 11011100111111101B B. 010111011011.01101B C. 010110111111.11001B D. 010111011011.11001B 2,最适合进行加减操作的数字编…

【Unity中的A星寻路】Navigation导航寻路系统四大页签详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Nginx(十七) 日志轮训/切割

1.编写shell脚本 Nginx_Log_Path"/usr/local/nginx/logs/" Dateformatdate %Y%m%d mv ${Nginx_Log_Path}/access.log ${Nginx_Log_Path}/access-${Dateformat}.log mv ${Nginx_Log_Path}/access_8688.log ${Nginx_Log_Path}/access_8688-${Dateformat}.log mv ${Ngi…

几种读nii图像方法的轴序比较

读 .nii / .nii.gz 图像并转成 numpy 可用 medpy.io、nibabel、itk、SimpleITK 几种方法&#xff0c;然而几种方法读出来的轴序有出入&#xff0c;本篇比较此几种方法。 Datum 所用数据来自 verse&#xff0c;经 iTomxy/data/verse/preprocess.py 预处理&#xff0c;朝向和轴…

【观察】Aginode安捷诺:坚守“长期主义”,服务中国数字经济

毫无疑问&#xff0c;随着整个社会加速数字化转型&#xff0c;尤其是5G、人工智能、大数据等技术兴起&#xff0c;以及智慧医疗、智慧金融、智能制造等应用加速落地&#xff0c;算力网络在经济社会发展中扮演了愈来愈重要的角色&#xff0c;成为支撑数字经济蓬勃发展的“新引擎…

2023-2024年度安徽省职业院校技能大赛(中职组) 网络空间安全竞赛试题

2023-2024年度安徽省职业院校技能大赛&#xff08;中职组&#xff09; 网络空间安全竞赛试题 &#xff08;总分 1000 分&#xff09; 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分 A.基础设施设置与安全加固&#xff1b;B.网络安全事件响应、数字取证调查和应用安全&#…

根本记不住MySQL进阶查询语句

1 MySQL进阶查询 1.1 MySQL进阶查询的语句 全文以数据库location和Store_Info为实例 ---- SELECT ----显示表格中一个或数个字段的所有数据记录 语法&#xff1a;SELECT "字段" FROM "表名"; select 列名 from 表名 ; ---- DISTINCT ----不显示重复的数…