int 80h 会中断内核进程吗?

Does int 80h interrupt a kernel process?

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

Signals are a mechanism for one-way asynchronous notifications. A signal may be sent from the kernel to a process, from a process to another process, or from a process to itself.

The Linux kernel implements about 30 signals.

Signals interrupt an executing process, causing it to stop whatever it is doing and immediately perform a predetermined action.

好的,从here开始,我将引用这部分:

On the Intel family of microprocessors, such as the Pentium, int 80h is the assembly language op code for interrupt 80h. This is the syscall interrupt on a typical Intel-based Unix system, such as FreeBSD. It allows application programmers to obtain system services from the Unix kernel.

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

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 必须以某种方式实施吗?

Is kernel just one process? (Is it the init process?)

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

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

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

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

  1. 处理器 运行 处于环 3 保护级别(进程的正常级别)。有关振铃电平的更多信息,请参阅 this
  2. 处理器将切换到 ring 0,即内核模式。在此模式下,硬件保护被禁用。这意味着从现在开始执行的代码可以为所欲为。物理内存各处写入,重写中断描述符table等
  3. 处理器将跳转到 80h 中断的中断描述符 Table 中的代码。 IDT中每次中断可用的space非常小。这就是为什么此代码通常会在其他地方再次跳转的原因。
  4. 之前的跳转借给内核例程中的处理器专门处理int 80h。处理器不再是 运行 您进程的代码,而是现在 运行 内核代码。
  5. 内核可以检查寄存器和内存并确定触发中断的原因。它会明白你想执行系统调用 write.
  6. 内核代码会再次跳转,这次是在处理write的例程中。内核将运行其代码 write.
  7. 内核已完成 运行 其代码。它告诉处理器返回环 3 保护级别,并恢复您的进程。
  8. 用户space 进程(又名您的进程)恢复。

当 CPU 执行 INT 80h 指令时,CPU 上的当前 运行 进程是普通用户进程。作为处理该指令的结果,CPU 从用户模式切换到内核模式。过程不变。当前进程还是一个普通的用户进程,只是在内核模式下执行。处于内核模式下,系统调用可以执行程序本身无法执行的操作。内核代码然后执行任何必要的操作来实现系统调用并执行 IRET 指令。这导致 CPU 切换回用户模式并开始执行 INT 80h 指令后的代码。

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

在内核中花费的大部分CPU时间都是这样的,在进行系统调用的进程的上下文中执行系统调用。内核中剩下的大部分时间都花在了处理硬件中断上。 (注意 INT 80h 是一个软件中断。)在那种情况下,中断在当时恰好是 运行 的任何进程的上下文中运行。中断例程会为生成中断的硬件设备提供必要的服务,然后 returns.

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

您的问题已按要求回答。我建议参考书 linux programming interface 第 44 页。但是简短的答案如下。 好的,我的问题正是在这一点上。 int 80h 会向内核发送信号/中断内核吗?

No int 80h 不会向内核发出任何信号,而是它是 table 中断

中的一个条目

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

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

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

int 80h 是一个陷阱指令,它将环境从用户模式转换为内核模式 %eax 包含用于在内核模式下写入 运行 的系统调用号。所有其他寄存器的内容都存储在内存中以存储在 return 到用户模式 我不能完全将 CPU - 内核与 CPU 在执行 int 80h 时所做的事情联系起来。

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

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

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