首先是一些背景知识,这来自书: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必须以某种方式实现的吗?
答案 0 :(得分:13)
内核只是一个进程吗? (它是init进程吗?)
内核是一个神奇的野兽。这不是一个过程。内核没有你可以参考的PID。
首先,值得说明的是(尽管很明显)指令在处理器上运行:因此,int 80h
由处理器执行。
有一种叫做Interrupt Request Handler
的东西。它们在某种程度上类似于函数指针。处理器有一个中断处理程序表。该表称为Interrupt Descriptor Table(又名IDT),并且是系统范围的(即,并非每个进程都拥有它自己的表)。
我相信这个表在首次启动时由内核填充。
那么,执行int 80
会发生什么?
80h
中断的中断描述符表中的代码。 IDT每次中断的可用空间非常小。这就是为什么这段代码通常会在其他地方再次跳转。int 80h
的内核例程中。处理器不再运行您的流程'代码,但它现在正在运行内核代码。write
。write
的例程中。内核将运行write
。答案 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不适用于驱动程序。