首页 > 其他分享 >【操作系统】执行系统调用后发生了什么?

【操作系统】执行系统调用后发生了什么?

时间:2024-03-13 23:22:06浏览次数:23  
标签:调用 服务例程 操作系统 系统 外壳 内核 执行 函数

执行系统调用后发生了什么?

什么是系统调用?

系统调用是受控的内核入口,借助于这一机制,进程可以请求内核以自己的名字去执行某些动作。

以应用程序编程接口(API)的形式,内核提供了一系列服务供程序访问。包括创建进程执行I/O,以及为进程间通信创建管道等。

执行系统调用后发生的事件

  1. 应用程序通过调用 C 语言库函数中的外壳(wrapper)函数,来发起系统调用。
  2. 对系统调用中断处理例程来说,外壳函数必须保证所有的系统调用参数可用。通过堆栈,这些参数传入外壳函数,但内核却希望将这些参数置入特定寄存器。因此,外壳函数会将上述参数复制到寄存器。
  3. 由于所有系统调用进入内核的方式相同,内核需要设法区分每个系统调用。为此,外壳函数会将系统调用编号复制到一个特殊的 CPU 寄存器(在 x86_64 中为 %eax)中。
  4. 外壳函数执行一条中断机器指令(int 0x80),引发处理器从用户态切换到核心态,并执行系统中断 0x80(十进制数 128)的中断矢量所指向的代码。
  5. 为响应终端 0x80,内核会调用 system_call() 例程(位于汇编文件 arch/i386/entry.S 中)来处理这次中断,具体如下:
    • 在内核中保存寄存器值。
    • 审核系统调用编号的有效性。
    • 以系统调用编号对存放所有调用服务例程的列表(内核变量 sys_call_table)进行索引,发现并调用相应的系统调用服务例程。若系统调用服务例程带有参数,那么将先首先检查参数的有效性。随后,该服务例程会执行必要的任务,这可能涉及对特定参数中指定地址处的值进行修改,以及在用户内存和内核内存之间传递数据。最后,该服务例程会将结果状态返回给 system_call() 例程。
    • 从内核栈中恢复各寄存器值,并将系统调用返回值置于栈中。
    • 返回至外壳函数,同时将处理器切换回用户态。
  6. 若系统调用服务例程的返回值表明调用有误,外壳函数会使用该值来设置全局变量 errno。然后,外壳函数会返回到调用程序,并同时返回一个整型值,以表明系统调用是否成功。

标签:调用,服务例程,操作系统,系统,外壳,内核,执行,函数
From: https://www.cnblogs.com/yangxuanzhi/p/18071830

相关文章

  • [20240313]toad gather_plan_statistics执行计划相关问题.txt
    [20240313]toadgather_plan_statistics执行计划相关问题.txt--//自己现在已经很少使用toad,使用也是作为辅助功能,毕竟图形界面能更快的操作显示信息.--//昨天遇到一个问题,自己当时没有反映过来,浪费点时间,做一个记录避免以后再次犯浑.--//我一般在toad的sql编辑界面下尽可能看......
  • Vite构建的前端项目在执行 "npm run dev" 命令时报错 "failed to load vite.config.ts
    报错信息:Failedtoloadconfigfromxx/.../xx/vite.config.tserrorduringbuild:Error:Youinstalledesbuildforanotherplatformthantheoneyou'recurrentlyusing.Thiswon'tworkbecauseesbuildiswrittenwithnativecodeandneedstoinstal......
  • JDBC的执行流程!!!
    JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。原始的JDBC操作数据库主要有以下几个步骤:1.注册驱动使用Class.forName()方法加载数据库驱动......
  • MyBatis拦截器执行流程!!!
    前提:将自定义的拦截器注入IOC容器。1、创建自定义拦截器,实现Interceptor接口,重写interceptor()方法2、在自定义拦截器上使用@Interceptors注解,在该注解中使用@Signature指定拦截的接口类型,方法名与参数类型。实例:/**Copyright(c)2020,2024,Allrightsreserved.......
  • 终端安全三要素:芯片、操作系统、应用软件缺一不可
    终端安全问题一直以来都备受关注,随着科技的不断发展,终端设备不仅在数量上呈现爆发式增长,而且在功能和复杂性上也不断提升。为了确保终端设备的安全,我们需要从芯片级别到应用软件层面采取全面的防御策略。01.芯片层面的安全防御1.芯片设计与硬件防护芯片是终端设备的核心,其设......
  • AIOps 智能运维:有没有比专家经验更优雅的错/慢调用分析工具?
    作者:图杨工程师小A刚刚接手他们公司最核心的电商系统的运维工作,小A发现,在生产环境中,系统明明运行得非常稳定,但是总会出现一些“诡异”的情况。比如:偶尔会一些错误调用,但是,还没来得及修,系统又莫名奇妙地恢复正常。应用的平均响应时间很短,但是总会有一些响应时间非常长的离......
  • 代码精简执行过程
    一、代码精简背景随着业务需求的不断增加和产品的逐步完善,我们应用对应的代码库也在日益庞大,其中有用的、无用的、低频使用的、灰度验证的等各种类型的代码堆积在一起,给后续接手的同学增加了很多的维护和学习成本。有些代码逻辑缺乏文档说明,无人能看懂,更不敢随意修改。当有新需求......
  • 使用@FeignClient中的fallback属性处理接口调用异常问题
    说明当使用feign远程调用接口是,如果接口返回异常或者超时时,我们可以统一返回异常信息,这样调用者就不用再显式的try-catch处理异常了开启接口fallback处理想要使用fallback处理接口异常须在配置文件开启feign:hystrix:enabled:true定义feign接口在@FeignClient上......
  • 远程调用归纳
    HttpClient和HttpURLConnection远程调用我们首先想到微服务的组件OpenFeign,但是在单体项目中我们不可能去集成一个专门的远程调用服务,可以使用常见的HttpAPI或者使用Springboot自带的RestTemplate【解决方案】如何使用HttpAPI代替OpenFeign进行远程服务调用-CodeBlogMan......
  • TextIn调用API教程及避坑
    一.API调用在工作台中右上角点击获取机器人,进入产品市场,可以看到所有支持识别的类型,这里以通用文字识别为例,点进去后可以发现新用户有免费的1000次额度。然后点击API文档查看详细使用说明及示例代码CommonOcr类中的id和和secret_code输入自己的Id和密码,即可实现API调用,非......