当线程通过引发中断 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/