OS API是否使用中断?

时间:2012-09-19 18:43:56

标签: assembly operating-system

我的意思是,在操作系统API的核心深处,是否存在程序从操作系统请求的每个基本功能的中断“调用”?

3 个答案:

答案 0 :(得分:2)

至少在Linux上有系统调用。当用户空间想要来自内核的东西时,会发出软件中断0x80,其中包含要在寄存器中调用的函数的索引。

More here

答案 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操作系统的系统调用