早在 x86(32 位)时代(在 sysenter/sysexit/syscall 等之前),INT 0x80 用于从用户态进程调用内核操作。根据https://stackoverflow.com/questions/1817577/what-does-int-0x80-mean-in-assemble-codeDOS 使用 INT 0x21 来达到同样的目的。同一消息来源指出,x86 CPU 最多可以理解 256 个软中断(0x00 - 0xff)。即使其中一些被特殊功能阻止,操作系统也应该能够使用多个软中断。但似乎没有操作系统这样做。只使用一个吗?做出这个设计决定的原因是什么?
答案1
没有足够的软中断供所有系统调用使用,因此需要一个标识系统调用的参数。没有理由对系统调用进行二维编号。无论如何,所有软件中断都是相似的,没有哪个软件中断更适合某些特定类型的系统调用。
答案2
Linux 所基于的 Unix 在设计上并没有专门使用中断。
在 x86 架构上,调用中断会导致执行在环 0 中。而实际上,系统调用实际上使用现有上下文,并且仅保存设置为系统调用的第一个寄存器 (EAX) 的线程状态。其他寄存器是系统调用的其他操作数。您会明白为什么它非常便携。
跳过这一步也许可以节省2-3个助记词。将所有系统调用都引用为中断将使代码不可移植,如果需要超过 256 个系统调用,则无论如何都必须使用这样的系统。 x86 上的软中断与中断向量表 (IVT) 上的硬件中断地址共享。因此,特别是在某些硬件配置上使用它们的想法是完全可能的。
进一步进行多个软中断会增加缓存未命中的机会,因为必须从不同的内存区域加载大致相似的中断处理程序代码。