我有一个问题,我不知道它是否完全有道理: 如果在中断向量中有一个中断函数,其中每个地址槽都是指向处理中断的某个函数的指针(服务的类型,并在内核模式下运行),那么我的问题是:
制作软件中断而不是使用系统调用(又称函数)会有所作为吗? 让我们举一个例子:我可以在Windows中以两种方式销毁一个进程:
两者都能奏效并给出相同的结果。我认为唯一不同的是中断会停止CPU,而系统调用,因为它不是一个中断,它不会停止CPU做其他事情(这允许多线程而不是为了不需要停止的东西而停止)整个CPU)。
想要我真正的意思是WIN32API(或任何其他操作系统)中的所有功能都可以实现为中断而不会产生任何影响。然后,这将使WIN32API成为一个不需要的层。你觉得不是吗?那么,软件中断和系统调用之间有什么区别? 您只需要调用WIN32API中的函数来请求服务,并且使用中断,您只需要传递参数(通过堆栈或寄存器)并调用由数字标识的指定中断。 我能想到的唯一原因是每个进程都创建了DLL(这些实例),并且只使用了你需要的函数。
这对中断是不可能的,并且所有进程都会共享相同的数据,这并不总是人们想要的。
PD:这是一个额外的问题,这个问题超出了主题但是有点问题:我在哪里可以看到我可以在操作系统中调用的所有中断的参考/列表?我无法在任何地方看到任何文档。
答案 0 :(得分:9)
系统调用基本上只是意味着调用操作系统提供的服务。实际机制可能涉及中断,调用门或其他专用指令(系统调用,sysenter,swi,陷阱),具体取决于体系结构和操作系统。
winapi隐藏了这种机制,它是您不必担心的实施细节。它也可能没有文档,可能会发生变化,而公共API应该是稳定的。
在32位x86 linux中,出于性能原因,使用中断0x80来执行系统调用已经过时了十多年。在32位模式下,内核本身提供了使用内核认为最好的机制执行系统调用的代码。此代码映射到每个进程(阅读有关vdso here)。在x86-64 linux中,使用了专门的syscall
指令。
此外,还有一些操作系统功能不需要切换到内核模式(这是一项代价高昂的操作)。 API层也可以隐藏这种差异,并自动为您提供最有效的方式。