1.程序接口的系统调用是什么

如果说命令接口(联机/脱机)是给(用户)用的,那么程序接口(系统调用)就是给程序(软件)用的。

1. 什么是系统调用?

系统调用(System Call) 是操作系统提供给应用程序的一种“特殊函数”。它是运行在用户态的程序进入**内核态(操作系统核心)**的唯一合法入口。

直白理解:

应用程序(如 Word、微信)就像是一个“平民”,它为了安全被限制在“用户态”运行,不能直接碰硬件(内存、硬盘、网卡)。如果它想存个文件、发个消息,就必须向“国王”(操作系统内核)发个请求,这个请求的过程就叫系统调用

2. 程序接口与系统调用的关系

  • 程序接口(Programmatic Interface):是操作系统提供的一套“规则和工具箱”,让程序员在写代码时能调用系统功能。
  • 系统调用:是这个接口的具体实现形式。通常,程序员不会直接写极其复杂的汇编代码去触发系统调用,而是调用现成的 API(如 Windows API 或 POSIX 标准库)。

3. 系统调用的工作流程(核心原理)

当一个程序执行系统调用时,会发生以下“变身”过程:

  1. 发出请求: 程序调用一个库函数(如 C 语言的 printf 或 open)。
  2. 陷入(Trap): 硬件执行一条特殊的指令(陷入指令),产生一个软中断。
  3. 模式切换: CPU 从 用户态(User Mode) 切换到 内核态(Kernel Mode)
  4. 执行任务: 操作系统根据“系统调用号”找到对应的内核代码(如向磁盘写数据的代码)并执行。
  5. 返回结果: 任务完成后,CPU 切回用户态,把结果返回给程序。

4. 系统调用具体体现在哪里?

你在写程序时看到的这些操作,底层全都是系统调用:

  • 文件操作: open (打开文件), read (读), write (写), close (关闭)。
  • 进程控制: fork (创建一个新进程), exec (执行程序), exit (结束进程)。
  • 内存管理: malloc (底层申请内存时调用的 brk 或 mmap)。
  • 设备管理: read/write (向打印机或扫描仪发指令)。
  • 通信与网络: socket (创建网络连接), send, recv。

5. 为什么要通过“系统调用”这么麻烦?

如果允许程序直接操作硬件,会发生灾难:

  1. 安全性: 一个恶意软件可以直接格式化你的整个硬盘。
  2. 稳定性: 如果两个程序同时乱写内存,系统会立刻崩溃。
  3. 屏蔽硬件差异: 程序员不需要管你的硬盘是三星的还是华为的,只需要调用统一的 write 命令,操作系统负责处理复杂的硬件驱动。

6. 形象比喻:去银行取钱

  • 应用程序 = 你(客户)。
  • 操作系统内核 = 银行金库。
  • 系统调用 = 银行柜台窗口

你(程序)不能直接冲进金库(硬件)拿钱,你必须坐在柜台窗口(程序接口)前,填一张表(系统调用号和参数),递给柜员(操作系统)。柜员确认无误后,自己进入金库拿钱,然后再从窗口把钱递给你。

总结

程序接口的系统调用体现在:

它是代码层面的“中转站”。你在代码里写的任何涉及硬件、资源分配、多任务操作的功能,最终都会通过系统调用去求操作系统帮忙完成。没有系统调用,程序就只能做简单的数学运算,无法与外部世界发生任何联系。


2.可重入代码是什么

“可重入代码”(Re-entrant Code)是操作系统和程序设计中一个非常重要的概念。简单来说,“重入”就是指一个程序段可以被多个用户(或多个进程)同时调用,而不会产生冲突或数据错误。

为了让你透彻理解,我们分三个层次来解释:

1. 直观的比喻:菜谱与笔记本

想象一个厨房(内存):

  • 不可重入代码(非重入): 就像一张菜谱,上面写着:“第一步,把火调大;第二步,在菜谱的空白处记录当前的油温。”
    • 如果有两个厨师(两个进程)同时看这张菜谱,厨师 A 刚记下油温 100 度,厨师 B 接着就把油温改成了 200 度。厨师 A 再回来执行第三步时,发现数据乱了。
    • 结论: 这种代码不能共享,必须每个人发一张复印件(各占一份内存)。
  • 可重入代码(重入): 就像一张只读的菜谱,上面写着:“第一步,把火调大;第二步,在你自己的笔记本上记录当前的油温。”
    • 不管有多少个厨师同时看这张菜谱,他们都只是读取菜谱内容,而把数据记录在自己兜里的笔记本(私有栈/寄存器)上。
    • 结论: 菜谱(代码)只有一份,大家共享,互不干扰。

