“快速”(指令)系统调用和中断驱动的系统调用有什么区别?

问题描述 投票:0回答:1

根据我的理解,最近的架构中引入了

syscall
/
sysenter
指令及其同伴,以作为进入内核的更短路径。但我不明白它是如何实现的。

这个答案说明了这一点,其理由是它们必须执行更少的操作并且基于寄存器。

另一方面,当您出于系统调用的目的触发软中断时......

CPU 不知道你在做什么。它需要从中断描述符表中读取目标CS和EIP值。 CS的值指定目标权限级别是什么;一旦 CPU 弄清楚这一点,它就需要确定目标状态是什么,这涉及从内存中进行更多读取。

但这不正是

SYSCALL
指令可能做的事情吗? (对于 TFM 第 1907 页提到的 x86-64 指令集,确实如此吗?)我认为确切的机制在技术上依赖于 ABI。但是 CPU 不需要根据内存中的某些 LUT 检查指令吗?

我可能不太清楚到底是谁(编译器、架构和操作系统供应商)在执行什么,所以请保持温和。

assembly x86 kernel cpu-architecture system-calls
1个回答
2
投票

但这不正是 SYSCALL 指令可能做的事情吗?

不,

syscall
读取新
CS:RIP
的MSR(型号特定寄存器),以及
RFLAGS
的掩码,而不是
IDTR
指向的内存。

它不会更改 RSP 或执行任何加载或存储,因此它不必读取 TSS(对于新的 SS:RSP)或执行任何页表检查(对于虚拟地址加载或存储)当它正在改变权限级别时。

它将旧的 RIP 和 RFLAGS 分别保存在 RCX 和 R11 中,以避免将任何内容存储到内存中。

这可以最大限度地减少指令,因此可以尽快完成棘手的部分(更改特权级别),使 CPU 进入内核模式(环 0)。然后,在保存用户之后,乱序 exec 可以处理

swapgs
以及加载新堆栈指针的内核代码(通常来自
gs:somewhere
;这是内核为自己获取内核堆栈指针的预期机制) -空间 RSP 某处(可能也相对于
gs
底座。)

https://www.felixcloutier.com/x86/syscall

© www.soinside.com 2019 - 2024. All rights reserved.