系统调用和中断的实现如何相互不同?

时间:2017-03-16 12:39:37

标签: c assembly operating-system kernel x86-16

我正在开发一个简单的操作系统,只是为了更好地了解其内部结构。在开发Boot loader和在16-bit Real Mode上运行的简单内核时,我遇到了一个不熟悉的术语System Call和一个熟悉的Interrupt

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

我仍然不清楚如何实施系统调用。

说,我正在为print a word编写一个简单的C程序并进行编译。现在,我留下了一个包含系统调用的可执行文件,用于在屏幕上打印给定的单词。我对应给定方案的问题如下:

问题1:

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

问题2:

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

如果我似乎没有清楚地理解这些概念,请向我解释系统调用的概念。

感谢你。

2 个答案:

答案 0 :(得分:1)

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

  

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

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

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

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

    没有。他们以同样的方式派遣。

    据推测,操作系统可以将系统调用和中断映射到同一个处理程序,但这很麻烦。

答案 1 :(得分:1)

系统调用类似于对操作系统的函数调用,其执行不能或不应该由程序手动处理的操作,并且属于操作系统的任务范围,例如,操作系统。文件操作,写入屏幕等。

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

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

最后,当前执行的程序也可以使用" int n"直接触发任何中断。指令。

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

请记住,还有其他方法可以实现系统调用。例如,在保护模式下,x86提供的调用门是特殊段,如果您尝试使用远程调用将它们加载到CS中,则会导致系统调用。较新的处理器提供特殊的系统调用指令,可以更快地中断