linux - Linux 系统调用的内部结构

标签 linux operating-system linux-kernel

当线程通过引发中断 80 进行系统调用时(详细)会发生什么? Linux 对线程的堆栈和其他状态做了什么工作?对处理器进行了哪些更改以使其进入内核模式?运行中断处理程序后,如何将控制权恢复到调用进程?

如果系统调用不能快速完成怎么办:例如从磁盘读取。中断处理程序如何放弃控制权,以便处理器在数据加载时执行其他操作,然后如何再次获得控制权?

最佳答案

一个堆栈溢出答案中的内核模式速成类(class)

好问题! (面试题?)


  • 当一个 线程通过引发系统调用 中断 80?

int $80 操作有点像函数调用。 CPU“采取陷阱”并在内核模式下的已知地址处重新启动,通常也使用不同的 MMU 模式。内核将保存许多寄存器,尽管它不必保存程序不希望普通函数调用保存的寄存器。

  • Linux 对 线程的堆栈和其他状态?

通常,操作系统会保存 ABI promise 在过程调用期间不会更改的寄存器。堆栈将保持不变;内核将在每线程内核堆栈而不是每线程用户堆栈上运行。自然有些状态会发生变化,否则就没有理由进行系统调用。

  • 对 处理器将其置于内核模式?

这通常是完全自动的。 CPU 通常有一个软件中断指令,有点像函数调用操作。它将导致在受控条件下切换到内核模式。通常,CPU 会更改某种 PSW 保护位,保存旧的 PSW 和 PC,从众所周知的陷阱向量地址开始,也可能切换到不同的内存管理保护和映射安排。

  • 运行中断处理程序后, 控制权如何恢复到 调用进程?

通常会有某种“从中断返回”或“从陷阱返回”指令,其行为有点像复杂的函数返回指令。一些 RISC 处理器自动执行的操作很少,并且需要特定的代码来执行返回,而像 x86 这样的一些 CISC 处理器具有(从未真正使用过的)指令,这些指令将执行架构手册伪代码页面中记录的数十个操作,以进行能力调整。

  • 如果系统调用不能 快速完成:例如读自 磁盘。中断处理程序如何 放弃控制权,使 处理器可以做其他事情,而 正在加载数据,它是如何加载的 然后再次获得控制权?

内核本身是线程化的,就像线程化的用户程序一样。它只是切换堆栈(线程)并在其他人的进程上工作一段时间。

关于linux - Linux 系统调用的内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299566/

相关文章:

java - 操作系统(linux)如何杀死java程序?当我硬终止一个 java 进程时,jvm 会发生什么?

operating-system - 处理器如何知道一条指令正在进行系统调用

c - 在 list_for_each_entry 中使用 break 是否安全?

linux - 如何将文件从 ASCII 转换为 UTF-8?

linux - 监视 linux 上的系统(内核)负载

c++ - 检测内存页面大小

linux - linux引导期间的内存分配?

linux - 遍历目录和子目录以列出文件的脚本

node.js - 仅当文件内容与新数据不同时写入文件

多个进程的Linux内核逻辑地址