我试图理解使用中断的“旧”系统调用机制与依赖特定处理器指令的当前系统调用机制之间的区别。
AFAIK 两者在 C 程序方面的工作方式相同:即调用内核 C 函数,然后分派到正确的系统调用处理程序。那么,是什么让“新”系统调用系统更加高效呢?
仅仅是因为更高效的处理器指令使得调用“系统调用”比“中断”更快吗?与系统调用本身必须完成的工作量(即写入文件)相比,这种时间差异是否足够显着?
答案1
它们速度更快,因为它们要做的工作少得多,而且不需要从内存中读取。
当您使用软件中断来发出系统调用时,CPU 不会知道这就是你正在做的事情。它需要从中断描述符表中读取目标CS和EIP值。 CS的值指定目标权限级别是什么;一旦 CPU 弄清楚这一点,它就需要确定目标状态是什么,这涉及从内存中读取更多数据。
SYSCALL
另一方面是完全基于寄存器的;目标特权级别是提前知道的,目标状态是由内核设置的 MSR 指定的。
与某些系统调用的持续时间相比,速度差异很小,但有许多快速系统调用。当然,整个 KPTI 业务意味着所有系统调用都很慢,但速度提升SYSCALL
仍然值得拥有。