首页 > 其他分享 >系统调用

系统调用

时间:2023-08-05 17:01:23浏览次数:44  
标签:调用 系统 指令 0x80 内核 用户程序

系统调用

系统调用是什么:   系统调用是用户在编程时调用的操作系统功能。

系统调用的作用:   系统调用是操作系统提供给编程人员的唯一接口;使CPU状态从用户态陷入内核态的唯一途径。

典型系统调用举例:每个操作系统都提供几百种系统调用(进程控制、进程通信、文件使用、目录操作、设备管理、信息维护等)。

系统调用、库函数、API、内核函数的关系

  

 如图所示,应用程序当然可以直接使用系统调用,但是通常情况下,都是在应用程序中先去加载C函数库或者API接口,由这两个东西去申请系统调用。然后系统调用由内核封装而成,并不是每个内核函数都能被系统调用,有些是被禁止的。

每个C函数库最终使用的系统调用可能有多个,也有可能多个C函数对应一个系统调用,呈现一对多、多对一的情况。

系统调用机制的设计

  1. 中断/异常机制 -- 支持系统调用服务的实现
  2. 选择一条特殊指令:陷入指令(亦称访管指令) 。引发异常,完成用户态向内核态的切换
  3. 系统调用号和参数:因为存在很多的系统调用,为了区分,每个系统调用都事先给定一个编号(系统调用功能号),也会有一些参数。
  4. 系统调用表:存放系统调用服务例程的入口地址

参数传递过程的问题

一般的函数调用都是通过栈来传递参数的,但是用户程序不能把参数推到系统的栈里去,这是不允许的。那我们如何将用户调用函数的参数传递给内核呢?

常用的3种实现方法:

 

系统调用举例

转变成的汇编语言:

movl $4,$eax    //这是一条x86架构下的汇编指令,它的作用是将立即数4(即常数4)移动到寄存器eax中。是write()的系统调用功能号。
int $0x80    //用于在x86架构的处理器上触发系统调用(System Call)。系统调用是一种特殊的操作,允许用户程序请求操作系统提供的服务和资源,如文件操作、进程管理等。

解释该陷入指令的含义:

  • int: 这是x86汇编指令中的"interrupt"指令,用于触发中断。
  • $0x80: 这是一个立即数操作数,表示中断向量号。在x86架构中,中断向量号0x80(十进制为128)是用于系统调用的。

当执行int $0x80指令时,处理器会切换到内核模式,进入内核中的系统调用处理程序。内核会根据寄存器中的信息,确定用户程序请求的服务类型和参数,并执行相应的系统调用。系统调用完成后,处理器会从内核态切换回用户态,继续执行用户程序的下一条指令。

 

系统调用的执行过程

当CPU执行到特殊的陷入指令时:

  • 中断/异常机制:硬件保护现场;通过查中断向量表来将CPU控制权转给系统调用总入口程序。
  • 系统调用总入口程序:保存现场;将参数保存在内核的堆栈里;通过查系统调用表把控制权转给相应的内核函数或者是系统调用的处理程序。
  • 执行系统调用例
  • 恢复现场,返回用户程序

 

Linux系统调用执行流程

  1.  用户态下调用C库的库函数,比如write()。
  2. 封装后的write()先做好参数传递工作,然后使用int 0x80指令产生一次中断/异常。
  3. 然后就陷入了内核态, CPU通过0x80号在IDT(中断描述符表)找到对应的服务例程system_call(),并调用之,这个是总的系统调用的入口地址。
  4. 然后其实在陷入之前,已经做好了一些压栈工作,比如一些重要的寄存器,用户栈的信息,EFLAGS信息和返回地址(不然系统调用结束后不知道怎么返回)。但是陷入之后呢,system_call这个主控程序还要把eax再压栈,再把剩余的其他寄存器的内容全部压栈(SAVE_ALL)。

     system_call():将参数保存在内核栈;根据系统调用号(系统功能号)索引系统调用表,找到系统调用程序入口,比如sys_write()。

    5. sys_write()执行完后,经过ret_from_sys_call()例程返回到用户程序。

 

标签:调用,系统,指令,0x80,内核,用户程序
From: https://www.cnblogs.com/kongyijin/p/17607296.html

