最近,我一直在阅读有关操作系统设计的内容。所有用户空间程序通过"系统调用接口"使用内核服务的想法;让我进一步思考这个提出下面的一些问题。
答案 0 :(得分:2)
系统调用如何引起内核的注意?它会发送某种中断吗?
操作系统为中断,故障和陷阱定义了内核模式处理程序表。在系统系统上有多个表(例如,中断分开),但从逻辑上讲,您可以将其视为一个表。
当发生中断,故障或陷阱时,CPU会在表中查找相应事件的条目。该条目指定了处理该事件的例程。
对于系统服务,处理器将定义一个或多个明确触发调用系统服务的陷阱的指令。像这样:
CHKM #12 ; Trigger a trap causing entry in to kernel mode to be handled by routine #12.
系统调用是在每个操作系统上使用特定语言(如“C / C ++”)实现的,还是某种汇编语言或机器代码?
通常它是汇编语言,但有时它可以用C语言编写。
操作系统在系统调用之上提供API。 API通常用C或C ++编写。如果System调用是汇编语言,那些API如何生成汇编代码?
调用系统需要汇编语言来执行陷阱指令并为系统服务设置硬件寄存器。操作系统总是提供可以从高级语言调用的包装函数,这些函数将解包参数,导致陷阱,并重新打包从系统服务返回的参数。
Java字节代码或MSIL代码是否会转换为API调用,还是直接转换为系统调用?
字节代码对系统服务一无所知。它们必须由虚拟机调用。
答案 1 :(得分:0)
大多数系统调用是使用c / c ++实现的,如果直接访问(DMA)到设备,则使用汇编语言。
在大多数情况下,系统调用或其他系统服务将在运行时作为动态链接库加载。因此,即使已编译的代码已被转换/转换为本地机器代码,系统调用以哪种语言实现也无关紧要。
无需将字节码/ IL转换为sys调用。运行时/虚拟机将在运行时简单地利用系统服务(包括系统调用)。
系统调用本身就是一种中断(硬件中断是另一种中断),内核本身存在用于系统调用的例程。因此,当运行时或虚拟机需要调用系统调用时,操作系统会执行一个切换(从用户模式到内核模式),执行sys调用,然后再切换回内核到用户模式。