什么是系统调用?

在探讨系统调用(system call)时,我们首先想到的可能是软中断、内核态和用户态。让我们从头开始,重新理解“系统调用”这个概念。

实际上,系统调用这个术语有两种解释。一些资料将open、read、write、fork等man手册第二页的函数称为系统调用,但实际上这些只是真正系统调用的封装函数(wrapper functions),我称之为广义上的系统调用。这些封装函数通过软中断陷入内核态,然后调用对应的真正的系统调用,通常是一一对应的。例如,fork函数内部会调用sys_fork,而后者才是严格意义上的系统调用,由内核提供的服务,我称之为狭义的系统调用。

系统调用的封装函数是由glibc实现的,而真正的系统调用是由内核实现的。你可能觉得这有点复杂,让我们看一下epoll的man手册,其末尾有一个版本声明:

翻译过来就是,Linux内核的2.5.44版本引入了epoll,而glibc的2.3.2版本开始支持epoll。

这里特别提到glibc的版本,是为了说明即使你的Linux内核版本支持epoll系统调用,但如果你的glibc版本不够,你仍然无法直接使用以epoll开头的那些函数。为什么需要glibc封装一层呢?主要是因为系统调用在实际调用时涉及到一些汇编指令(后文会详细介绍)。

尽管我已经解释了系统调用的两种理解,但还有一点需要注意:(广义上的)系统调用的具体实现与内核架构有关。我上述描述的过程主要基于Linux,但纵观整个Unix-like操作系统家族,实际上还有不同的声音。这就引出了单内核与微内核之争。

单内核与微内核的争论始于1992年,由国外的谭宁邦教授(Tanenbaum)和Linux的发明者林纳斯(Linus)展开。当时林纳斯还是一个刚崭露头角的小伙子,一年前他曾在校园网上发布了Linux内核。

单内核(Monolithic kernel),也称为宏内核,但我认为宏内核这个词可能会引起误解,所以我将一直使用单内核这个术语。Linux就是基于单内核的,这是较为传统的内核架构。内核提供多种服务,我们常用的文件IO、内存管理、网络相关的系统调用都在内核态运行,且都在同一地址空间内。

谭宁邦教授直言Linux采用单内核是在开历史倒车,是操作系统技术的倒退,回到七十年代。此前他也曾开源一个类Unix的操作系统,名为MINIX,而MINIX基于微内核。

微内核(Microkernel)提出时间比单内核晚,在学术界被视为新兴的技术。微内核采用模块化设计,将内核功能简化到最少,只提供基本功能,更多的功能在用户态运行,不同服务在不同地址空间运行,常用服务(如IO、内存管理)通过IPC调用组合提供。从这个角度看,微内核的扩展性更强,添加新功能无需重新编译内核,且由于内核服务间的隔离,使得操作系统更安全,一个服务崩溃不会影响其他服务。但问题也很明显,大量的IPC会影响性能。

微内核的理念与后来大型分布式系统中的SOA、微服务概念不谋而合。然而,历史并未如期发展,站在二十一世纪的第三个十年回望,Linux取得了空前的成功。时至今日,无论是MINIX还是其他,鲜有广泛使用的微内核操作系统(去年华为鸿蒙高调宣布采用单微内核架构,我们拭目以待)。当然,Linux的成功与其采用单内核架构并无直接关联,主要归功于其出色的开源社区运营模式(观点出自《大教堂与集市》)。

谭宁邦教授和林纳斯的这场论战在上世纪90年代引起了巨大反响,双方阵营都有多位技术大牛加入讨论。这场论战的记录至今仍常见诸报端。论战持续时间很长,从技术本身的争辩到后来双方的互相呛声,多年后两人也曾公开表达和解,表示双方只是技术之争,不涉及任何私人攻击。

在这场论战之前,这位老教授和这位年轻的发明者其实也有交集。谭宁邦教授曾出版过讲解Unix和操作系统的书籍,并随书附赠了MINIX的源码。林纳斯在发明Linux之前,确实通过这本书和MINIX的代码学习了操作系统知识。所以从某种意义上说,谭宁邦教授可以说是林纳斯的半个老师。

