1.每一个中断或者异常都对与一个中断服务例程(简称ISR interrupt server routine)相关联。其关联关系存储在中断描述符表(简称IDT)中。而这个中断描述符表的起始地址和大小又保存在中断描述符表寄存器(IDTR)中。
中断发生之后,会产生一个中断号,CPU会根据这个中断号,在IDT中找到相应的中断门或者段选门,然后从里面取出它的段选择址,根据这个选择址进一步查找它的GDT(全局描述符表),GDT里面存储的是段描述符,段描述符里面有一个基地址,这个基地址再加上IDT里面存的偏移地址offset,合在一起就形成了线性地址,从而可以指向ISR中断服务例程。
由于中断是开着的,所以当执行完一条指令后,cs和eip这对寄存器中已经包含了下一条将要执行的指令的逻辑地址。在处理那条指令之前,控制单元会检查在运行前一条指令时是否发生了一个中断或异常。如果发生了一个中断和异常,那么控制单元执行下列操作:
确定与中断或异常关联的向量i(0≤ i ≤255)。
读由idtr寄存器指向的IDT表中的第i项。
从gdtr寄存器获得GDT的基地址,并在GDT中查找,以读取IDT表项中的选择符标识的段描述符。这个描述符指定中断或异常处理程序所在的段的基地址,如下图所示。
由中断编号确定在IDT中偏移值的段位置,根据该段位置中的选择符选出GDT中的段地址,该段地址里面保存了中断或异常处理程序所在的段的基地址。
shell命令中less用来查看文件,并且它不会显示全部文件。
kernel文件是以ELF的格式存放在硬盘上的。