2017-03-16 46 views
0

我正在开发一个简单的操作系统,只是为了更好地了解它的内部。在开发Boot loader和在16-bit Real Mode上运行的简单内核时,我遇到了陌生术语System Call和熟悉的Interrupt系统调用和中断的执行有何不同?

我一直在谷歌搜索的条款,因为只发现概念仍然不清楚给我。据我所知,在least privileged mode中运行的应用程序使用系统调用来请求运行在Higher Privileged mode(Ring 0)中运行的内核的服务。

我还不清楚系统调用是如何实现的。

说,我正在写一个简单的C程序到print a word并编译它。现在,我剩下一个可执行文件,其中包含系统调用以在屏幕上打印给定的单词。是对应于给定的情况下我的问题如下:

问题1:

一旦执行该程序时,系统调用通知请求的内核 - 到底发生在这里的低层次方面编程吗?

问题2:

中断可以是系统呼叫时,反之亦然?


如果看起来我没有清楚地理解概念,请向我解释系统调用的概念。


感谢你。

+2

注意,你不必在实模式特权级别。系统调用是调用操作系统的通用术语。中断可以用来执行一个系统调用,但x86也有专门的指令('syscall','sysenter')。 – Jester

+0

这是否意味着系统调用和中断是相同的? –

+1

不,他们不一样。中断可以用来实现系统调用,但这不是他们的主要目的。 – Jester

回答

1

在大多数系统上,中断和系统调用(以及异常处理程序)都以相同的方式实现。

程序一执行,系统调用就会通知内核请求 - 在低级编程方面究竟发生了什么?

通常,系统调用是围绕汇编语言例程的包装。事件的顺序是:

  1. 电话系统例行
  2. 系统例行解包参数并加载它们到寄存器中。
  3. 系统例程通过执行更改模式指令(某些高于用户模式的模式)强制执行异常(由数字标识)。
  4. CPU通过调度到系统调度表中的异常处理程序来处理异常。
  5. 处理程序执行系统服务。
  6. 处理程序执行异常或中断指令的返回,将进程返回到用户模式(或从中调用任何模式)并返回到系统服务例程。
  7. 系统服务程序解开寄存器的返回值并更新参数。
  8. 返回到调用函数。

中断可以是系统调用吗?反之亦然?

号,他们被分派以同样的方式。

想必操作系统可以系统调用和中断映射到相同的处理,但是这将是扭曲。

1

系统调用像函数调用操作系统,执行不能或不宜通过手动的程序处理,并倒在操作系统的任务范围内操作,例如文件操作,写筛选等

x86的处理由某种回调机制处理中断。各种外部中断都有一个中断号。操作系统设置一个表(中断向量表处于实模式,中断描述符表处于保护模式),它存储指向处理相应中断的函数的指针。例如,如果在接收到来自中断控制器的中断时按下按键中断将被分配给int 21h,则CPU存储当前代码段,指令指针,标志和堆栈,然后CPU将检查中断表中的条目21h并读取取出指令处理程序所在的地址。然后执行处理程序并恢复正常执行。

但是,在中断表中调用处理程序的这种行为不仅可以由真实硬件中断触发,还可以由内部异常(如除以零,达到未定义的操作码等)触发。异常被分配给与硬件中断有所不同的中断号。

最后任何中断,也可直接通过“INT N”指示当前执行的程序触发。

这最后一个功能通常用于系统调用。原因在于用户程序只需要知道中断号(通常是标准化的(DOS主要使用21h,Linux主要是80h),操作系统可以将中断处理程序放在任何它喜欢的地方,并将其地址存储在对应的中断表项

请记住,还有其他的方式来实现系统调用,例如在保护模式下,x86提供的调用门是特殊的段,如果你试图把它们加载到CS使用远程调用。新的处理器提供了特殊的系统调用的指令更快他们中断