端口编号是十六进制的(基数为 16)。肯定会发现有一些看起来很熟悉,比如键盘、计时器、并行端口(打印机)、串行端口(调制解调器)和显示器(vga )。将这些和清单 3 中给出了在 PC 中某些标准 IO 端口分配进行比较。例如,要注意的是,在 /proc/ioports 中为第一个并行端口(parport0)分配的地址范围是从 0378 到 037A,而标准中允许他(LPT!)使用的是从 378 到 37F。
清单 3. 标准 I/O 端口配置
1FO-1F8 - Hard Drive Controller, 16-bit ISA
200-20F - Game Control
210 - Game I/O
220 - Soundcard
278-27F - LPT2
2F8-2FF - COM2
320-32F - Hard Drive Controller, 8-bit ISA
378-37F - LPT1
3B0-3BF - Monochrome Graphics Adapter (MGA)
3D0-3DF - Colour Graphics Adapter (CGA)
3F0-3F7 - Floppy Controller
3F8-3FF - COM1
|
中断
那么,CPU 如何知道最后一次输出何时完成?或何时有数据在等待读取?通常,在一个状态寄存器中能够获得此信息,通过读取和某设备想关联的一个(或多个)IO 端口能够访问他。在这种情况下会出现两个问题。首先,CPU 不得不花费时间来检查状态。其次,假如设备持有来自某处的数据,比如连接的调制解调器,那些数据必须要及时被读取,否则就可能被下一个可用的数据字节所覆盖。
不浪费多余 CPU 周期,并确保数据能被及时读写,这两个问题是由 中断(interrupt) 的概念所解决的。中断也称为 中断请求(Interrupt Requests) 或 IRQs。当设备中发生 CPU 需要知道的某事件时,设备就会发出一个中断,CPU 则临时停止正在做的其他工作,来处理那件事情。
根据上一节的经验,毫无疑问关于中断的信息也保存在 /proc 文档系统中,在 /proc/interrupts 中。运行 cat /proc/interrupts 命令,能够看到类似于清单 4 的输出。
清单 4. /proc/interrupts
CPU0
0: 226300426 XT-PIC timer
1: 92913 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 0 XT-PIC usb-uhci
8: 1 XT-PIC rtc
9: 2641134 XT-PIC ehci-hcd, eth0, Intel ICH4
10: 0 XT-PIC usb-uhci
11: 213632 XT-PIC usb-uhci
14: 1944208 XT-PIC ide0
15: 3562845 XT-PIC ide1
NMI: 0
ERR: 0
|
这一次,中断数字是从 0 到 15 的十进制数。同样,将这些中断和清单 5 所示的 PC 标准 IRQ 分配进行比较。
清单 5. 标准 IRQ 配置
IRQ 0 - System Timer
IRQ 1 - Keyboard
IRQ 2(9) - Video Card
IRQ 3 - COM2, COM4
IRQ 4 - COM1, COM3
IRQ 5 - Available (LPT2 or Sound Card)
IRQ 6 - Floppy Disk Controller
IRQ 7 - LPT1
IRQ 8 - Real-Time Clock
IRQ 9 - Redirected IRQ 2
IRQ 10 - Available
IRQ 11 - Available
IRQ 12 - PS/2 Mouse
IRQ 13 - Math Co-Processor
IRQ 14 - Hard Disk Controller
IRQ 15 - Available
|
最初,每个设备都有自己的私有 IRQ。做为示例,注意,在清单 5 中,IRQ5 通常用于声卡 或 第二个并行端口(打印机)。假如两个都要使用,那么不得不去寻找一个能够配置的卡(通常是通过硬件跳线配置)来使用另一个 IRQ,比如 IRQ15。
现在的 PCI 设备是共享 IRQ 的,所以,当某个设备中断 CPU 时,会有一个中断处理程式检查他并判断那个中断是否为他所用的中断,假如不是,则将他传递给链中的下一个处理程式。清单 4 和 5 并没有向我们展示这种共享。在后面的教程中我们将会学习 grep 命令,但是,现在我们能够使用他来过滤 dmesg 命令的输出,来查看关于 IRQ 的引导消息,如清单 6 所示。在此突出显示了共享的中断。
清单 6. 引导过程中发现的中断
[ian@lyrebird ian]$ dmesg | grep -i irq
PCI: Discovered primary peer bus 01 [IRQ]
PCI: Using IRQ router PIIX [8086/24c0] at 00:1f.0
PCI: Found IRQ 5 for device 00:1f.1
PCI: Sharing IRQ 5 with 00:1d.2
Serial driver version 5.05c (2001-07-08) with MANY_PORTS MULTIPORT
SHARE_IRQ SERIAL_PCI ISAPNP enabled
ttyS0 at 0x03f8 (irq = 4) is a 16550A
ttyS1 at 0x02f8 (irq = 3) is a 16550A
PCI: Found IRQ 5 for device 00:1f.1
PCI: Sharing IRQ 5 with 00:1d.2
ICH4: not 100% native mode: will probe irqs later
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
PCI: Found IRQ 11 for device 00:1d.0
PCI: Sharing IRQ 11 with 00:02.0
usb-uhci.c: USB UHCI at I/O 0x1800, IRQ 11
PCI: Found IRQ 10 for device 00:1d.1
usb-uhci.c: USB UHCI at I/O 0x1820, IRQ 10
PCI: Found IRQ 5 for device 00:1d.2
PCI: Sharing IRQ 5 with 00:1f.1
usb-uhci.c: USB UHCI at I/O 0x1840, IRQ 5
PCI: Found IRQ 9 for device 00:1d.7
ehci-hcd 00:1d.7: irq 9, pci mem f885d000
parport0: irq 7 detected
PCI: Found IRQ 9 for device 02:08.0
PCI: Found IRQ 9 for device 02:08.0
parport0: irq 7 detected
PCI: Found IRQ 11 for device 00:02.0
PCI: Sharing IRQ 11 with 00:1d.0
PCI: Found IRQ 9 for device 00:1f.5
PCI: Sharing IRQ 9 with 00:1f.3
i810: Intel ICH4 found at IO 0x18c0 and 0x1c00, MEM 0xc0080c00 and
0xc0080800, IRQ 9
|
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!