这场论战距今已近三十年,是争是吵,已无需纠结。这里不再展开具体细节,有兴趣的读者可以在互联网上找到当年的蛛丝马迹。

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

内核态、用户态与CPU的特权等级Intel x86 CPU的架构将所运行的指令划分为4个不同特权等级:ring 0、ring 1、ring 2、ring 3,通常称为保护环(protection ring)。从ring 0到ring 3,特权级别依次降低。Linux使用了ring 0和ring 3两个特权等级。运行在ring 0的程序被称为内核态(Kernel Space)程序,运行在ring 3的程序被称为用户态(User Space)程序。

什么是系统调用?图片来自网络

系统调用与软中断我们已经大致了解了什么是用户态,什么是内核态。那么,这与系统调用有什么关系呢?

请看下一张图:

什么是系统调用?图片来自网络

可以看到,在用户态和内核态的边界上画着线,这就是系统调用!也就是说,无论是单内核还是微内核,运行在用户态的应用程序想要使用某些只能在内核态执行的功能,必须通过系统调用来实现。所以你需要明白:进程从用户态陷入内核态是目的,而使用系统调用仅仅是达到该目的的手段。因果关系要理清楚。

接下来解释一下什么是软中断。要说软中断,先说一下中断(interrupt),如果你大学时学过《计算机组成与体系结构》这门课,你应该会记得。中断本身是一个硬件概念,就是打断CPU,让其执行其他任务,比如键盘中断、打印机中断、定时器中断等。软中断则是从软件层面模拟了这一中断操作。

网上许多资料会提到使用128号软中断指令(int 0x80)来使进程从用户态陷入内核态,执行完毕后使用iret指令返回用户态。但这是较为传统的老方法。随着CPU(Intel和AMD)的升级,Linux内核通常使用快速系统调用(Fast system calls)的sysenter/syscall指令代替int 0x80,使用sysexit/sysret代替iret。在运行软中断指令时,会使用一个寄存器来存储具体的系统调用号,例如在Linux上,read和write的系统调用号分别为0和1。

单内核与微内核上的系统调用有什么不同呢?就系统调用的实现原理而言,没有不同。所谓的差异实际上体现在系统调用的封装函数的种类上!前面提到,单内核内核提供许多服务。以Linux为代表,其系统调用种类繁多,有三百多种。可以查看:filippo.io/linux-syscal

什么是系统调用?而微内核操作系统,则没有这么多系统调用。例如,MINIX实际上只有三个系统调用(的封装函数):

发送:_send()接收:_receive()发收一体:_sendrec()(基于老版本MINIX,最新的MINIX是否扩展了尚不清楚)

这当然不是说MINIX不支持open()、read()、write()和fork()。只是在MINIX系统上,这些功能本质上都是通过_send()、_receive()、_sendrec()实现的。所以准确来说,MINIX上与Linux的open()、read()、write()、fork()这些系统调用封装函数对应的,是_send()、_receive()、_sendrec()。

以上就是什么是系统调用?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/480444.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Linux中如何调试Xrender相关问题
上一篇 2025年11月8日 11:09:42
设计可重用 Java 函数的模式和技术
下一篇 2025年11月8日 11:09:45

