当前位置:Linux教程 - Linux - IRQ、DMA和IO端口知识入门

IRQ、DMA和IO端口知识入门



         作者 Eugene Blanchard翻译 ober


    本文讨论了IBM兼容机上的IRQ、DMA和IO端口地址各自的功能以及它们的分配问题。我发现有些IBM兼容机和外设的随机文档上虽然列出了设备支持的可能配置,但是却没有给出如何资源配置标准化方面的任何建议。希望这篇文章能够在IRQ、DMA和IO地址的选择方面为你提供一些参考。




    --------------------------------------------------------------------------------

    IRQ - 中断请求
    IRQ代表中断请求(Interrupt ReQuest)的意思。它是ISA槽中的扩展卡给CPU发出的一个通知消息,表示相应的外部设备发生了一定的事件(该技术同样应用于EISA和MCA扩展槽)。常见的外部设备包括:调制解调器,网卡(NIC),声卡,SCSI适配卡,硬盘控制器,软盘控制器,串行口(COM端口)以及并行口(打印机端口)。
    IRQ是硬件中断,也就是说主板上的每一个ISA扩展槽都有一条相应的物理线路与之相连。有两种类型的ISA扩展槽:8位扩展槽和16位扩展槽。16位的扩展槽既可以用作8位的扩展槽,也可以作为16位的增强型ISA槽来使用。

    主板上有8条IRQ(IRQ0-7)线连接到8位的ISA扩展槽。还有另外的8条(IRQ8-15)连接到16位的增强型ISA槽。所以,在一台典型的ISA总线的PC机中总共有16条IRQ请求线。其中,IRQ0优先级最高,IRQ7的优先级最低。IRQ8-15的优先级有点特殊,下面还要详细解释。

    IBM开始生产AT机的时候加入了IRQ8-15。为了保持AT机(286)与8位XT机(8088)的后向兼容性,同时也为可以提高新的IRQ线的优先等级,IBM采用了串接两个中断控制器的办法。结果导致中断IRQ8-15与IRQ2具有相同的优先等级。所谓的“优先等级”是指如果有两条IRQ线同时发出中断请求,具有较高优先等级的IRQ线上的中断请求首先被响应。

    注意:一条IRQ请求线每次只能分配给一个活动设备。如果2个设备共享同一条IRQ请求线,我们称之为冲突。这表示当这条IRQ线上发生中断请求的时候,CPU无法判断应该与哪一个进行“对话”。例如,如果调制解调器和网卡同时使用IRQ5作为自己的中断请求线,假设调制解调器有一些数据需要传递给CPU,它会在IRQ5线上发出中断请求,但是CPU在响应的时候无法判断到底应该与调制解调器进行对话还是与网卡进行对话。计算机可能会挂起,也可能什么事情都不会发生。

    *** IRQ冲突是PC机发生问题最可能的原因! ***

    下面这张表是为PC机选择IRQ时的一个很好的推荐(指南)。IRQ根据其优先级进行排列。(注意,我在上面声称所有的IRQ请求线都连接到扩展槽的时候也许撒了一点谎。)



    IRQ号 功能 是否有物理线路 ISA总线类型
    IRQ0 系统时钟 否 -
    IRQ1 键盘控制器 否 -
    IRQ2 串接IRQ8-15 否 -
    IRQ8 实时时钟(RTC) 否 -
    IRQ9 *-可用(IRQ2) 是 8/16位
    IRQ10 网卡(NIC) 是 16位
    IRQ11 SCSI控制器 是 16位
    IRQ12 主板鼠标/可用 是 16位
    IRQ13 数学协处理器 否 -
    IRQ14 IDE控制器1 是 16位
    IRQ15 IDE控制器2 是 16位
    IRQ3 Com2/Com4 是 8位
    IRQ4 Com1/Com3 是 8位
    IRQ5 声卡/LPT2 是 8位
    IRQ6 软盘控制器 是 8位
    IRQ7 并行口LPT1 是 8位

    *- IRQ9表现得就象原先的IRQ2。通常情况下不要使用它,因为这样可能导致一些有趣的问题发生。它真的是IRQ9吗?也许它是串接到IRQ9的IRQ2?你选择哪一个?如果你在一个16位的ISA扩展槽中使用一个8位的ISA调制解调器会怎么样呢?你看,我的意思是…
    在你为你的外设选择IRQ的时候,上面这张表是一个很好的推荐,或者说指南。例如,假设你的PC机没有使用SCSI适配卡,那么IRQ11就可以用来支持另一块网卡或者其他设备。

    大多数自动检测IRQ的软件,或者操作系统,例如Linux,假设的IRQ分配就象上面所列出的那样。



    COM端口冲突
    注意到COM1(PC背板上的DB9连接器)和COM3口共享IRQ4。只要保证每次只有一个设备是活动的,这种情况就是允许的。这意味着如果你在COM1上连接了一个鼠标,那么你就无法将COM3口用于一个内置式的调制解调器。否则你就会碰到冲突情况。有些通信软件包允许你这样做,但是大多数情况下这样不行,或者会引起一些奇怪的操作。常见的现象是:如果你移动鼠标,你的终端程序可能在屏幕上显示出一些乱七八糟的内容。
    COM2(PC背板上的DB25连接器)和COM4口具有同样的问题,只是大多数人并不使用COM2口。通常情况下将COM4口分配给内置式的调制解调器是安全的。如果你使用了COM2口,典型情况下它用于一个外置式的调制解调器,或者是一个绘图仪。通常,这两个设备不会被同时激活。



    标准的COM口分配方案

    端口 IRQ 功能
    COM1 4 鼠标
    COM2 3 绘图仪/外置调制解调器/未用
    COM3 4 未用(与鼠标有冲突)
    COM4 3 内置调制解调器/未用

    --------------------------------------------------------------------------------

    DMA -直接存储器存取(Direct Memory Access)
    DMA代表直接存储器存取(Direct Memory Access)。这是允许外部设备打开某个通道,在不涉及CPU的情况下直接对存储器进行读/写操作的一种办法。这种方案减轻了CPU的负担,使CPU可以进行执行更重要的任务。
    PC机上共有8个可用的DMA通道:DMA0-7。针对8位ISA扩展槽和16位ISA扩展槽,这些通道也分为8位的通道和16位的通道两种。

    下面这张表格可以作为选择DMA通道时的一个推荐:



    DMA 功能 物理线路 ISA总线类型 通道宽度
    DMA0 可用 是 16位 8位
    DMA1 声卡 是 8位 8位
    DMA2 软盘控制器 是 8位 8位
    DMA3 ECP并行口 是 8位 8位
    DMA4 * - 不可用 否 - 16位
    DMA5 声卡 是 16位 16位
    DMA6 SCSI 是 16位 16位
    DMA7 可用 是 16位 16位

    注意:
    DMA0用于16位ISA槽但是仅有8位宽度。
    DMA4串接于第一个8位DMA控制器,不可利用。
    *** DMA冲突是PC机发生问题第二个最可能的原因 ***

    与IRQ资源类似,一个DMA通道每次只能分配给一个活动的设备。否则就会有冲突产生,你的设备可能无法正常工作。请留意“活动”这个词 - 这表示设备是打开的,并且有程序正在访问该设备。一个DMA通道可以分配给两个设备,只要你保证每次只有一个设备是活动的 - 虽然有点冒险但这是允许的。


    --------------------------------------------------------------------------------

    I/O基地址
    I/O基地址也成为I/O端口,I/O地址,I/O端口地址或者I/O基本端口。它们只是一些存储器的区域(译者注:原作者使用了“memory locations”这个词,但是在我们使用的Intel X86的PC机中,内存空间与I/O空间是分离的),这些区域提供了操作系统与I/O设备(外设)之间的接口。外设与操作系统之间通过I/O基地址进行通讯。每一个外设必须有单独的I/O基地址。
    标准I/O基地址分配方案(h - 16进制):



    060h + 064h 键盘控制器
    170h + 376h 第二个IDE硬盘控制器
    1F0h + 3F6h 第一个IDE硬盘控制器
    220h 声卡
    300h 网卡
    330h SCSI适配卡
    3F2h 软盘控制器
    3F8h COM1
    2F8h COM2
    3E8h COM3
    2E8h COM4
    378h LPT1
    278h LPT2
    *** I/O地址冲突是PC机发生问题第三个最可能的原因 ***
    不幸的是,上面这张表格中仅仅包含了一小部分I/O基地址。到底使用哪些I/O基地址取决于你的PC机上安装了哪些设备。




    --------------------------------------------------------------------------------

    Linux中的资源使用情况
    要察看你的Linux系统中的资源配置信息,可以看一下/proc目录中的下列文本文件:
    cat /proc/interrupts 列出正在使用的IRQ中断资源
    cat /proc/ioports 列出正在使用的I/O端口地址
    cat /proc/dma 列出正在使用的DMA通道


    发布人:netbull 来自:Linux公报