深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

31|程序如何与操作系统交互?

执行中断处理程序
查找中断向量表
产生软中断
无需软中断和栈切换
快速系统调用
封装层(Wrapper)屏蔽内部实现
获取当前进程ID
提高系统调用效率
虚拟系统调用的执行过程
寄存器值的保存与恢复
栈的切换
int 指令
syscall 指令
不同级别对应不同资源访问权限
Ring0~Ring3
防止系统受损和恶意行为
限制代码执行能力
用户函数: 用户态 (Ring3)
系统调用: 内核态 (Ring0)
执行内核代码
传递系统调用ID和参数至寄存器
通过汇编指令 syscall
getpid函数
提供访问底层软件与硬件服务的能力
操作系统内核封装的接口
知识分享
课程讨论
Linux下的vDSO机制
用户态与内核态切换
经典实现方式
x86-64体系
特权级别
保护环机制
执行环境
实现方式
实例
定义
交流与分享
思考题
系统调用的基本实现
系统调用 vs 用户函数
系统调用
程序与操作系统交互

该思维导图由 AI 生成,仅供参考

你好,我是于航。
在上一讲中我曾提到,你可以将操作系统内核暴露的“系统调用”也作为 API 的一种具体表现形式,因为调用者可以通过这些接口来使用内核提供的某种能力,但是却无需了解它们的内部实现细节。在之前的课程中,我也多次提到过有关系统调用的内容。那么,系统调用究竟是什么?它与我们编写的应用程序函数有何不同?通常情况下它又是怎样实现的呢?这一讲,我们就来看看这些问题的答案。

什么是系统调用?

不知道你还记不记得我在 11 讲 “用于低级 IO 接口的操作系统调用”小节中给出的例子,通过这个例子我们能够发现,操作系统调用实际上是由操作系统内核封装好的一些可供上层应用程序使用的接口。这些接口为应用提供了可以按照一定规则访问计算机底层软件与硬件相关服务(如 IO、进程、摄像头等)的能力。其中,内核作为中间层,隔离了用户代码与硬件体系。
接下来,我们再通过一个简单的例子,来快速回顾下如何在 x86-64 平台上使用系统调用。在大多数情况下,位于内核之上的各类系统库(如 glibc、musl)会将这些系统调用按照不同类别进行封装,并提供可以直接在 C 代码中使用的函数接口。通过这种方式,我们就可以间接地使用系统调用。当然,在这些函数内部,系统调用的具体执行通常是由汇编指令 syscall 完成的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

系统调用在操作系统中扮演着重要角色,它是操作系统内核提供的接口,让应用程序能够访问底层软件和硬件服务。与一般函数不同,系统调用执行的代码位于操作系统底层的内核环境中,而用户函数代码则位于内核之上的应用环境中。文章介绍了系统调用与用户函数的区别,以及在不同特权级别下的执行能力和机器指令的使用。此外,还介绍了系统调用的基本实现方式,包括使用`syscall`指令和`int`指令进行系统调用的过程。通过这些内容,读者可以快速了解系统调用的概念、重要性以及在操作系统中的实际应用。文章还提到了 Linux 下的 vDSO 机制参与“虚拟系统调用”的执行过程,这为读者提供了更深入的技术理解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • Y
    用户空间或用户代码:运行在CPU普通权限模式 每个空间或内核代码:运行在CPU特权模式 用户空间使用内核资源:是系统调用 请问老师:如果CPU没有特权模式,是不是也就没有内核态和用户态的区别?

    作者回复: 是的,运行在这类 CPU 上的操作系统也可能会采用比如“基于能力的安全”等策略来进行资源控制。

    2022-03-09
    2
    1
  • Geek_4911b5
    而在目前被广泛使用的 x86-64 体系中,通过 syscall 指令进行系统调用仍然是最高效,也最具兼容性的一种方式。syscall 指令的全称为“快速系统调用(Fast System Call)”,CPU 在执行该指令时不会产生软中断,因此也无需经历栈切换和查找中断向量表等过程,执行效率会有明显的提升。 老师,syscall指令为啥会有这些特定,原理是啥?

    作者回复: 这个讲起来比较复杂,粗略理解可以看下面这个回答: https://unix.stackexchange.com/questions/14293/difference-between-slow-system-calls-and-fast-system-calls

    2022-07-27
    2
  • 连瑞龙
    vDSO(virtual Dynamic Shared Object)是 Linux 内核提供的一种机制,它允许用户空间程序直接访问一些内核功能,而无需通过传统的系统调用。vDSO 主要用于提高某些系统调用的性能,特别是那些频繁执行的系统调用,如获取当前时间等。 在“虚拟系统调用”的执行过程中,vDSO 参与的主要步骤如下: 1. **用户空间程序发起系统调用:** 用户空间程序通过一般的系统调用指令(如`int 0x80`或`syscall`指令)发起系统调用。 2. **内核中的 vDSO 代码:** 在内核中,vDSO 包含了一些特定的代码,这些代码实现了一些常见的系统调用功能。这部分代码在内核空间运行,但可以被用户空间程序直接调用。 3. **vDSO 中的虚拟系统调用:** vDSO 中包含一个或多个虚拟系统调用函数,这些函数实际上是对一些内核功能的直接封装。当用户空间程序调用这些函数时,它们不会触发真正的系统调用,而是直接在用户空间执行相应的功能。 4. **无需进入内核空间:** 由于 vDSO 中的虚拟系统调用是在用户空间执行的,而不需要进入内核空间,因此避免了切换上下文的开销,提高了执行效率。 5. **系统调用结果返回:** 虚拟系统调用的执行结果被直接返回给用户空间程序。 使用 vDSO 机制的一个常见例子是获取当前时间的系统调用 `gettimeofday()`。在没有 vDSO 的情况下,该系统调用需要通过陷入内核并执行相应的内核代码。而有了 vDSO,可以直接在用户空间执行相应的代码,避免了进入内核空间的开销。 需要注意的是,并非所有的系统调用都有对应的虚拟系统调用。vDSO 主要用于那些频繁执行的系统调用,而不是所有的系统调用都被纳入到 vDSO 中。
    2024-01-12归属地:北京
    1
  • 简爱
    https://blog.csdn.net/qq_42108074/article/details/132804264,里边有64位AT&T汇编风格syscall使用的案例,包括往屏幕上输出字符、打开文件读取其中的内容等
    2023-11-02归属地:北京
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部