I/O Ports

来自osdev
跳到导航 跳到搜索

“I/O端口” 通常是用作x86的IO总线上特定地址的技术术语。 该总线以固定的顺序和大小提供与设备的通信,并被用作内存访问的替代方法。 在许多其他体系结构上,没有用于此类通信的预定义总线,并且它们与硬件的所有通信都是通过映射到内存地址的IO完成的。 在现代x86硬件上也越来越多地发生这种情况。


寻求端口列表

作为操作系统开发人员,“你不应该主动寻求它”。 I/O端口仅在某些情况下使用,例如PCI之前存在的PC硬件 (AT和兼容设备等)。 使用 “标准化” I/O端口的设备的例子有 软盘驱动器 串行 并行 端口,但是大多数端口都是由你可能都没有的插卡 [待列出?] 声明的,有些 [待列出?] 甚至是通过PNP分配的,这意味着任何端口都可以用于所讨论的设备。 如果你想访问一个设备,你需要查找有问题的设备的详细信息,如果涉及某个固定端口,它会告诉你。 将端口事先完整映射到设备在技术上是不可行的,因为你将无法访问它。

端口滥用

一些较为廉价的设备 [待列出?] ,并且不解码所讨论的I/O端口的所有地址位 (仅底部12或14)。 这意味着最多有16个端口地址映射到同一设备。 类似地,某些设备已选择通过使用稀疏寄存器文件(sparse register file)来避免与此类设备发生冲突。 底部位被定义为常量,而 “顶部位” 用于索引。 你将获得端口编号 0x82E80x84E80x86E8 等等。 这样的ISA设备通常因为它们的扩展容易干扰 PCI 分配的IO地址。

旧设备的现代实现 (通常是IDE和VGA控制器) 具有一种实现,该实现会被当作带移动寄存器的即插即用(plug-and-play )设备提及,但它们仍然能够侦听遗留端口并做出相应的响应。

列表

如果你遇到了一个端口号,仍想知道它的含义,这里列出最常见的端口:

端口范围 简要说明
0x0000-0x001F 第一个遗留的 DMA控制器,通常用于软盘传输。
0x0020-0x0021 第一个 可编程中断控制器
0x0022-0x0023 访问Cyrix处理器的特定于模型的寄存器。
0x0040-0x0047 PIT (可编程间隔定时器)
0x0060-0x0064 “8042” PS/2控制器 或其前身,处理键盘和鼠标。
0x0070-0x0071 CMOSRTC 寄存器
0x0080-0x008F DMA (页面寄存器)
0x0092 快速 A20 门寄存器的位置
0x00A0-0x00A1 第二 PIC
0x00C0-0x00DF 第二个 DMA 控制器,常用于soundblasters设备
0x00E9 Port E9 Hack。在某些模拟器上用于直接将文本发送到主机的控制台。
0x0170-0x0177 辅助 ATA 硬盘控制器。
0x01F0-0x01F7 ATA 硬盘控制器。
0x0278-0x027A 并行端口
0x02F8-0x02FF 第二个 串行端口
0x03B0-0x03DF 用于 IBM VGA,其直接前身以及传统模式下的任何现代视频卡的范围。
0x03F0-0x03F7 软盘控制器
0x03F8-0x03FF 第一个 串行端口

另见

External Links