我的意思是,深入到操作系统API的核心,是否有程序从操作系统请求的每个基本功能的中断“调用”?操作系统API使用中断吗?
回答
至少在Linux上有syscalls。当用户空间想要内核中的东西时,会发出一个软件中断0x80
以及它想要在寄存器中调用的函数索引。
是的,有很多时候是这样的中断。
中断和异常处理程序和系统调用通常使用相同的机制来实现。原因在于,在所有这些情况下,必须将控制权转移到内核中,并且必须在处理事件之前保存许多寄存器并将其恢复。中断处理发生在内核中,无处不在(罕见的CPU不支持中断),这是中断处理,异常处理和系统调用的自然选择。
更重要的是,在某些情况下,需要从内核中调用系统调用。
在Windows中,例如,内核代码经常有打电话或者ZwFoo()
或NtFoo()
,其中Foo
是一些有意义的函数名和Zw
和Nt
的名称前缀的Foo()
两个版本之间区别的一个选项。如果选择ZwFoo()
,则直接调用Foo()
。 OTOH,如果选择NtFoo()
,则控制首先必须通过系统呼叫(AKA陷阱)机制/代码,然后才能达到实际的Foo()
。这两个版本之间的选择与Previous Mode
之类的东西有关。
关于Previous Mode
的几句话...内核代码是可信的。用户代码不受信任。从用户模式调用Foo()
时,内核将尽最大努力验证所有不受信任的输入,并在执行所请求的操作之前检查是否存在所有权限。这就是它应该如此。现在内核本身有时需要调用Foo()
。如果它代表自己调用Foo()
,则不需要进行一些严格的检查。但是如果它代表用户代码调用Foo()
以及来自用户模式的输入(以及所有不可信),则必须进行这些检查。因此,根据内核调用ZwFoo()
或NtFoo()
。当NtFoo()
被调用时PreviousMode
被设置为UserMode
并且表示上述检查的必要性。当调用ZwFoo()
时,对于用户模式调用者,PreviousMode
仍为UserMode
,对于内核模式调用者,PreviousMode
设置为KernelMode
。所以,用户模式的调用者不能避免检查,但内核有选择做(当他们需要时)或不(当他们不需要时)。
你可以用'CreateFile'或'ReadFile'替代'Foo'来得到一个想法。 –
- 1. 操作系统调用中断吗?
- 2. 操作系统中断
- 3. 电脑操作系统不能使用fs登录系统API
- 4. 操作系统中
- 5. 在操作系统中,系统调用和中断有什么区别?
- 6. 如何判断用户正在使用什么操作系统?
- 7. 操作系统
- 8. 我应该使用Docker在Linux操作系统中创建Linux操作系统吗?
- 9. 在Windows操作系统中的pathos软件包操作系统
- 10. C/C++声音操作系统API
- 11. 操作系统是一个过程吗?
- 12. OSX是POSIX操作系统吗?
- 13. 操作系统是抽象吗?
- 14. 我可以在操作系统使用php的Tickting System上实现SMS Api吗?
- 15. 与操作系统无关的API来监视文件系统?
- 16. Java中的操作系统
- 17. 操作系统中的fork()
- 18. 操作系统 - TLB
- 19. Linux操作系统
- 20. FASM操作系统
- 21. 在不使用API的情况下关闭操作系统
- 22. 操作系统可以透明地使用ebs吗?
- 23. 你可以使用PySphere获得客户操作系统吗?
- 24. 使用TDD/BDD开发操作系统
- 25. 不使用WMI获取操作系统
- 26. 使用非的Win8操作系统
- 27. 使用c#获取操作系统#
- 28. AWS RDS使用的操作系统
- 29. 使用C++编写操作系统
- 30. 在Symbian操作系统中检测到电源中断
这就是我需要知道的。在内部深处,由OS IVT处理的软件中断存在问题。 API只是将你这样的东西隐藏起来。谢谢。 –
@ JoAoSilva:已经有好几年了,x86处理器通过'syscall' /'sysenter'指令可以更快地创建系统调用。 glibc使用OS传递给它的信息来选择合适的一个。 – ninjalj