2. 计算机层面的定义

可重入代码又被称为“纯代码”(Pure Code),它具有以下特征:

  1. 只读性: 代码在执行过程中绝对不会改变自己。它不像某些古老的代码在运行时会修改指令本身。
  2. 不保存状态: 代码本身不持有任何全局变量或静态变量(Global/Static Variables)。所有的中间结果、临时变量都保存在调用者的栈(Stack)或者寄存器中。
  3. 可中断性: 如果一个进程正在执行这段代码时被系统中断(比如 CPU 时间片到了),另一个进程接着进来执行这段代码,之前的状态不会被覆盖

总结:满足什么条件才是可重入的?

一个函数或程序要被称为“可重入”,必须满足:

  1. 不使用全局变量或静态变量(或者只读它们,不修改它们)。
  2. 不返回指向静态数据的指针。
  3. 只处理调用者提供的数据(通过参数传递)。
  4. 不调用不可重入的函数。


3.虚存系统缺页是什么,会发生什么

要理解虚存缺页(Page Fault),我们得先看操作系统玩的一个“空手套白狼”的魔术。

1. 背景:一个“善意的谎言”

现代操作系统(如 Windows, Linux)给每个程序都许下了一个诺言:“别担心,内存管够!你可以认为你有 128TB 的空间可以用。” 这就是虚拟内存(Virtual Memory)

但现实很残酷,你的物理内存(RAM)可能只有 16GB。

  • 做法: 操作系统把程序分成一小块一小块,每一块叫一个**“页”(Page)**。
  • 策略: 只有你当前正在用的那几页会被放进物理内存(RAM),剩下的暂时丢在硬盘里。

2. 什么是“缺页”(Page Fault)?

缺页,就是程序试图访问一个“还没被装进内存”的页。

当你运行程序时:

  1. CPU 想要读取虚拟地址 0x1234 的数据。
  2. CPU 去查一个表(页表 Page Table),看看这个地址对应的“页”现在在哪。
  3. 如果页表里的“存在位”显示为 0,代表:“对不起,这页代码/数据现在还在硬盘上,没在内存里。”
  4. 这时候,硬件就会触发一个内中断(异常),这个事件就叫 “缺页异常”

3. 缺页中断发生后,操作系统怎么做?

这是一个典型的“亡羊补牢”过程:

  1. 暂停: CPU 停下当前的程序(因为它没法继续运行了,没数据啊)。
  2. 找位子: 操作系统去物理内存(RAM)里找一个空地方。如果内存满了,就通过算法(如 LRU)踢走一个倒霉的旧页。
  3. 搬运(I/O): 操作系统去硬盘里找到缺的那一页,把它到内存里。
  4. 改表: 更新页表,把刚才那个“存在位”从 0 改成 1,填上现在的物理地址。
  5. 重来: 这是一个非常关键的点——CPU 重新执行刚才那条由于缺页而失败的指令。 这次,它能从页表里查到内存位置了,程序继续运行,就像什么都没发生过一样。

4. 形象比喻:看书

  • 物理内存(RAM): 你的书桌(空间有限,只能放下两三本书)。
  • 虚拟内存(硬盘): 你的书架(空间巨大,能放成千上万本书)。
  • 页(Page): 书。
  1. 你想看《操作系统》,但在书桌上没找着(缺页了)。
  2. 你触发了一个“动作”(缺页中断):你站起来,走到书架前。
  3. 你从书架上把《操作系统》拿出来(从磁盘读取),放到书桌上(装入内存)。如果桌子上堆满了,你得把《麻将入门》放回书架(页面置换)。
  4. 你重新坐下来,开始读那本书(重新执行指令)。

5. 为什么说它是中断?

结合你之前学的内容:

  • 它是内中断: 因为它是 CPU 执行指令时(试图访问内存地址)发现问题而产生的。
  • 它属于“故障”(Fault):
    • 它不是错误,而是系统正常运行的一部分。
    • 它的特点是处理完后会返回到当前指令重新执行,而不是像系统调用那样执行下一条指令。

总结

虚存缺页就是:程序要用的数据还在硬盘上,还没进内存。

