c-int 80h是否中断内核进程



首先是一些背景知识,这来自于《Linux系统编程:直接与内核和C库对话》一书

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

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

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

好的,接下来,我将引用这一部分:

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

我真的无法在脑海中建立起这种联系。例如,当我使用时

write 

方法,当它被编译成程序集,然后进一步组装成对象代码并链接到运行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必须以某种方式实现的吗?

内核只是一个进程吗?(是初始化过程吗?(

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

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

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

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

  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页。然而,简短的答案如下。好吧,我的问题就在这一点上。int 80h会向内核发送信号/中断内核吗?

No 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不适用于驱动程序。

@Xaqq的答案是完美的,但除此之外,还要理解这一点。

CPU只是一块硅板,上面有数十亿个晶体管,这些晶体管在CPU中用于硬编码其中最基本的例程。它是使用逻辑门[AND,OR,XOR]等完成的。晶体管的这种布局是这样设计的:

EAX 中的4

EBX 中的1

ECX 中的Addr

EDX 中的长度

然后调用int 80h,它基本上是一个例程,可以理解上面的值以及如何处理它们。它处理CPU的执行,并通过神奇的这些晶体管触发器来实现您想要的操作,即在addr将消息打印到控制台。

最新更新