繁体   English   中英

int 80h 会中断 kernel 进程吗?

[英]Does int 80h interrupt a kernel process?

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

信号是一种用于单向异步通知的机制。 信号可以从 kernel 发送到一个进程,从一个进程发送到另一个进程,或者从一个进程发送到它自己。

Linux kernel 实现了大约 30 个信号。

信号中断正在执行的进程,导致它停止正在做的任何事情并立即执行预定的操作。

好的,从这里我将引用这一部分:

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

我真的不能完全在脑海中建立联系。 所以当我例如使用

write 

Posix中定义的方法,当它被编译成程序集,然后进一步组装成 object 代码并链接到运行 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 会向 kernel 发送信号/中断 kernel 吗? kernel只是一个进程吗? (是init进程吗?)当cpu执行int 80h时,到底发生了什么? 寄存器已经充满了信息(在我的示例中是 eax、ebx、ecx 和 edx……),但是如何使用这些信息?

我不能完全将 CPU - kernel 与 CPU 在执行 int 80h 时执行的操作联系起来。

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

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

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

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

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

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

  1. 处理器运行在环 3 保护级别(进程的正常级别)。 有关环级别的更多信息,请参阅
  2. 处理器将切换到 ring 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 会向内核发送信号/中断内核吗?

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

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

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

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

int 80h 是一条陷阱指令,它将环境从用户模式转换到内核模式 %eax 包含要在内核模式下运行的 write 的系统调用号。 所有其他寄存器的内容都存储在内存中,以便在返回用户模式时存储我无法在 CPU - 内核和 CPU 在执行 int 80h 时究竟做了什么之间建立联系。

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

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

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

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

CPU 只是带有数十亿个晶体管的硅板,这些晶体管用于在 CPU 中硬编码其中最基本的例程。 它是使用逻辑门 [AND、OR、XOR] 等完成的。这种晶体管的设计方式是这样的,当你把:

EAX中的 4 个

1 在EBX

ECX中的Addr

EDX中的长度

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM