中断请求(IRQ,中断信号,理解为中断控制器的端口,虽然PIC一般只有8个端口,但是可以串联,然后就16位了)中断控制器(PIC)

一般中断信号就16个(你注意下面第2号IRQ代表什么),与CPU直接相连的叫主PIC,负责0~7号中断,从PIC负责8~15号中断,从PIC通过第2(从0开始)号IRQ与主PIC相连,硬件设定就是这样的。

PIC的中断向量
IRQ编号       设备名称            用途
IRQ0          Tine                计算机系统计时器
IRQ1          KeyBoard            键盘
IRQ2          Redirect IRQ9       与IRQ9相接,MPU-401 MDI使用该IRQ
IRQ3          COM2                串口设备
IRQ4          COM1                串口设备
IRQ5          LPT2                建议声卡使用该IRQ
IRQ6          FDD                 软驱传输控制用
IRQ7          LPT1                打印机传输控制用
IRQ8          CMOS Alert          即时时钟
IRQ9          Redirect IRQ2       与IRQ2相接。可设定给其他硬件使用    
IRQ10         Reversed            建议保留给网卡使用该IRQ
IRQ11         Reversed            建议保留给AGP显卡使用
IRQ12         PS/2Mouse           按PS/2鼠标,若无也可以设定给其他硬件使用
IRQ13         FPU                 协处理器用,例如FPU(浮点运算器)
IRQ14         Primary IDE         主硬盘传输控制用
IRQ15         Secondary lde       从硬盘传输控制用

通过在IDT里面写入中断执行中断函数。

但是好像并没有实现IDT表的导入

IDTR有48位,前32为是IDT在内存中的位置(线性地址),后16为是IDT的大小,也就是limit。程序可以使用LIDT和SIDT指令来读写IDTR。IDT是一个最大为256项的表,每个表项为8字节。称为中断门。CPU通过IDT.base+n*8来寻找门。根据中断号对应的异常类型不同(Faults/Traps/Aborts)8个字节的意义也不同。

问题与GDT相同,因此也是需要在boot完成才行。

先实现键盘中断。没成功

由于用户程序执行特权指令可能会破坏系统资源,故出于保护和稳定的目的,操作系统通过“门”机制向用户态程序提供必要的服务。至于为什么分成四种门,是因为具体处理异常中断时有一些区别如陷阱可以嵌套发生,而中断默认情况下不可以嵌套,要要了解中断异常的类别选择合适的门来处理,IDT 表中可以存放三种类型的门描述符:

  • 中断门描述符,来自外部硬件IO,会自动 将中断关闭
  • 陷阱门描述符,CPU本身产生,例如除0错误,不会将中断关闭
  • 任务门描述符

中断门和陷阱门含有一个长指针(即段选择符和偏移值),处理器使用这个长指针把程序执行权转移到代码段中的异常或中断的处理程序中。这两个段的主要区别在于处理器操作EFLAGS寄存器IF标志上。

IDT中任务门描述符的格式与GDT和LDT中任务门的格式相同。任务门描述符中含有一个任务TSS段的选择符,该任务用于处理异常和/或中断。

中断门、陷阱门和任务门描述符格式如下图所示:

MyOS 之 PIC

另一种图:

任务门结构图如下所示:

MyOS 之 PIC

阴影部分表示空闲不用;P标志位,为1时表示在内存中;DPL描述优先级别;类型码101表示任务门。

2.中断门、陷阱门和调用门结构图如下所示:

MyOS 之 PIC

从左到右逐渐变低。

P=1表示在内存中,DPL是特权级一共4种,00最大,为了防止用户通过int指令模拟非益的中断和异常,IDT初始化时必须把特殊的中断或陷阱门描述符的DPL字段设置成0。这样,当进程试图发出其中的一个中断信号(特殊的中断或陷阱门).控制单元就会检查出CPL(当前特权级)的值与DPL字段有冲突.并且产生一个General protection" 异常。,D标志位,1=32位,0=16位;类型码中,110:中断门,111:陷阱门,100,调用门。

因此中断门一般是           10011100000 2*8 

 二.四种门之间的区别和联系

1.任务门和其他三种门相比,在任务门中不需要用段内位移,因为任务门不指向某一个子程序的入口,TSS本身是作为一个段来对待的(任务状态段,里面好像是所有寄存器。。。),而中断门、陷阱门和调用门则都要指向一个子程序,所以必须结合使用段选择码和段内位移。此外,任务门中相对于D标志位的位置永远是0.

2.中断门和陷阱门在使用上的区别不在于中断是外部产生的还是有CPU本身产生的,而在于通过中断门进入中断服务程序时CPU会自动将中断关闭(将EFLAGS寄存器中IF标志位置0),以防止嵌套中断产生,而通过陷阱门进入服务程序时则维持IF标志位不变。这是二者唯一的区别。

每日小常识:

任务门(task gate) 

    当中断信号发生时,必须取代当前进程的那个进程的TSS选择符存放在任务门中。

中断门(interruptgate) 

    包含段选择符和中断或异常处理程序的段内偏移量.当控制权转移到一个适当的段时,处理器 清IF标志,从而关闭将来会发生的可屏蔽中断.

陷阱门(Trap gate)

    与中断门相似,只是控制权传递到一个适当的段时处理器不修改IF标志.

 

    以上为Intel对中断描述符的分类。Linux采用了更细的分类方法

中断门(interrupt gate)

    用户态的进程不能访问的一个lntel中断门(门的DPL字段为0)。所有的Linux中断处理程序都通过中断门**,并全部限制在内核态。

系统门(syslem gate)

    用户态的进程可以访问的一个Intel陷阱门(门的DPL字段为到.通过系统门来**三个Linux异常处理程序,它们的向量是4,5及128,因此,在用户态下.可以发布into、 bound及int $Ox80三条汇编语言指令。

系统中断门(system interrupt gate)

    能够被用户态进程访问的Intel中断门(门的DPL字段为3). 与向量3相关的异常处理程序是由系统中断门**的,因此,在用户态可以使用汇编语言指令int3.

陷阱门(Irapgate)

    用户态的进程不能访问的一个Inte)陷阱门(f]的DPL字段为0). 大部分Linux异常处理程序都通过陷阱门来**.

任务门(task gate)

    不能被用户态进程访问的Intel任务门(门的DPL字段为0).Linux对"Doublefault"异常的处理程序是由任务门**的.

DPL是特权级,权级总共有4个特权级别,从高到低分别是0、1、2、3,数字越小表示的特权级别越大。

MyOS 之 PIC

较为核心的代码和数据将被放在特权级较高的层级中。处理器将用这样的机制来避免低特权级的任务在不被允许的情况下访问位于高特权级的段中。如果处理器检测到一个访问请求是不合法的,将会产生常规保护错误。有时候也将高特权级称为内层,低特权级称为外层。

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2022-01-01
  • 2021-09-29
  • 2022-12-23
  • 2022-12-23
  • 2021-09-13
  • 2021-05-26
  • 2021-11-03
猜你喜欢
  • 2021-10-23
  • 2021-10-29
  • 2021-12-26
  • 2021-12-11
  • 2021-12-01
  • 2021-12-10
相关资源
相似解决方案