assembly - 软件中断VS系统调用

标签 assembly operating-system signals interrupt system-calls

我有一个问题,我不知道它是否完全有意义: 如果中断向量中有一个中断函数,其中每个地址槽都是指向处理中断的某个函数的指针(一种服务,并在内核模式下运行),那么我的问题是:

使用软件中断而不是使用系统调用(又名函数)会有所不同吗? 让我们举个例子:在 Windows 中我可以通过两种方式销毁进程:

  1. 我只是调用“ExitProcess”
  2. 我只是在汇编中使用中断“int80h”(嗯,至少在Linux中。在Windows中可能吗?)

两者都可以工作并给出相同的结果。我认为唯一的不同是中断会停止CPU,而系统调用,因为它不是中断,所以不会停止CPU做其他事情(这允许多线程,并且不会停止一些并不真正需要停止的事情)整个CPU)。

我真正的意思是,WIN32API(或任何其他操作系统)中的所有函数都可以作为中断来实现,并且没有什么区别。那么这将使 WIN32API 成为一个不必要的层。你不觉得吗?那么,软件中断和系统调用有什么区别呢? 你只需要调用WIN32API中的函数来请求服务,而对于中断,你只需要传递参数(无论是通过堆栈还是寄存器)并调用由数字标识的指定中断。 我能想到的唯一原因是 DLL(这些实例)是为每个进程创建的,并且您只使用您需要的函数。

这对于中断来说是不可能的,并且所有进程将共享相同的数据,这并不总是人们所希望的。

PD:这是一个额外的问题,虽然超出了主题,但却是一个小问题:我在哪里可以看到我可以在操作系统中调用的所有中断的引用/列表?我在任何地方都看不到任何文档。

最佳答案

系统调用基本上只是意味着调用操作系统提供的服务。实际机制可能涉及中断、调用门或其他专用指令(syscall、sysenter、swi、trap),具体取决于体系结构和操作系统。

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

在 32 位 x86 Linux 中,出于性能原因,使用中断 0x80 执行系统调用已经过时了十多年。在 32 位模式下,内核本身提供使用内核认为最好的机制执行系统调用的代码。该代码被映射到每个进程(阅读 vdso here )。在x86-64 linux中,使用专门的syscall指令。

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

关于assembly - 软件中断VS系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298551/

相关文章:

assembly - 如果许多编程语言前端的编译器后端相同,那么不同语言的编译目标代码是否相同?

exception - RISC-V 从带有压缩指令的异常处理程序返回

java - notification.setOngoing(true) 在 Android 8.1 中不起作用

linux - sigtimedwait() 的 "set"参数中的信号未传送

python - wxPython 处理 SIGTERM/SIGINT

assembly - 如何更改程序集中当前光标位置的背景颜色

assembly - __div_64_32 使用的算法

operating-system - 在 EFI 模式下启动是否意味着我将无法访问 BIOS 中断?

css - HTML 从 Windows 更改为 Mac

C - 优雅地中断 msgrcv 系统调用