系统调用和中断的实现有何不同?
How does the Implementation of System Calls and Interrupts differ from each other?
我正在开发一个简单的操作系统只是为了更好地了解它的内部结构。在开发 Boot loader
和在 16-bit Real Mode
上运行的简单内核时,我遇到了不熟悉的术语 System Call
和熟悉的 Interrupt
.
从那以后我一直在谷歌搜索这些术语,结果发现这些概念对我来说仍然不清楚。据我了解,least privileged mode
中的应用程序 运行 使用系统调用向 Higher Privileged mode(Ring 0)
中的内核 运行 请求服务。
我还不清楚系统调用是如何实现的。
说,我正在为 print a word
编写一个简单的 C 程序并编译它。现在,我剩下一个可执行文件,其中包含一个系统调用,用于在屏幕上打印给定的单词。我给定场景对应的问题如下:
问题一:
程序一执行,系统调用就会通知内核请求 - 就低级编程而言,这里到底发生了什么?
问题二:
中断可以是系统调用,反之亦然吗?
如果我似乎没有清楚地理解这些概念,请向我解释系统调用的概念。
谢谢。
在大多数系统上,中断和系统调用(以及异常处理程序)的实现方式相同。
As soon the Program is executed, the system call informs the kernel of the request - What exactly happens here in terms of low level programming?
通常,系统调用是对汇编语言例程的包装。事件顺序是:
- 调用系统例程
- 系统例程解包参数并将它们加载到寄存器中。
- 系统例程通过执行更改模式指令(到高于用户模式的某个模式)来强制异常(由数字标识)。
- CPU 通过在系统调度 table 中调度到异常处理程序来处理异常。
- 处理程序执行系统服务。
- 处理程序从异常或中断指令中执行 return,return将进程转到用户模式(或从中调用的任何模式)和系统服务例程。
- 系统服务例程从寄存器中解压 return 值并更新参数。
- Return 到调用函数。
Can an Interrupt be a System Call or vice versa?
没有。它们以相同的方式发送。
大概操作系统可以将系统调用和中断映射到同一个处理程序,但这会很麻烦。
系统调用就像对操作系统的函数调用,执行不能或不应该由程序手动处理的操作,并且属于操作系统的任务范围,例如文件操作、写入屏幕等
x86 句柄通过某种回调机制处理中断。各种外部中断都被赋予一个中断号。操作系统设置了一个table,(实模式下的中断向量table和保护模式下的中断描述符table),它存储指向处理相应中断的函数的指针。例如,如果在从中断控制器接收到中断时将按键中断分配给 int 21h
,则 CPU 存储当前代码段、指令指针、标志和堆栈,然后 CPU 将检查中断table 中的条目21h 并读出指令处理程序所在的地址。然后它执行处理程序并恢复正常执行。
然而,这种在中断中调用处理程序的行为 table 不仅可以由真正的硬件中断触发,还可以由内部异常(如被零除、达到未定义的操作码等)触发。 .异常被分配给中断号,希望与硬件中断使用的中断号不同。
最后,任何中断也可以由当前执行的程序使用"int n"指令直接触发。
这最后一个特性通常用于系统调用。原因是用户程序只需要知道中断号(通常是标准化的(DOS主要使用21h,Linux主要使用80h)操作系统可以将中断处理程序定位到任何它喜欢的地方并将其地址存储在相应的中断 table 条目中。
请记住,还有其他方法可以实现系统调用。例如,在保护模式下,x86 提供的调用门 是特殊的段,如果您尝试使用远调用将它们加载到 CS 中,则会导致系统调用。较新的处理器提供特殊的系统调用指令,它们的中断速度更快
我正在开发一个简单的操作系统只是为了更好地了解它的内部结构。在开发 Boot loader
和在 16-bit Real Mode
上运行的简单内核时,我遇到了不熟悉的术语 System Call
和熟悉的 Interrupt
.
从那以后我一直在谷歌搜索这些术语,结果发现这些概念对我来说仍然不清楚。据我了解,least privileged mode
中的应用程序 运行 使用系统调用向 Higher Privileged mode(Ring 0)
中的内核 运行 请求服务。
我还不清楚系统调用是如何实现的。
说,我正在为 print a word
编写一个简单的 C 程序并编译它。现在,我剩下一个可执行文件,其中包含一个系统调用,用于在屏幕上打印给定的单词。我给定场景对应的问题如下:
问题一:
程序一执行,系统调用就会通知内核请求 - 就低级编程而言,这里到底发生了什么?
问题二:
中断可以是系统调用,反之亦然吗?
如果我似乎没有清楚地理解这些概念,请向我解释系统调用的概念。
谢谢。
在大多数系统上,中断和系统调用(以及异常处理程序)的实现方式相同。
As soon the Program is executed, the system call informs the kernel of the request - What exactly happens here in terms of low level programming?
通常,系统调用是对汇编语言例程的包装。事件顺序是:
- 调用系统例程
- 系统例程解包参数并将它们加载到寄存器中。
- 系统例程通过执行更改模式指令(到高于用户模式的某个模式)来强制异常(由数字标识)。
- CPU 通过在系统调度 table 中调度到异常处理程序来处理异常。
- 处理程序执行系统服务。
- 处理程序从异常或中断指令中执行 return,return将进程转到用户模式(或从中调用的任何模式)和系统服务例程。
- 系统服务例程从寄存器中解压 return 值并更新参数。
- Return 到调用函数。
Can an Interrupt be a System Call or vice versa?
没有。它们以相同的方式发送。
大概操作系统可以将系统调用和中断映射到同一个处理程序,但这会很麻烦。
系统调用就像对操作系统的函数调用,执行不能或不应该由程序手动处理的操作,并且属于操作系统的任务范围,例如文件操作、写入屏幕等
x86 句柄通过某种回调机制处理中断。各种外部中断都被赋予一个中断号。操作系统设置了一个table,(实模式下的中断向量table和保护模式下的中断描述符table),它存储指向处理相应中断的函数的指针。例如,如果在从中断控制器接收到中断时将按键中断分配给 int 21h
,则 CPU 存储当前代码段、指令指针、标志和堆栈,然后 CPU 将检查中断table 中的条目21h 并读出指令处理程序所在的地址。然后它执行处理程序并恢复正常执行。
然而,这种在中断中调用处理程序的行为 table 不仅可以由真正的硬件中断触发,还可以由内部异常(如被零除、达到未定义的操作码等)触发。 .异常被分配给中断号,希望与硬件中断使用的中断号不同。
最后,任何中断也可以由当前执行的程序使用"int n"指令直接触发。
这最后一个特性通常用于系统调用。原因是用户程序只需要知道中断号(通常是标准化的(DOS主要使用21h,Linux主要使用80h)操作系统可以将中断处理程序定位到任何它喜欢的地方并将其地址存储在相应的中断 table 条目中。
请记住,还有其他方法可以实现系统调用。例如,在保护模式下,x86 提供的调用门 是特殊的段,如果您尝试使用远调用将它们加载到 CS 中,则会导致系统调用。较新的处理器提供特殊的系统调用指令,它们的中断速度更快