3.2. 1 外部中断向量的设置

前面我们已经提到,Linux把向量031分配给异常和非屏蔽中断,而把3247之间的向量分配给可屏蔽中断,可屏蔽中断的向量是通过对中断控制器的编程来设置的。前面介绍了8259A中断控制器,下面我们通过对其初始化的介绍,来了解如何设置中断向量。

8259A通过两个端口来进行数据传送,对于单块的8259A或者是级连中的8259A_1来说,这两个端口是0x200x21。对于8259A_2来说,这两个端口是0xA00xA18259A有两种编程方式,一是初始化方式,二是工作方式。在操作系统启动时,需要对8959A做一些初始化工作,这就是初始化方式编程。

 

  先简单介绍一下8259A内部的四个中断命令字(ICW)寄存器的功能,它们都是用来启动初始化编程的:

 ICW1:初始化命令字。

 ICW2:中断向量寄存器,初始化时写入高五位作为中断向量的高五位,然后在中断响应

      时由8259根据中断源(哪个管脚)自动填入形成完整的8位中断向量(或叫中断类

      型号)。

 ICW3 8259的级连命令字,用来区分主片和从片。

 ICW4:指定中断嵌套方式、数据缓冲选择、中断结束方式和CPU类型。

 

8259A初始化的目的是写入有关命令字,8259A内部有相应的寄存器来锁存这些命令字,以控制8259A工作。有关的硬件知识笔者就不详细描述了,请读者查阅有关可编程中断控制器的资料,我们只具体把Linux8259A的初始化讲解一下,代码在/arch/i386/kernel/i8259.c的函数init_8259A():

  outb(0xff, 0x21);      /* 送数据到工作寄存器OCW1(又称中断屏蔽字),

    屏蔽所有外部中断, 因为此时系统尚未初始化完毕,

    outb(0xff, 0xA1);      不能接收任何外部中断请求  */

   

 

        outb_p(0x11, 0x20); /*送0x11ICW1(通过端口0x20),启动初始化编程。

                                         0x11表示外部中断请求信号为上升沿有效,系统中有

                           多片8295A级连,还表示要向ICW4送数据 */

 

        outb_p(0x20 + 0, 0x21); /* 0x20ICW2,写入高五位作为中断量的高五

           位,低3位根据中断源(管脚)填入中断号07

   因此把IRQ0-7映射到向量0x20-0x27 */

 

        outb_p(0x04, 0x21); /* 0x04ICW3ICW38259的级连命令字

 0x04表示8259A-1是主片 */

 

        outb_p(0x11, 0xA0);  /* ICW1初始化 8259A-2 */

        outb_p(0x20 + 8, 0xA1); /* ICW28259A-2IRQ0-7映射到 0x28-0x2f */

        outb_p(0x02, 0xA1);   /* 0x04ICW3。表示8259A-2 是从片,

    并连接在8259A_12号管脚上*/

        outb_p(0x01, 0xA1); /* 0x01送到ICW4 */

最后一句有四方面含义:① 中断嵌套方式为一般嵌套方式。当某个中断正在服务时,本级中断及更低级的中断都被屏蔽,只有更高级的中断才能响应。注意,这对于多片8259A级连的中断系统来说,当某从片中一个中断正在服务时,主片即将这个从片的所有中断屏蔽,所以此时即使本片有比正在服务的中断级别更高的中断源发出请求,也不能得到响应,即不能中断嵌套。②  8259A数据线和系统总线之间不加三态缓冲器。一般来说,只有级连片数很多时才用到三态缓冲器;③  中断结束方式为正常方式(非自动结束方式)。即在中断服务结束时(中断服务程序末尾),要向8259A芯片发送结束命令字EOI(送到工作寄存器OCW2中),于是中断服务寄存器ISR中的当前服务位被清0EOI命令字的格式有多种,在此详述;④  CPU类型为x86系列。

 

outb_p()函数就是把第一个操作数拷贝到由第二个操作数指定的I/O端口,并通过一个空操作而产生一个暂停。

 

这里介绍了8259A初始化的主要工作。最后要说明的是:IBM PC机的BIOS中固化有对中断控制器的初始化程序段,在计算机加电时,这段程序自动执行,读者感兴趣可以查阅资料看看它的源代码。典型的PC机将外部中断的中断向量分配为:08H~0FH70H~77H。但是Linux8259A作了重新初始化,修改了外部中断的中断向量的分配(20H~2FH),使中断向量的分配更加合理。