操作系统利用缺页中断这个机制,实现了“小内存运行大程序”的神技。

注意:如果你发现任务管理器里的“硬盘”占用极高,且电脑变慢,通常就是因为“缺页”太频繁,操作系统一直在忙着往内存里搬东西,这叫*“抖动/颠簸”(Thrashing)**。*


4.发生中断后只需要保存什么,保存在哪里

发生中断后,只保存 PC 指针(程序计数器)是远远不够的。

如果只保存 PC,CPU 回来后虽然知道该执行哪行代码,但它会像个“失忆症患者”:不知道之前的计算结果(进位了吗?结果是 0 吗?),也不知道刚才寄存器里存的临时变量是什么。

1. 除了 PC,还需要保存什么?

为了保证程序能“无缝衔接”地继续运行,必须保存现场(Context/State),核心包括两部分:

A. 硬件自动保存的部分(核心状态)

当你触发中断的瞬间,硬件(CPU)通常会自动把以下内容压入栈中:

  1. PC (Program Counter):断点地址,告诉 CPU 回来后从哪接着练。
  2. PSW (Program Status Word / FLAGS)极其重要! 它记录了上一条指令执行后的状态(是否进位、是否为 0、当前的 CPU 优先级等)。如果不救它,回来后的 if 判断可能就会出错。

B. 软件(程序员/系统)负责保存的部分(通用寄存器)

CPU 的通用寄存器(如 AX, BX, CX 或 R0-R15)里存着你程序运行到一半的中间变量。

  • 中断处理程序也会用到这些寄存器。
  • 如果中断处理程序直接用了 R0,而没保存之前的值,原来的程序回来后发现 R0 变了,逻辑就崩了。
  • 做法: 通常在中断服务程序(ISR)的第一行,手动用 PUSH 指令把这些寄存器存起来。

2. 现场保存在哪里?

保存的位置主要取决于系统的复杂程度,通常有三个地方:

第一站:栈 (Stack) —— 实时保存

这是最常见的地方。

  • 位置: 内存中的一段特殊区域。
  • 内核栈(Kernel Stack): 在现代操作系统(Windows/Linux)中,当从用户态进入中断时,硬件和内核会自动把 PC、PSW 等压入该进程对应的内核栈中。
  • 优点: 速度极快,适合处理这种突发事件。

第二站:专用寄存器 (Shadow/Banked Registers) —— 极速保存

在一些高性能的嵌入式芯片(如 ARM 的某些模式)中:

  • CPU 有一套“备份寄存器”。
  • 发生中断时,CPU 直接切换到另一组寄存器,不需要往内存里写数据。这叫“影子寄存器”,速度快到飞起。

第三站:进程控制块 (PCB) —— 长期保存

如果这个中断导致了进程切换(比如时间片到了):

  • 操作系统会把栈里的那些数据搬到 PCB(内存中的一个结构体)里。
  • 这样即使这个程序几个小时后再运行,它的所有状态(PC、PSW、通用寄存器)都稳稳地存在 PCB 里。

3. 完整的过程:以“看书”为例

  1. 正在看书(执行程序): 你读到第 10 页第 5 行(PC),手里还拿着笔(通用寄存器),心里记着刚才那题算到了 100(PSW)。
  2. 电话响了(发生中断):
    • 硬件动作: 你随手拿了个书签插在第 10 页(保存 PC 到栈),并记下读到了左边还是右边。
    • 软件动作: 你把笔放在桌子特定的位置(PUSH 寄存器),确保不会被别人乱动。
  3. 接电话(处理中断): 你去干别的事。
  4. 回来继续(恢复现场):
    • 你拿起笔(POP 寄存器)。
    • 你翻开书签所在的第 10 页(恢复 PC),脑子里回想起刚才算到 100 的状态(恢复 PSW)。
  5. 继续读: 完美衔接。

总结

  • 不仅存 PC,还要存 PSW 和所有通用的寄存器。
  • 主要保存在“栈”中,如果是进程切换,最终会保存在 PCB 里。
  • PSW 不救,逻辑必崩。(记住这句话)



6.中断处理程序的入口地址可由硬件向量法产生向量地址什么意思

这是一个非常经典的考研/操作系统核心概念。简单来说,“硬件向量法”就是一套由硬件自动完成的“查表跳转”机制。

为了让你听懂,我们先区分两个容易搞混的“地址”,然后看硬件是怎么操作的。

1. 核心概念:两个地址

  • 入口地址 (Entry Address):这是你真正要执行的中断处理程序(代码)的第一行在内存里的地址。
  • 向量地址 (Vector Address):这是存放“入口地址”的**那个坑位(存储单元)**的地址。

形象比喻:

  • 你要找王老师看病。王老师在 101 诊室入口地址)。
  • 医院大厅有个导诊牌,上面写着“王老师:101”。这个导诊牌在墙上的位置就是向量地址

2. “硬件向量法”的具体流程

当一个中断(比如键盘被按下了)发生时,硬件电路(中断控制器)会做以下三步:

第一步:产生中断类型号 (Interrupt Type Number)

硬件给每个中断都编了号。比如键盘是 1 号,磁盘是 2 号。这个号是硬件直接发出的。

第二步:计算向量地址 (Generate Vector Address)

CPU 内部有一块电路,它会根据类型号自动计算。

  • 计算公式通常是:向量地址 = 中断向量表起始位置 + 类型号 * 4 (假设每个地址占 4 字节)。
  • 注意: 这一步是电路瞬间完成的,不需要写代码。

第三步:硬件查表并跳转

  1. CPU 根据刚才算出来的向量地址,去内存里读出里面存着的那个入口地址
  2. 硬件直接把读到的这个“入口地址”塞进 PC 寄存器
  3. 下一秒,CPU 就已经在跑中断处理程序了。

3. 为什么要叫“硬件向量法”?

与之相对的叫**“软件查询法”**。对比一下你就知道硬件法的牛逼之处了:

  • 软件查询法(老慢笨)

    发生中断后,CPU 跑进一段通用的代码,代码里写着:if (是键盘吗?) { ... } else if (是磁盘吗?) { ... }。

    • 缺点:太慢了,还得一个个问。
  • 硬件向量法(快准狠)

    硬件直接通过电路把 CPU 的 PC 指针“空投”到对应的程序门口。

    • 优点:速度极快,完全不需要软件干预就能完成跳转。

4. 总结:这句话到底在说什么?

“中断处理程序的入口地址可由硬件向量法产生向量地址” 的意思是:

  1. 内存里有一张表(中断向量表),里面整齐地存着各种程序的入口地址
  2. 硬件电路会自动根据中断的种类,算出这个地址在表里的哪个位置(向量地址)
  3. 硬件再通过这个位置把真正的程序开头找出来,让 CPU 跳过去。

一句话总结:硬件帮你查好了“导诊单”,并直接把你瞬移到了医生的诊室门口。


7.中断隐指令是什么

中断隐指令(Interrupt Implicit Instruction) 是操作系统和计算机组成原理中一个非常重要的概念。

简单一句话总结:它不是一条真正的、你可以写在程序里的指令,而是 CPU 硬件在发现中断信号后,自动执行的一串“保命+跳转”的连贯动作。

之所以叫“隐”指令,是因为在汇编指令集里找不到它,程序员也没法调用它,它完全是由硬件电路直接实现的。


1. 为什么要设计“隐指令”?

想象一下,如果没有隐指令,CPU 发现中断后直接跳到中断程序:

  • 问题 1: 原来的 PC(断点)还没存呢,跳过去就回不来了。
  • 问题 2: CPU 还没从用户态变身内核态,没权限执行中断程序。
  • 问题 3: 还没关中断,万一跳到一半又来个中断,系统就乱了。

这些事必须在进入中断程序之前瞬间完成,且不能靠软件代码来做(因为代码还没运行呢),所以必须由硬件直接包办。


2. 中断隐指令具体做了哪三件事?(核心考点)

当 CPU 执行完当前指令,发现有中断请求时,硬件电路会立刻自动执行以下三个动作:

第一步:关中断 (Disable Interrupts)

  • 动作: 把 PSW(程序状态字)中的中断允许位(IF)设为 0。
  • 目的: 保护现场。防止在保存关键数据(如 PC)的过程中,又被另一个中断给打断了(避免套娃导致数据丢失)。

第二步:保存断点 (Save Context)

  • 动作: 自动把当前的 PC (程序计数器) 和 PSW (状态寄存器) 压入栈中(或者存入专用寄存器)。
  • 目的: 记住现在读到哪一行了,以及当时的运算状态,方便以后“无缝回归”。

