Kor*_*gay 12 c linux assembly linux-kernel
首先是一些背景知识,这是本书:Linux系统编程:直接与内核和C库交谈
信号是单向异步通知的机制.信号可以从内核发送到进程,从进程到另一个进程,或从进程发送到自身.
Linux内核实现了大约30个信号.
信号中断执行过程,使其停止正在执行的操作并立即执行预定操作.
好的,进一步,从这里我将引用这部分:
在Intel系列微处理器上,例如Pentium,int 80h是用于中断80h的汇编语言操作码.这是典型的基于Intel的Unix系统上的系统调用中断,例如FreeBSD.它允许应用程序编程人员从Unix内核获取系统服务.
我真的无法完全理解我的想法.所以,当我例如使用
write
Run Code Online (Sandbox Code Playgroud)
在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;
Run Code Online (Sandbox Code Playgroud)
好的,我的问题正是在这一点上.int 80h会向内核发送信号/中断内核吗?内核只是一个进程吗?(它是init进程吗?)当cpu执行int 80h时,究竟发生了什么?寄存器已经充满了信息,(在我的例子中是eax,ebx,ecx和edx ..),但这些信息是如何使用的?
我不能完全建立CPU之间的连接 - 内核以及CPU执行int 80h时的确切操作.
我可以想象一些代码驻留在内存中某处实际上将所需信息发送到设备驱动程序但该代码属于哪个进程?(我假设内核但内核只是一个进程?)int 80h指令如何跳转到该代码?是Linux必须以某种方式实现的吗?
Xaq*_*aqq 14
内核只是一个进程吗?(它是init进程吗?)
内核是一个神奇的野兽.这不是一个过程.内核没有你可以参考的PID.
首先,值得说明(即使很明显)指令在处理器上运行:因此,int 80h由处理器执行.
有一种叫做的东西Interrupt Request Handler.它们在某种程度上类似于函数指针.处理器有一个中断处理程序表.该表称为中断描述符表(又称IDT),并且是系统范围的(即,并非每个进程都有自己的表).我相信这个表在首次启动时由内核填充.
那么,int 80执行时会发生什么?
80h中断.IDT每次中断的可用空间非常小.这就是为什么这段代码通常会在其他地方再次跳转.int 80h.处理器不再运行进程代码,但它现在正在运行内核代码.write.write.内核将运行其代码write.当CPU执行INT 80h指令时,该CPU上当前运行的进程是普通用户进程.作为处理该指令的结果,CPU从用户模式切换到内核模式.这个过程不会改变.当前进程仍然是普通的用户进程,它现在刚刚在内核模式下执行.处于内核模式时,系统调用允许执行程序无法自行执行的操作.然后内核代码执行实现系统调用所需的任何操作并执行IRET指令.导致CPU切换回用户模式并按照INT 80h指令开始执行代码.
请注意,如果内核模式代码需要足够长的时间来执行,特别是如果它阻塞,则调度程序可以启动并切换CPU以运行不同的进程.在这种情况下,内核模式代码必须等待机会完成其工作.
在内核中花费的大部分CPU时间都是这样的,在进行系统调用的进程的上下文中执行系统调用.在内核中花费的大部分时间都是处理硬件中断.(注意,INT 80h是软件中断.)在这种情况下,中断在当时正在运行的任何进程的上下文中运行.中断例程执行为生成中断的硬件设备提供服务所需的任何操作,然后返回.
虽然内核为自己创建了一些特殊的进程,但这些进程具有非常专业的任务.没有主要的内核进程.特别是init进程不是内核进程,它只是一个普通的用户进程.