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

时间:2015-05-29 20:16:10

标签: c linux assembly linux-kernel

首先是一些背景知识,这来自书:Linux System Programming: Talking Directly to the Kernel and C Library

  

信号是单向异步通知的机制。一个   信号可以从内核发送到进程,从进程到   另一个过程,或从过程到自身。

     

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

     

信号中断正在执行的进程,导致它停止它   正在做并立即执行预定的行动。

好的进一步,从here我将引用这部分:

  

在Intel系列微处理器上,例如Pentium,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时的确切操作。

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

3 个答案:

答案 0 :(得分:13)

  

内核只是一个进程吗? (它是init进程吗?)

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

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

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

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

  1. 处理器在环3保护级别(进程的正常级别)运行。有关响铃级别的详细信息,请参阅this
  2. 处理器将切换到响铃0,即内核模式。在此模式下,禁用硬件保护。这意味着从现在开始执行的代码可以做任何想做的事情。在物理内存中写入,重写中断描述符表等
  3. 处理器将跳转到80h中断的中断描述符表中的代码。 IDT每次中断的可用空间非常小。这就是为什么这段代码通常会在其他地方再次跳转。
  4. 上一次跳转将处理器放入专用于处理int 80h的内核例程中。处理器不再运行您的流程'代码,但它现在正在运行内核代码。
  5. 内核可以检查寄存器和内存,并确定触发中断的原因。它将理解您要执行系统调用write
  6. 内核代码将再次跳转,这次是在处理write的例程中。内核将运行write
  7. 的代码
  8. 内核完成了运行其代码。它告诉处理器返回到3级保护级别,然后恢复您的进程。
  9. 用户空间流程(又称您的流程)恢复。

答案 1 :(得分:7)

当CPU执行INT 80h指令时,该CPU上当前运行的进程是普通用户进程。作为处理该指令的结果,CPU从用户模式切换到内核模式。这个过程并没有改变。当前进程仍然是普通的用户进程,它现在刚刚在内核模式下执行。处于内核模式时,系统调用允许执行程序无法执行的操作。然后内核代码执行实现系统调用所需的任何操作并执行IRET指令。导致CPU切换回用户模式并按照INT 80h指令开始执行代码。

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

在内核中花费的大部分CPU时间都是这样的,在进行系统调用的进程的上下文中执行系统调用。在内核中花费的大部分时间都是处理硬件中断。 (注意,INT 80h是软件中断。)在这种情况下,中断在当时正在运行的任何进程的上下文中运行。中断例程执行为生成中断的硬件设备提供服务所需的任何操作,然后返回。

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

答案 2 :(得分:1)

根据要求回答您的问题。我建议参考书籍linux编程接口第44页.owerever简短答案如下。 好的,我的问题正是在这一点上。 int 80h会向内核发送信号/中断内核吗?

No int 80h不会向内核发送任何信号,而是中断表中的条目

内核只是一个进程吗? (它是init进程吗?)

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

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

int 80h是一个陷阱指令,它将环境从用户转换到内核模式%eax包含要在内核模式下运行的写入的系统调用号。所有其他寄存器的内容存储在存储器中,以便在返回用户模式时存储 我不能完全建立CPU之间的连接 - 内核以及CPU执行int 80h时的确切操作。

80h是CPU的陷阱,它将环境从用户更改为内核并将寄存器保存到内存。这意味着CPU帮助内核做有效的事情。

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

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