1.系统调用接口

1. 系统调用接口

1.1 Linux系统调用概念

  • 系统调用(systemcall): 所有的操作系统在内核里都有一些内建的函数,这些函数完成对硬件的访问和对文件的打开、读、写、关闭等操作。 Linux 系统中称这些函数为系统调用。这些函数实现了将操作从用户空间转换到内核空间,有了这些接口函数,用户就可以方便地访问硬件。

一个已经安装的系统所支持的系统调用都可以在/usr/include/bits/syscall.h 文件里看到 。

  • Linux 将程序的运行空间分为内核空间和用户空间,它们分别运行在不同的级别上。在逻辑上,它们是相互隔离的。 内核模式可以执行一些特权指令并进入用户模式,而用户模式不能直接进入内核模式,除非通过系统调用,此时,程序运行空间将会从用户空间转移到内核空间,处理完毕后再返回到用户空间。

1.2 用户编程接口(库函数)

  • 概念:用户编程接口是为用户编程过程提供的各种功能库函数(API),包括网络编程接口、图形编程接口、数据库编程接口等,它们遵循POSIX 标准。但它不是系统调用,与系统调用之间存在一定的联系和区别。前者只是一个函数定义,说明了如何获得一个给定的服务;而后者是通过软中断向内核态发出一个明确的请求。如果按照层次关系来分,系统调用为底层,而用户编程接口为上层。一个用户编程接口由 0 个或者多个系统调用组成。

1.3 内核服务例程(sys_abc()

  • 为了通过系统调用号来调用不同的内核服务例程,系统必须创建并管理好一张系统调用表。该表用于系统调用号与内核服务例程的映射。Linux 用数组 sys_call_table 表示这个表,该表的每个表项中存放着对应内核服务例程的指针,而该表项的下标就是该内核服务例程的系统调用号。 Linux 规定,在 i386 体系中,处理器的寄存器 eax 用来传递系统调用号。

1.4 系统调用过程

  • 通常情况下, abc()系统调用对应的服务例程的名字是 sys_abc()。下图表示了系统调用和应用程序、对应的封装例程、系统调用处理程序及系统调用服务例程之间的关系。

image-20240222231707718

  • 下面使用一个例子来简单说明系统调用过程:
    1. 用户程序中调用库函数 abc()
    2. 系统加载 libc 库调用索引和参数后,执行 int $0x80 或者 sysenter 汇编指令进入系统调用(在老版本的 Linux 内核中只支持 int $0x80 中断方式),执行 system_call()函数;
    3. system_call()函数根据传递过来的参数处理所有的系统调用。使用 system_call_table[参数]执行系统调用。
    4. 系统调用返回;
    5. 执行 iret 或者 sysexit 汇编指令两种方式退出系统调用,并调用 resume_userspace()函数进入用户空间。
    6. 继续在 libc 库中执行,执行完成后返回到用户应用程序中。

1.5 系统调用传递的参数

  • 系统调用中输入输出的参数为实际传递的值或者是用户态进程的地址,或者是指向用户态函数指针的数据结构地址。传递的参数放在寄存器 eax 中,即系统调用号。寄存器传递参数的个数满足两个条件:
    • 参数的长度不超过寄存器的长度,如果是 32 位平台不超过 32 位, 64 位平台不超过 64 位。
      如果是 32 位平台不超过 32 位, 64 位平台不超过 64 位。
    • 不包括 eax (i386体系结构下)中的系统调用号,参数的个数不超过 6 个。

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

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

相关文章

SpringMVC 学习(二)之第一个 SpringMVC 案例

目录 1 通过 Maven 创建一个 JavaWeb 工程 2 配置 web.xml 文件 3 创建 SpringMVC 配置文件 spring-mvc.xml 4 创建控制器 HelloController 5 创建视图 index.jsp 和 success.jsp 6 运行过程 7 参考文档 1 通过 Maven 创建一个 JavaWeb 工程 可以参考以下博文&#x…

Python isinstance函数

在Python编程中,isinstance()函数是一个常用的内置函数之一。它用于检查一个对象是否是某个类(或者某个类的子类)的实例。这个函数非常有用,可以在编写代码时进行类型检查,确保代码的健壮性和可靠性。本文将深入探讨Py…

无人机竞赛常用目标检测方法--色块检测

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接:https://github.com/zzhmx/Using-color-gamut-limitations-such-as-HSV-and-RGB-for-object-detection.git 主要使用传统算法,如果想要使用进阶版机器学习算法,请…

【动态规划】【前缀和】【推荐】2463. 最小移动总距离

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 本文涉及知识点 动态规划汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 2463. 最小移动总距离 X 轴上有一些机器人和工厂。给你一个整数数组 robot &#xff0c…

2001~2023年中国MOD17A3HGF NPP数据

各位同学们好&#xff0c;今天和大伙儿分享的是2001~2023年中国MOD17A3HGF NPP数据。如果大家有下载处理数据等方面的问题&#xff0c;请私信或评论。 Running, S., M. Zhao. <i>MODIS/Terra Net Primary Production Gap-Filled Yearly L4 Global 500m SIN Grid V061<…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四 01.解数独02.单词搜索03.黄金矿工04.不同路径 III 01.解数独 题目链接&#xff1a;https://leetcode.cn/problems/sudoku-solver/ 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&am…

springboot+vue网站开发02-前端页面的渲染代码展示

springbootvue网站开发02-前端页面的渲染代码展示&#xff01;经过上面2个小节的分享&#xff0c;我们已经准备好了前端渲染所需要的数据接口了。可以给大家正常返回新闻分类的信息了。 下面给大家看看&#xff0c;前端vue网站开发的代码&#xff0c;已经渲染的业务流程是什么。…

C++ Primer Plus 笔记(持续更新)

编译器的正解 数据&#xff0b;算法程序 赋值从右向左进行 cin&#xff0c;cout的本质也是对象 类和对象的解释

通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试,发布到CSDN

效果图 设备树代码 myplatform{compatible "hqyj,myplatform";led1-gpio<&gpioe 10 0>;led2-gpio<&gpiof 10 0>;led3-gpio<&gpioe 8 0>; interrupt-parent <&gpiof>;interrupts<9 0>;reg<0X12345678 …

Linux入门攻坚——15、进程和作业管理

一个完整的计算机系统&#xff1a;静态 最底层是硬件&#xff0c;硬件之上是操作系统&#xff0c;也叫内核&#xff08;即kernel&#xff09;&#xff0c;操作系统提供的是系统调用&#xff0c;在内核之上&#xff0c;是各种库&#xff0c;提供库函数&#xff0c;在此之上是各种…

xff注入 [CISCN2019 华东南赛区]Web111

打开题目 看见smarty 想到模板注入 又看见ip 想到xff注入 一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号。该题目的Smarty版本是3.1.30 在Smarty3的官方手册里有以下描述: Smarty已经废弃{php}标签&#xff0c;强烈建议不要使用。在Smarty 3.1&#xff…

【工具】阿莫智能设备之脱机烧录器K202C-1

注意&#xff0c;本文档仅仅是介绍烧录器的资料构成&#xff0c;并非烧录器的说明书&#xff0c;详细请看各对说明书及视频。 1. 资料图解 首先需要下载资料&#xff0c;通常稳定发布版本可以从 www.amomcu.cn 下载&#xff0c; 也可以向我们客服获取最新版本&#xff0c; 获…