软件中断与系统调用

10
我有一个问题,不知道是否完全合理: 如果在中断向量中有一个中断函数,其中每个地址槽都是指向处理中断的某些函数的指针(类似于服务,并在内核模式下运行),那么我的问题是: 使用软件中断而不是使用系统调用(也称为函数)是否有所不同? 让我们举个例子:我可以用两种方式在Windows中销毁进程:
1. 我只需要调用“ExitProcess” 2. 我只需在汇编中使用“int80h”中断(好吧,至少在Linux中是这样。在Windows中可能吗?)
两者都能起作用并产生相同的结果。我认为唯一的区别是中断会停止CPU,而因为系统调用不是中断,所以它不会阻止CPU执行其他操作(这允许多线程并且不需要停止整个CPU做一些不需要停机的事情)。
我的真正意思是WIN32API(或任何其他OS中的所有函数)都可以改为实现为中断,而不会有任何区别。然后,这将使WIN32API变成一个不必要的层。你不这么认为吗?那么,软中断和系统调用之间有什么区别? 您只需要在WIN32API中调用函数来请求服务,而对于中断,您只需要通过堆栈或寄存器传递参数并调用由编号标识的指定中断。 我想到的唯一原因是DLL(这些的实例)是每个进程创建的,而您只使用所需的功能。
这在中断中是不可能的,并且所有进程都将共享相同的数据,这并不总是人们所希望的。
附:这是一个额外的问题,超出了主题范围,但是这是一个小问题:我在哪里可以查看可以在操作系统中调用的所有中断的参考/列表?我无法在任何地方找到文档。

1
请注意,除非您执行诸如“HLT”或“PAUSE”之类的命令,否则CPU不会停止。但是,它将执行许多“内部”工作,例如在堆栈上保存所有寄存器并更改位并切换到新的内存模型...正如Jester所指出的那样,所有这些都是昂贵的,但CPU会执行所有这些操作,尽管看起来它们已经停止了,实际上并没有! - Alexis Wilke
1
在Windows上,除了通过公共API进行系统调用外,其他方式都不太实际。每次Microsoft发布新版本的Windows时,系统调用号码都会发生变化。此外,公共API通常与用于实现它们的较低级别系统调用有很大不同。即使在Linux上,使用库接口也比较好,因为它更好地记录并且功能更强大。甚至可能比使用旧的和缓慢的软件中断接口更快。 - Ross Ridge
我很好奇优先使用调用是否有性能上的好处。许多内核查询可以通过缓存内核数据在用户模式下解决。例如,我们可以将内核视为服务器,将中断视为同步ajax调用;询问服务器您登录的身份可能很昂贵,但是如果您已经在客户端(用户模式)缓存了登录身份,则无需发出中断(ajax请求)。在用户模式和内核模式使用相同机器的情况下,调用比中断更便宜吗? - Dmytro
如果是这样的话,这可能解释了为什么微软更喜欢将其API作为函数(可在用户模式下调用而无需切换模式),而不是每次都发出调用。例如,在用户模式下执行printf可能比每个printf都发出系统调用更便宜。 - Dmytro
1个回答

11

系统调用指的是操作系统提供的服务被调用。具体机制可能涉及中断、调用门或其他专用指令(syscall、sysenter、swi、trap),这取决于架构和操作系统。

Winapi 隐藏了这个机制,它是一个你不必担心的实现细节。它也可能没有记录并且会发生变化,而公共 API 应该是稳定的。

在 32 位 x86 Linux 系统中,出于性能考虑,使用中断 0x80 执行系统调用已经过时超过十年。在 32 位模式下,内核本身提供了执行系统调用所需的代码,使用内核认为最佳的机制。此代码映射到每个进程中(请在此处阅读有关 vdso 的信息)。在 x86-64 Linux 中,则使用专门的syscall指令。

此外,有些操作系统函数不需要切换到内核模式(这是一个代价高昂的操作)。API 层也可以隐藏这种差异,并自动提供最有效的方式。


最终归结为两点:
  1. 中断是昂贵的。只有在需要切换到内核时才需要它们。并非所有服务都需要这样做。因此,最好调用操作系统API的函数,函数本身将根据需要(或不需要)从用户模式切换到内核模式。这将加快速度。
  2. 接口稳定性 还有哪些中断?我的意思是,我除了用于退出进程的int80H之外,什么都不知道。
我可以向操作系统请求哪些其他“请求”或服务?
- Hashirama Senju
尽管我并不打算使用它,但我想了解一些它们的用途。顺便说一下:我猜它只能在保护模式下使用,INT指令?(http://stackoverflow.com/questions/10583657/x86-assembly-masm32-can-i-use-int-21h-on-windows-xp-to-print-things) - Hashirama Senju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接