相关文章

  • Linux系统下将java程序开机自启
    Linux系统下将java程序开机自启在Linux环境下,可以通过将Java程序配置为系统服务(systemd服务)来实现开机自启动。使用systemd可以很方便地管理和控制后台服务,包括Java程序。以下是一个简单的步骤来配置Java程序为systemd服务:1.编写启动脚本创建一个脚本文件,用于启动您的Java程序......
  • C# 如何调用C++ dll string类型返回
    这篇文章主要介绍了C# 如何调用C++ dll string类型返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 −目录C#调用C++dllstring类型返回C++端:(定义返回数据为结构体Vector4)C#端:(接收返回的结构体Vector4)C#调用C++dll类型......
  • PLC、DCS、SCADA系统通过OPC智能网关与云平台实时通讯
    OPC作为一种工业控制领域常用的标准通信规约,如PLC、DCS、SCADA等工业自动化系统大多提供了基于OPC规约的数据访问接口,通过OPC智能网关即可采集自动化设备系统数据并将数据传输至云端,打通工业系统数据孤岛,实现数据的互联互通,利用云端大数据平台对数据进行智能化运营。物通博联推出的......
  • 基于工业互联网实现MES系统中的设备智能管理
    MES系统是制造业工厂常用的一种操作管理系统,通过对生产流程进行实时监控和管理控制,帮助企业更好的关注到生产进度、物料消耗、设备状态等信息,从而帮助优化生产工艺与提高效率,因此设备管理是MES系统重要的组成部分,可以实现设备实时监控、故障预警、控制管理等功能,从而提高设备的可靠......
  • 在不增加成本的情况下引导开发人员做好功能自测的“开发与测试岗位更名为系统红蓝军”
    作为企业IT部门某个开发团队负责人的你,从书上和大佬那里得知,软件开发团队中的开发人员,如果在将所完成的功能提交给测试人员之前,加强自测,那么就能降低软件开发过程中的返工。于是你为每位开发人员,都准备了自测环境。然后告诉开发人员,在完成功能的开发,向测试人员提测前,需要在自测环......
  • ITK在C++文件里面,可以这样调用开旁路的函数
    问题:如果直接在c++文件引入开旁路函数POM_AM__set_application_bypass,是编译不通过的(PS:好像是因为开旁路函数是用C写的,和C++不兼容,具体也不是很懂的,有懂的大佬,可以帮忙评论解答下) 解决方法:在c++文件前面加上这行extern"C"intPOM_AM__set_application_bypass(logicalbypa......
  • 函数(void *) 被谁调用了——图像采集卡经验总结
    一块图像采集卡上有两个CameraLink接口,程序里“采集卡”理解为:一个接口就是一个采集卡。即工控机上插一块,就是两个采集卡对象。【问题】函数(void*)被谁哪个采集卡调用了?下面通过IKap、Matrox、Silicon三个采集卡的案例来理解1、2、3、Windows的创建线程函数,LPVOID其实......
  • 基于瑞萨RA6M5的环境监测系统设计
    基于瑞萨RA6M5的环境监测系统设计1.设计简介本项目初步设计思路是打算以瑞萨单片机作为控制和数据处理的单元,使用温湿度,光照传感器去监测周围的环境参数,在屏幕上完成传感器数据和相关信息的显示。同时,使用WIFI无线模组与单片机之间进行数据交互,接入物联网云平台。尝试利用上位......
  • 基于java的商场停车场系统
    商场停车场作为一个业务比较繁忙的重点管理场所,大多数商场停车场的管理者都主要考虑降低成本,提升商场停车场服务满意度。一年一度的商场促销大促销活动,引来众多的消费者,也停车场带来了沉重的停车压力,如何能够最大限度的提升停车场管理工作效率成为热门的研究课题。本文通过调研商场......
  • 基于SSM框架的停车场管理系统
    以往的停车场管理事务处理主要使用的是传统的人工管理方式,这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点,长期的人工管理模式会产生大量的文本文件与文本数据,这对事务的查询、更新以及维护带来不少困难。随着互联网时代的到来,现如今网络的覆盖率已近非常的全面,现在人......