第三步:引出中断服务程序 (Find ISR)

  • 动作:
    1. 计算向量地址。
    2. 去内存的中断向量表里读出入口地址。
    3. 把入口地址送入 PC。
  • 目的: 完成从原来的程序向中断处理程序的“瞬移”。

3. 形象比喻:外科医生的“应急动作”

医生(CPU)正在做手术(执行程序),突然护士喊:“病人没呼吸了!”(发生中断)。

医生在真正开始抢救(执行中断处理程序)之前,会有几个下意识的动作(隐指令)

  1. 关中断: 喊一声“别跟我说话!”(关中断,防止干扰)。
  2. 存断点: 眼神扫一下现在刀口的位置,并记在心里(保存 PC)。
  3. 引出: 转身拿起旁边的除颤仪(根据导诊单/向量表,找到抢救工具并开始操作)。

这些动作是医生的“肌肉记忆”(硬件电路实现),不需要思考,也不需要翻看手术手册(指令集)。


4. 常见误区(考试常考)

  • 误区: 中断隐指令是操作系统的一段代码。
  • 真相: 错误! 它是 硬件电路 自动完成的,不属于软件,也不属于指令集里的任何一条指令。
  • 误区: 隐指令负责保存所有通用寄存器(AX, BX...)。
  • 真相: 错误! 隐指令只管最核心的 PC 和 PSW。剩下的那些通用寄存器,是由**中断处理程序(软件)**的第一行代码手动 PUSH 保存的。

总结

阶段 执行者 动作
中断响应前 硬件 (隐指令) 关中断、存 PC/PSW、寻址跳转
中断响应后 软件 (中断服务程序) 保护现场(存通用寄存器)、执行任务、恢复现场

所以,“中断隐指令”就是 CPU 硬件为中断程序“铺路”的过程。 没有它,中断机制就无法安全、有序地启动。


8.多个中断请求时如何进行裁决

当多个中断请求(Interrupt Requests)同时发生,或者在一个中断处理期间又来了另一个中断时,CPU 必须像急诊室的医生一样进行**“裁决”(Arbitration)**。

裁决的核心逻辑是:优先级(Priority)。实现这种裁决主要有三种方式:


1. 软件查询法 (Software Polling)

这是最原始、成本最低的方法,完全靠代码逻辑来裁决。

  • 做法: 当中断发生时,CPU 统一跳到一个固定的入口程序。这个程序里写了一堆 if...else 语句,按照预设的顺序去轮询(询问)各个设备的标志位。
  • 裁决逻辑: 写在最前面的 if 语句优先级最高。
  • 优缺点:
    • 优点: 硬件电路简单。
    • 缺点: 慢!如果排在最后的设备请求中断,CPU 得把前面所有的设备都问一遍,浪费时间。

2. 硬件排队器 (Hardware Daisy Chaining)

这是一种利用物理电路连接顺序来决定优先级的“链式”方法。

  • 做法: 所有的中断设备像“串糖葫芦”一样连在一条“中断响应线(INTA)”上。
  • 裁决逻辑: 物理位置越靠近 CPU 的设备,优先级越高。
  • 过程:
    1. CPU 发出一个响应信号。
    2. 信号顺着线往下传。
    3. 第一个有中断需求的设备会直接“截获”这个信号,并不再向下传递。
    4. 后面的设备只能等前面的处理完了才有机会。

3. 中断控制器法 (Interrupt Controller - 现代主流)

这是通过专门的硬件芯片(如经典的 8259A 或现代的 APIC)来完成裁决。

  • 做法: 所有的中断线都插在“中断控制器”这个“接线板”上。
  • 裁决逻辑: 控制器内部有三个核心寄存器:
    1. IRR (请求寄存器):记录谁发了请求。
    2. IMR (屏蔽寄存器):记录谁被禁用了。
    3. ISR (服务中寄存器):记录现在谁正在被处理。
  • 裁决过程: 控制器比较 IRR 中所有未被屏蔽的请求,挑选优先级最高的一个,通过 INT 引脚报告给 CPU。

4. 裁决后的“嵌套”逻辑 (Nested Interrupts)

裁决不仅发生在“同时到达”时,还发生在“后浪推前浪”时。这就引出了中断嵌套的概念:

裁决情况 处理方式
低优先级中断运行中,来了高优先级 抢占 (Preemption):CPU 暂停当前中断,先去处理高的,处理完再回来。
高优先级中断运行中,来了低优先级 屏蔽 (Masking):CPU 视而不见,等手头的干完了再说。
同级别中断同时到达 排队 (Queuing):按照硬件连线或预设的固定编号顺序,一个接一个来。

