int 80h是否会中断内核进程?

首先是一些背景知识,这是从这本书: Linux系统编程:直接谈到内核和C库

信号是单向asynchronous通知的一种机制。 信号可以从内核发送到进程,从进程到另一进程,或从进程到自己。

Linux内核实现了大约30个信号。

信号中断正在执行的进程,使其停止正在执行的任何进程,并立即执行预定的动作。

好的,从这里我会引用这个部分:

在英特尔微处理器系列(如奔腾)中,int 80h是用于中断80h的汇编语言操作码。 这是典型的基于Intel的Unix系统(如FreeBSD)上的系统调用中断。 它允许应用程序员从Unix内核获得系统服务。

我真的不能很好地把我的头脑联系起来。 所以当我例如使用

write 

在Posix中定义的方法,当它被编译成汇编,然后进一步组装成一个目标代码,并链接到运行Linux的给定架构中的可执行文件…. 系统调用是正确的?

我假设编译的代码看起来像这样:

 mov eax,4 ;code for system_write mov ebx,1 ;standard output mov ecx, memlocation; memlocation is just some location where a number of ascii is present mov edx, 20; 20 bytes will be written int 80h; 

好吧,我的问题正是在这一点上。 将int 80h发送信号给内核/中断内核? 内核只是一个过程? (这是init进程?)当CPU执行int 80h ,究竟发生了什么? 寄存器已经充满了信息,(在我的例子中是eax,ebx,ecx和edx ..),但是如何使用这些信息?

我无法完成CPU之间的连接 – 内核和CPU执行int 80h时的function。

我可以想象一些代码驻留在内存中的某个地方,它实际上将所需的信息发送给设备驱动程序,但是这些代码属于哪个进程? (我正在假设内核,但内核只是一个进程?)而如何int 80h指令跳转到该代码? Linux是否需要以某种方式实现?

内核只是一个过程? (这是初始化过程?)

内核是一个神奇的野兽。 这不是一个过程。 内核没有可以引用的PID。

首先,值得指出的是(尽管很明显)指令在处理器上运行:因此, int 80h是由处理器执行的。

有一个叫做Interrupt Request Handler程序的东西。 它们在某种程度上类似于函数指针。 处理器有一个中断处理程序表。 这个表被称为中断描述符表 (又名IDT),并且是系统范围的(即并不是每个进程都有自己的表)。 我相信这个表在第一次启动时由内核填充。

那么,执行int 80时会发生什么呢?

  1. 处理器运行在第3环保护级别(进程的正常级别)。 有关戒指级别的更多信息,请参阅此 。
  2. 处理器将切换到环0,即内核模式。 在这种模式下,硬件保护被禁用。 这意味着从现在开始执行的代码可以做任何想要的事情。 在物理内存中随处写入,重写中断描述符表等。
  3. 处理器将跳转到位于80h中断的中断描述符表中的代码。 IDT每次中断的可用空间都非常小。 这就是为什么这个代码通常会跳到别的地方。
  4. 之前的跳转让处理器在内核例程中专用于处理int 80h 。 处理器不再运行你的进程的代码,但它现在正在运行内核代码。
  5. 内核可以检查寄存器和内存并确定触发中断的原因。 它会明白你想执行系统调用write
  6. 内核代码将再次跳转,这一次在处理write的例程中。 内核将运行它的代码进行write
  7. 内核完成运行它的代码。 它告诉处理器返回到第3环保护级别,并恢复您的过程。
  8. 用户空间进程(又名你的进程)恢复。

当CPU执行INT 80h指令时,该CPU上当前正在运行的进程是普通用户进程。 作为处理该指令的结果,CPU从用户模式切换到内核模式。 该过程不会改变。 当前进程仍然是一个普通的用户进程,现在只是在内核模式下执行。 在内核模式下,系统调用权限可以让程序无法做到的事情。 内核代码然后做任何必要的实现系统调用并执行IRET指令。 导致CPU切换回用户模式,并在INT 80h指令之后开始执行代码。

请注意,如果内核模式代码花费足够的时间执行,特别是如果它阻塞,调度程序可能会启动并切换CPU以运行不同的进程。 在这种情况下,内核模式代码必须等待一个机会来完成它的工作。

在内核中花费的大部分CPU时间就像这样,在系统调用的进程的上下文中执行系统调用。 在内核中剩下的大部分时间都是处理硬件中断。 (注意,INT 80h是一个软件中断。)在这种情况下,中断运行在当时正在运行的任何进程的上下文中。 中断程序会执行任何必要的服务来产生中断的硬件设备,然后返回。

内核为自己创建一些特殊的进程,这些进程有非常专门的任务。 没有主要的内核进程。 init进程尤其不是一个内核进程,它只是一个普通的用户进程。

你的问题按照要求回答。 我建议参考本书的linux编程接口第44页。howerever简短的回答如下。 好吧,我的问题正是在这一点上。 将int 80h发送信号给内核/中断内核?

没有int 80h不会向内核发出任何信号,而是在中断表中的一个入口

内核只是一个过程? (这是初始化过程?)

不。现在,unix内核是一组威胁(称为本机线程),可以有3种不同类型的进程内核映射。

当CPU执行int 80h时,到底发生了什么? 寄存器已经充满了信息,(在我的例子中是eax,ebx,ecx和edx ..),但是如何使用这些信息?

int 80h是将环境从用户转换到内核模式的陷阱指令。%eax包含要在内核模式下运行的写入的系统调用编号。 所有其他寄存器的内容都存储在内存中,以便在返回到用户模式时进行存储。我无法完成CPU之间的连接 – 内核与CPU执行int 80h时的操作。

80h是CPU的陷阱,它将用户的环境改变为内核,并将寄存器保存到内存中。 这意味着CPU可以帮助内核做有效的工作。

我可以想象一些代码驻留在内存中的某个地方,它实际上将所需的信息发送到设备驱动程序,但是这些代码属于哪个进程? (我正在假设内核,但内核只是一个进程?)而如何int 80h指令跳转到该代码? Linux是否需要以某种方式实现?

在这里你问关于设备驱动程序。 驱动程序的功能不同于系统调用处理。 int 80h不适用于驱动程序。