相关推荐

  • win10连接投影仪没反应怎么办_win10投影连接异常修复方法

    首先检查投影仪连接与输入源设置,确保线缆完好且设备正常开启;接着通过Win+P切换显示模式并检测第二屏幕;更新显卡驱动以排除兼容问题;重启设备恢复通信;最后确认无线投影功能已启用并处于同一网络。 如果您尝试将Windows 10电脑连接到投影仪,但屏幕没有信号或无法显示画面,可能是由于连接、设置或驱…

    2026年9月29日
    000
  • OPPO Find X9系列外观公布:告别圆形“奥利奥”模组

    OPPO Find X9系列外观公布:告别圆形“奥利奥”模组OPPO Find X9系列外观公布:告别圆形“奥利奥”模组OPPO Find X9系列外观公布:告别圆形“奥利奥”模组OPPO Find X9系列外观公布:告别圆形“奥利奥”模组

    今天,oppo官方通过其微博平台首次揭晓了oppo find x9系列的外观设计细节。 从发布的宣传海报可以看出,Find X9系列摒弃了自Find X6以来一直沿用的圆形“奥利奥”镜头模组设计,转而采用左上角布局的圆角矩形相机模块,整体风格更为方正且富有现代感。 在具体配置方面,Find X9标准…

    2026年9月29日 • 用户投稿
    000
  • win10窗口自定义调整的具体操作方法

    win10窗口自定义调整的具体操作方法win10窗口自定义调整的具体操作方法win10窗口自定义调整的具体操作方法win10窗口自定义调整的具体操作方法

    安装windows 10后,许多用户会发现系统中的控件和图标尺寸明显变大,使用起来不太顺手。那么,如何自定义调整win10窗口的大小呢?下面将详细介绍具体的操作步骤。 1、按下快捷键 Win + R 打开“运行”对话框,在输入框中键入 regedit,然后按回车键确认。 2、进入注册表编辑器后,依次…

    2026年9月29日 • 用户投稿
    000
  • 深入了解Linux用户信息的修改方法

    深入了解Linux用户信息的修改方法深入了解Linux用户信息的修改方法深入了解Linux用户信息的修改方法深入了解Linux用户信息的修改方法

    标题:Linux用户信息修改方法详解 在Linux操作系统中,用户信息的管理是非常重要的一项操作。用户信息包括用户名、用户ID、用户所属组、用户家目录、用户shell等,了解如何修改用户信息对于系统管理是至关重要的。本文将详细介绍在Linux系统中修改用户信息的方法,并附上具体的代码示例。 一、查看…

    2026年9月29日 • 用户投稿
    100
  • Kotlin/Native与JVM混合部署:性能优化与跨平台兼容性实现指南

    Kotlin/Native与JVM混合部署:性能优化与跨平台兼容性实现指南Kotlin/Native与JVM混合部署:性能优化与跨平台兼容性实现指南Kotlin/Native与JVM混合部署:性能优化与跨平台兼容性实现指南Kotlin/Native与JVM混合部署:性能优化与跨平台兼容性实现指南

    本文探讨了如何在Java/JVM应用中巧妙结合Kotlin/Native编译的原生可执行文件与纯JVM实现,以兼顾极致性能和广泛跨平台兼容性。核心策略是利用Java Native Interface (JNI) 作为桥梁,在运行时根据平台加载并调用Kotlin/Native生成的动态库,并在原生库不…

    2026年9月29日 • 用户投稿
    000
  • Sublime项目快速启动 Sublime常用工程收藏夹

    Sublime项目快速启动 Sublime常用工程收藏夹Sublime项目快速启动 Sublime常用工程收藏夹Sublime项目快速启动 Sublime常用工程收藏夹Sublime项目快速启动 Sublime常用工程收藏夹

    高效管理sublime text项目的核心在于利用.sublime-project文件和快速切换功能。1. 创建.sublime-project文件保存工作区快照,包括文件夹路径、视图布局、特定设置等;2. 将项目文件保存在项目根目录或集中存放于统一目录(如~/sublimeprojects)以便管…

    2026年9月29日 • 用户投稿
    000
  • win10镜像如何重装系统win7系统?一键重装win7系统教程

    win10镜像如何重装系统win7系统?一键重装win7系统教程win10镜像如何重装系统win7系统?一键重装win7系统教程win10镜像如何重装系统win7系统?一键重装win7系统教程win10镜像如何重装系统win7系统?一键重装win7系统教程

    有部分用户刚刚重装完win10系统,却开始怀念起win7的操作体验,觉得还是老系统更顺手。遇到这种情况该怎么办呢?别担心,小编为大家准备了多种解决方案,总有一款适合你。接下来就详细聊聊如何将win10系统更换为win7系统。 一键切换至win7系统 推荐使用一键重装工具,直接在当前系统下完成win7…

    2026年9月29日 • 用户投稿
    100
  • Room 数据库预填充数据为空的排查与解决方案

    Room 数据库预填充数据为空的排查与解决方案Room 数据库预填充数据为空的排查与解决方案Room 数据库预填充数据为空的排查与解决方案Room 数据库预填充数据为空的排查与解决方案

    本文深入探讨了Android Room数据库预填充数据后列表仍显示为空的常见原因与解决方案。核心问题在于RoomDatabase.Callback中的onCreate方法仅在数据库首次创建时执行一次。文章详细分析了这一生命周期行为,并提供了通过卸载应用或清除数据来强制数据库重新创建的直接方法,同时介…

    2026年9月29日 • 用户投稿
    000
  • 深度解析Linux chage命令的功能与工作原理

    深度解析Linux chage命令的功能与工作原理深度解析Linux chage命令的功能与工作原理深度解析Linux chage命令的功能与工作原理深度解析Linux chage命令的功能与工作原理

    Linux系统中的chage命令是用来修改用户账号的密码失效日期的命令,也可以用来修改账号的最长和最短可用日期等。该命令在管理用户账号安全上起到非常重要的作用,可以有效地控制用户密码的使用期限,增强系统的安全性。 chage命令的使用方法: chage命令的基本语法为: chage [选项] 用户名…

    2026年9月29日 • 用户投稿
    100
  • [pcl][原创]python-pcl安装配置支持windows和ubuntu完美流程 2021版本

    [pcl][原创]python-pcl安装配置支持windows和ubuntu完美流程 2021版本[pcl][原创]python-pcl安装配置支持windows和ubuntu完美流程 2021版本[pcl][原创]python-pcl安装配置支持windows和ubuntu完美流程 2021版本[pcl][原创]python-pcl安装配置支持windows和ubuntu完美流程 2021版本

    目前在全网范围内,关于PCL的Python版本配置方案普遍存在各种兼容性与依赖问题,几乎没有一篇文章能够提供完整、可复现的解决方案。经过长达数月的反复尝试与调试,我最终成功打通了完整的安装流程,并在Windows与Ubuntu双系统上均完成了验证。以下是最终成果展示: 其中,Windows端的成功运…

    2026年9月29日 • 用户投稿
    100
  • Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略

    Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略Kotlin Native与JVM混合部署:通过JNI实现性能与跨平台兼顾的策略

    本文探讨了如何在单一JAR包中集成Kotlin Native多平台可执行文件与JVM回退实现,以兼顾高性能与极致跨平台能力。核心在于利用Java Native Interface (JNI) 作为桥梁,使JVM应用能动态加载并调用Kotlin Native编译生成的平台特定动态库,同时在原生库不可用…

    2026年9月29日 • 用户投稿
    100
  • 理解标准输出缓冲:Python、C、Java与Go的行为差异解析

    理解标准输出缓冲:Python、C、Java与Go的行为差异解析理解标准输出缓冲:Python、C、Java与Go的行为差异解析理解标准输出缓冲:Python、C、Java与Go的行为差异解析理解标准输出缓冲:Python、C、Java与Go的行为差异解析

    本文深入探讨了不同编程语言在标准输出(stdout)缓冲机制上的差异,特别是在输出连接到终端(TTY)或管道时。我们将解析Python和C在管道场景下默认采用块缓冲,导致输出延迟,而Java和Go则倾向于实时刷新。文章将提供代码示例,并指导如何控制和管理输出缓冲,以确保在各种环境下都能获得预期的程序…

    2026年9月29日 • 用户投稿
    100
  • Linux添加用户的完整指南

    Linux添加用户的完整指南Linux添加用户的完整指南Linux添加用户的完整指南Linux添加用户的完整指南

    Linux是一个自由开源的操作系统,广泛应用于服务器、嵌入式设备和个人计算机等领域。在Linux系统中,添加新用户是一个常见的操作,本文将详细解释如何使用命令来添加新用户,包括具体的代码示例。 一、添加新用户的命令在Linux系统中,添加新用户的命令主要使用useradd命令。useradd命令用于…

    2026年9月29日 • 用户投稿
    100
  • sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程

    sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程sublime怎样实现终端代码交互 sublimeREPL环境搭建的教程

    安装package control后通过命令面板安装sublimerepl插件;2. 通过菜单或快捷键运行代码或发送选中代码到repl;3. 配置快捷键(如f5运行文件,ctrl+b发送选中代码)提升效率;4. 遇到问题时检查解释器路径、环境变量、文件编码或快捷键冲突;5. 可结合terminus插…

    2026年9月29日 • 用户投稿
    200
  • 一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5

    一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5一机在手,全球畅游:用鸿蒙5轻松玩转境外热门城市Top5

    国庆与中秋双节叠加的超长假期即将到来,不少朋友已经按捺不住,计划走出国门、畅游世界——东京、首尔、巴黎、曼谷、莫斯科依旧是热门首选。然而,出境旅行虽令人期待,但“老三难”问题总是如影随形:担心没网络、害怕迷路、忧虑语言不通……不过这次我发现,鸿蒙5系统内置的几款原生应用,实测下来竟然把这三大痛点一一…

    2026年9月29日 • 用户投稿
    100
  • Win10下Edge浏览器地址栏出现热门站点取消方法

    Win10下Edge浏览器地址栏出现热门站点取消方法Win10下Edge浏览器地址栏出现热门站点取消方法Win10下Edge浏览器地址栏出现热门站点取消方法Win10下Edge浏览器地址栏出现热门站点取消方法

    近期,在使用windows 10系统时发现,当利用edge浏览器点击地址栏时,总是会弹出令人困扰的“热门站点”。为了解决这一问题,本文将向大家介绍如何在windows 10系统中移除edge浏览器地址栏中的热门站点。接下来是具体的操作步骤。 操作步骤: 启动Edge浏览器,找到设置界面中的相关选项(…

    2026年9月29日 • 用户投稿
    100
  • Sublime代码重构工具 Sublime自动化重构方案

    Sublime代码重构工具 Sublime自动化重构方案Sublime代码重构工具 Sublime自动化重构方案Sublime代码重构工具 Sublime自动化重构方案Sublime代码重构工具 Sublime自动化重构方案

    sublime text在代码重构中的核心局限性在于缺乏原生的深度语义理解和重构功能的碎片化;其优势在于极致速度、高度定制性及强大的多光标与正则查找替换能力。1.局限性:①缺乏深度语义分析,依赖简单文本替换易引入错误;②重构功能依赖第三方包,配置复杂且质量参差不齐。2.优势:①轻量快速,适合快速修改…

    2026年9月29日 • 用户投稿
    100
  • 多语言对比:深入理解标准输出缓冲机制与TTY连接的影响

    多语言对比:深入理解标准输出缓冲机制与TTY连接的影响多语言对比:深入理解标准输出缓冲机制与TTY连接的影响多语言对比:深入理解标准输出缓冲机制与TTY连接的影响多语言对比:深入理解标准输出缓冲机制与TTY连接的影响

    本文深入探讨了Python、C、Java和Go等编程语言中标准输出(stdout)的缓冲机制。重点分析了在输出连接到终端(TTY)和管道/文件(非TTY)时,不同语言默认缓冲行为的差异及其背后的原因。文章解释了行缓冲与块缓冲的概念,并提供了控制输出刷新的方法,旨在帮助开发者更好地理解和管理程序输出,…

    2026年9月29日 • 用户投稿
    100
  • realmeV系列摄像头怎么设置以提升夜间拍摄效果?夜间模式的优化方法

    realmeV系列夜间拍摄的核心是启用夜间模式并结合专业模式手动调节ISO、快门速度、白平衡等参数,配合三脚架提升稳定性,避免高ISO和手持抖动,同时善用环境光、前景构图与后期处理,以获得细节丰富、噪点少、色彩真实的高质量夜景照片。 realmeV系列手机在夜间拍摄时想要获得更好的效果,核心在于充分…

    2026年9月29日
    100
  • 怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧

    怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧怎么用豆包AI帮我转换jQuery到Vue 用AI快速迁移老旧前端项目的技巧

    使用ai工具辅助将jquery代码迁移到vue是可行的,尤其适用于老项目升级。1. 首先让ai理解jquery逻辑,通过解释代码功能和列出数据依赖帮助确认逻辑清晰;2. 拆分功能模块逐步转换,按表单提交、动态列表等小模块分别处理,生成可在vue中直接运行的代码;3. 借助ai识别常见陷阱,如避免频繁…

    2026年9月29日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信