我的意思是,在操作系统API的核心深处,是否存在程序从操作系统请求的每个基本功能的中断“调用”?
答案 0 :(得分:2)
至少在Linux上有系统调用。当用户空间想要来自内核的东西时,会发出软件中断0x80
,其中包含要在寄存器中调用的函数的索引。
答案 1 :(得分:2)
是的,经常会有这样的中断。
中断和异常处理程序和系统调用通常使用相同的机制实现。原因在于,在所有这些情况下,必须将控制转移到内核中,并且必须在处理事件之前保留许多寄存器并在事件处理之后恢复。中断处理发生在内核中,无处不在(罕见的CPU不支持中断),它是中断处理,异常处理和系统调用的自然选择。
更重要的是,在某些情况下,最好从内核中调用系统调用。
在Windows中,例如,内核代码通常可以调用ZwFoo()
或NtFoo()
,其中Foo
是一些有意义的函数名称,Zw
和{{ 1}}是名称前缀,区分Nt
的两个版本。如果选择Foo()
,则会直接调用ZwFoo()
。 OTOH,如果选择Foo()
,控件首先必须通过系统调用(AKA陷阱)机制/代码,然后才能到达实际的NtFoo()
。两个版本之间的选择与名为Foo()
的东西有关。
关于Previous Mode
的几句话......内核代码是可信的。用户代码不受信任。从用户模式调用Previous Mode
时,内核将尽最大努力验证所有不受信任的输入,并在执行所请求之前检查所有权限是否到位。这应该是它应该如何。现在内核本身有时需要调用Foo()
。如果它代表自己调用Foo()
,则不需要进行一些严格的检查。但如果它代表用户代码调用Foo()
来自用户模式的输入(以及所有不受信任的输入),则必须进行这些检查。因此,根据情况,内核会调用Foo()
或ZwFoo()
。调用NtFoo()
时NtFoo()
设置为PreviousMode
,表明上述检查的必要性。调用UserMode
时,ZwFoo()
对于用户模式调用者仍然是PreviousMode
,或者对于内核模式调用者,UserMode
设置为KernelMode
。因此,用户模式调用者无法避免检查,但内核可以选择执行它们(当它们是必要的时)或不执行它们(当它们不是时)。
答案 2 :(得分:-2)
OS内核具有一个API,称为系统调用,例如this is Linux操作系统的系统调用