5. 形象比喻:老师批改作业

  • 软件查询法: 班长喊“有人交作业!”,老师挨个问:“张三是你吗?李四是你吗?”(问到谁是谁)。
  • 硬件排队器: 学生排成一队。老师把奖状发给第一个人,第一个人拿走了,后面的人就拿不到(位置决定优先级)。
  • 中断控制器: 每个学生把作业放进一个格子里(IRR)。老师看一眼格子旁边的“优先级名单”,发现校长的儿子(最高优先级)交了,哪怕他最后交,老师也先改他的。

总结:考研/考试重点

  1. 裁决的本质: 解决优先级竞争。
  2. 硬件向量法 vs 软件查询法: 硬件法快(电路实现),软件法慢(指令查询)。
  3. 中断屏蔽字: 软件可以通过修改 PSW 或 IMR 来动态改变裁决的结果(比如我虽然是老师,但我现在想先改课代表的,就把其他人的先“屏蔽”掉)。


9.系统调用过程中除了要保存现场,还需要将系统调用号和所需参数压入堆栈,这里的系统调用号和所需参数指代什么

在系统调用(System Call)的过程中,除了为了恢复运行而保存的现场(PC、PSW、通用寄存器)外,传递“系统调用号”和“参数”是实现用户态向内核态请求服务的核心步骤。

1. 系统调用号 (System Call Number)

定义与作用:

系统调用号是一个唯一的整数索引,用于标识操作系统内核提供的某项具体服务。由于用户程序运行在受限的用户态,无法直接跳转到内核代码的具体内存地址,因此必须通过一个“编号”来告知内核所需的操作。

  • 唯一性: 每个内核函数(如文件读取、进程创建、内存申请)都对应一个固定的编号。例如在 Linux x64 架构中,0 代表 read,1 代表 write,2 代表 open。
  • 功能分发: 内核中维护着一张系统调用表(System Call Table)。当触发中断(如执行 SYSCALL 指令)后,内核会读取这个编号,并在表中查找对应的内核函数入口地址。

2. 所需参数 (Parameters)

定义与作用:

系统调用通常需要具体的输入数据才能完成任务,这些数据即为“参数”。不同的系统调用需要的参数数量和含义各不相同。

  • 具体实例:
    • 请求“写文件”服务时,参数需包含:文件描述符(写到哪)、缓冲区首地址(写什么内容)、写入长度(写多少字节)。
    • 请求“创建进程”服务时,参数可能包含:新进程的优先级、执行路径等。
  • 数据类型: 参数可以是具体的数值,也可以是指向用户空间内存区域的指针。

3. 参数传递的机制

在触发系统调用之前,这些信息需要从用户态传递给内核态。常见的传递方式包括:

  1. 寄存器传递(主流方式):

    现代处理器(如 x86-64, ARM)通常将系统调用号和少量参数直接放入指定的通用寄存器中(如 rax 存编号,rdi, rsi 存参数)。这种方式速度最快。

  2. 堆栈传递:

    当参数数量较多,寄存器容纳不下时,或者在某些较老的架构中,程序会将参数按顺序压入用户栈中。内核在接管 CPU 后,会从栈中读取这些信息。

  3. 内存块传递:

    将所有参数打包存放在内存的一个连续区域,然后仅将该区域的首地址存入寄存器传递给内核。


4. 逻辑模型总结

我们可以将系统调用的参数传递逻辑理解为一种**“柜台式服务”**:

  • 系统调用号: 相当于业务窗口的服务代号(如 1 号窗口办取款,2 号窗口办开户)。
  • 参数: 相当于办理业务时提交的表单单据(如取款金额、账号信息)。
  • 压入堆栈/寄存器: 相当于将单据放在转交盒中。
  • 陷入指令: 相当于按下呼叫按钮,通知柜台后的工作人员(内核)开始处理。

5. 笔记要点梳理

项目 角色 意义
系统调用号 索引值 确定“要做什么”,对应内核函数表的下标。
所需参数 输入数据 确定“怎么做”,提供函数执行必须的变量信息。
传递媒介 栈/寄存器 跨越权限边界(用户态到内核态)的数据通道。

这种机制保证了用户程序只能通过受控的、预定义的接口访问系统资源,确保了操作系统的安全与稳定。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