pc解读10: 中断控制器的引入

来源:互联网 发布:linux svn 版本号 编辑:程序博客网 时间:2024/05/22 13:08

现在我们已经认识到,在pc的设计中,cpu并不是完全按照程序指令一条一条执行,有时候人为或者随机的触发设备中断,可以让cpu去执行相应的中断处理程序,以打造一个更加智能的软硬件系统。那么顶级的计算机设计师们又设计了怎样的中断处理系统了来实现这种需求呢,我们试着去解读这一切。

中断控制器的连接
首先我们来看看需求。对于设备来说,最简单的设计就是我对外提供一个引脚,如果是高电平就说明我申请中断,如果低电平就说明没有中断请求。关键是这个引脚信号如何主动的传给cpu呢?因为以前都是有cpu指令集去读io空间获取这些引脚信号,现在在没有指令的情况下,设备主动将引脚中断信号穿越外设与cpu之间隔着的很多桥和总线最后通知到cpu,这是问题之一。另外,我们可能有很多设备都需要有中断引脚,如键盘,鼠标,定时器等。这些引脚信号如果都与cpu连接是不现实的,这样严重影响了cpu的兼容性,通用性和简洁性,如果不这么做,那么cpu收到引脚中断信号后,又怎么知道是谁发过来的中断请求呢,这是问题之二。

问题看起来很复杂,但是只要大家齐心协力,没有什么事情是不能解决的。首先,很自然的想法是引入一个中断控制器,这个中断控制器最好就在南桥上,因为需要中断请求的一般都是南桥上的io设备。这个中断控制器需要有很多中断信号引脚分别连接io设备的中断请求信号线,这样外部设备一旦有中断请求,中断控制器第一时间能感应到,而且知道是哪个引脚来的中断。同时中断控制器还有有一个引脚与cpu的中断请求线相连,这样只要中断控制器收到了io设备的中断请求,就立即将该信号传输给cpu, 当然这个控制信号需要经由南北桥之间的总线到达北桥再经过前端总线到达cpu, 这些总线和北桥都需要能解读出中断请求信号,并给予传递。这样cpu就能地一时间感应到外设需要中断请求。

真是人多力量大,问题看起来好办多了。那么cpu只有一个引脚,他又如何知道是谁触发了中断请求呢?想多了,既然cpu已经感应到中断了,不管是谁,感应之后直接通过指令向中断控制器询问就知道是谁来的中断了。

中断号查询
cpu知道了谁中断请求之后,又如何去寻找该中断的中断处理程序在哪呢?这就需要软硬件的约定了。首先,给中断设备进行编号,如中断控制器的引脚1,中断编号为1,引脚2中断编号为2;然后系统初始化时预先准备好每个中断的中断处理程序加入内存,然后提供一个中断表,依次存放每个中断处理程序的入口地址,而且我们还可以默认这个中断表的地址永远在物理地址0开始,那么cpu遇到中断请求好,向中断控制器获取中断号,然后通过中断表找到中断处理程序入口,即可进行中断处理了。

早期的系统正式这么做的。IBM PC/AT 80×86兼容机使用两片级联的8259A可编程中断控制芯片组成一个中断控制器,用于实现I/O设备的中断控制数据存取方式,并且能为15个设备提供独立的中断控制功能,如图所示。在计算机刚开机初始化期间,ROM BIOS会分别对两片8259A芯片进行初始化,并分别把15级中断优先级分配给时钟定时器、键盘、串行口、打印口、软盘控制、协处理器和硬盘等设备或控制器使用。同时在内存开始处0×000~0xFFF区域内建立一个中断向量表。但是由于这些设置违背了Intel公司的要求(后面章节将会详细说明),因此Linux操作系统在内核初始化期间又重新对8259A进行了设置。

170338174

中断向量分配
当一台PC刚上电开机时,图中的硬件中断请求号会被ROM BIOS设置成如表1所示的对应中断向量号。Linux操作系统并不直接使用这些PC默认设置好的中断向量号。当Linux系统执行初始化操作时,它会重新设置中断请求号与中断向量号的对应关系。

表1:  开机时ROM BIOS设置的硬件请求处理中断号

中断请求号BIOS设置的中断号用途中断请求号BIOS设置的中断号用途IRQ00×08 (8)8253发出的100Hz时钟中断IRQ80×70(112)实时钟中断IRQ10×09 (9)键盘中断IRQ90×71(113)改向至INT 0x0AIRQ20x0A(10)接连从芯片IRQ100×72(114)保留IRQ30x0B(11)串行口2IRQ110×73(115)保留(网络接口)IRQ40x0C(12)串行口1IRQ120×74(116)PS/2鼠标口中断IRQ50x0D(13)并行口2IRQ130×75(117)数学协处理器中断IRQ60x0E(14)软盘驱动器IRQ140×76(118)硬盘中断IRQ70x0F(15)并行口1IRQ150×77(119)保留

同时我们看到,早期的pc厂商,还是下了很大的功夫去做系统的设计以及bios第一层程序的开发,将系统各组件组装成一个有机的整体,对外提供良好的系统。得益于这种技术的开放性,使得pc技术迅猛发展。