Linux - 系统调用

系统调用

目录

系统调用

API, Posix和C库

System Call

如何自己搓一个系统调用

Syscall的优缺点

Reference


我们知道,操作系统为底层的硬件架构与上层的应用层进程之间提供了一个抽象。那么这个抽象是如何体现的呢?之前我们谈到过操作系统实际上就是代之应用软件向底层的硬件提出需求。这种代理方式就是向用户层提供一个系统调用。(System Call)这样搞,我们可以有效的防止一个进程随意的使用硬件,侵占其他进程的找资源和破坏系统整体的运行。

API, Posix和C库

我们一般在用户层次使用API接口完成一次操作。我们列举一个例子:

int printf(const char* format, ...);

这个大家都很熟悉了:就是向标准输出输出格式化的字符串。那么,作为C库的一个标准函数,我们实际上在Linux系统下将需求转发到操作系统提供的write接口,这个write接口将会发起一个系统调用表明自己想要请求的服务。

问题来了,write是可移植的吗?显然!如果我们的上层接口不统一,我们就不得不为了移植我们的代码而做出大量的代码更改以求适应接口。所以,我们就有了Posix标准,所有的操作系统都应该实现这些标准,这样的话代码就会是可移植的(至少在软件层次可以移植!)

你可以看到系统调用的层次是如何的。

System Call

上面说到我们的printf走到write这个地方,经过一定的处理我们准备好了字符和向何处设备写入,我们就需要发起一次系统调用。系统调用就是应用层需要更加底层的服务,软件要向操作系统打招呼。凡是涉及到跟底层硬件的交互都需要系统调用完成:写文件啊(与磁盘交互),还是写内存(跟内存条交互),还是其他的跟操作系统自身的交互(访问操作系统的数据结构)

他可以完成所有明确的操作。比如说返回当前的pid等等。

系统调用因为在汇编文件中按照序号排布,所以从这个含意上,我们使用一个系统调用号的东西来标识一个系统调用(本质上是向寄存器扔进去一个offset,之后发起调用的时候按照排布的表找是何种系统调用)

你可以在arch/对应的架构/kernel/syscall_64.c下看到系统调用号码!

我们发起系统调用之后,系统正确的找到了系统调用后需要执行的处理函数,举个例子,发起的system_call查看到我们的需求是write,他找到了处理这个系统调用的需求是sys_write函数,随后就会执行sys_write代之完成我们的操作后返回结果给用户上层,

如何自己搓一个系统调用

第一步呢,就是明确我们的系统调用要干什么吗??他需要什么参数?他需要返回什么?需要错误码吗?你如何保证你的实现是可以被移植的!事实上他们都需要考虑!

你如何检测这些参数是有效的,纵读Linux源码会发现一些参数的设置组合可能无效,你应该做何种处理?

你可以自行的查看诸如reboot syscall等是如何处理的。这里作为通用性的阐述不加以分析

实现结束之后,需要注册系统调用:在entry.S文件下,你需要排布一个系统调用,如法炮制!

.long   sys_my_call     /* ID__CNT */

然后在unistd文件下做出更改:

#define ___NR_my_call   YOUR_ID_CNT 

Syscall的优缺点

系统调用有它自己的优缺点,它的优点有:

  • 系统调用很容易实现,而且很容易使用。

  • 另一方面系统调用的性能很好

缺点也很明显:

  1. 你需要一个系统调用号,而且需要你来进行注册

  2. 在系统调用的背后需要一个稳定的内核,它需要被写入而且它不应当是不稳定的(换而言之一旦写入就不可以变),因为这将会破坏用户层的代码稳定性

  3. 每一个架构都需要独立的注册这个系统调用号,并且做出实现以支持这个系统调用

  4. 不容易直接被文件系统所访问,也不好再系统主干树之外的代码片段使用。

Reference

posix是什么都不知道,还好意思说你懂Linux? - 知乎 (zhihu.com)

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

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

相关文章

数据库mysql提权四种烧姿势--UDF反弹启动项MOF

免责声明:本问仅做技术交流与学习,请知法守法,不要乱搞等等 目录 前提条件 如何获取最高权限的密码? 一.UDF提权 利用条件: 信息收集 1-看有无plugin目录 2-开启外链 3-开启外连后,MSF启动~ 4-navicat--利用导出的.dll执行命令 利用原理: 执行命令: 二.反弹提权 …

在RISC-V64架构的CV1811C开发板上应用perf工具进行多线程程序性能分析及火焰图调试

CV1811C环境编译 SDK目录结构 . ├── build // 编译目录,存放编译脚本以及各board差异化配置 ├── buildroot-2021.05 // buildroot开源工具 ├── freertos // freertos系统 ├── fsbl // fsbl启动固件,prebuilt形式存在…

#QT获取ONENET云平台数据(草稿)

1.基本目标 (1)查询ONENT云平台的数据 (2)查询网络时间 (3)网络音乐拉取(作为背景音乐),音量可调 2.制作UI界面 (1)串口图标的制作方法 &…

【从浅学到熟知Linux】基础IO第四弹=>动静态库(含第三方动静态的使用、自制动静态库、关于动静态库加载调用原理)

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 文章目录 静态库静态库的介绍及使用方法自制静态库使用第三方提供的静态库 动态库动态库的介绍及使用方法自制动态库…

大数据Spark--运行环境和架构

文章目录 Spark运行环境Local模式解压缩文件启动 Local 环境命令行工具退出本地模式提交应用 Standalone 模式解压缩文件修改配置文件启动集群提交应用提交参数说明配置历史服务配置高可用(HA Yarn模式解压缩文件修改配置文件启动HDFS 以及YARN集群配置历史服务器 K…

List的介绍

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x1…

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui-键盘

文章目录 键盘键盘——记忆宫殿入门——通过键盘发送一个字符串——typewrite()常规——键名——typewrite()常规——按下键盘——keyDown()常规——释放键盘——keyUp()升级——热键组合——hotkey() 键盘 pyautogui也有一些函数向计算机发送虚拟按键,让你能够填充…

LeetCode-电话号码的字母组合(回溯)

每日一题 今天刷到的是一道利用回溯来解决的题,不过稍微有点复杂,并且我也有一段时间没有做回溯了,所有在解题时也是思考了一段时间。 题目要求 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意…

vue实现文字转语音的组件,class类封装,实现项目介绍文字播放,不需安装任何包和插件(2024-04-17)

1、项目界面截图 2、封装class类方法(实例化调用) // 语音播报的函数 export default class SpeakVoice {constructor(vm, config) {let that thisthat._vm vmthat.config {text: 春江潮水连海平,海上明月共潮生。滟滟随波千万里&#xf…

【每日刷题】Day20

【每日刷题】Day20 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 面试题 17.04. 消失的数字 - 力扣(LeetCode) 2. 189. 轮转数组 - 力扣&#…

AppWizard的软件开发GUI的使用记录

前言 这个软件是针对于EmWin6.0以上的这个软件在emWin的基础上又封装了一层,也只提供的API函数.基于消息事件为核心(个人理解)一些组件的之间的交互可以通过软件界面进行配置,比较方便本次是基于模拟器进行测试记录,观察api 按键和文本之间的关联 通过…

Crypto量化高频体验总结

Crypto量化高频体验总结 人工智能与量化交易算法知识库 2024-04-21 21:02 美国 以下文章来源于Quant搬砖工 ,作者quant搬砖队工头 Quant搬砖工. 稳健的收益要一点一点赚,量化的板砖要一块一块搬! 前言 前两天在翻历史文章的时候&#xf…