Port IO

来自osdev
(重定向自Everything about ports
跳到导航 跳到搜索

x86体系结构将地址空间分为两个编程上不同的两组: 内存(memory)和端口(ports)。 在早古时代上,内存被用作数据存储,读写操作不会产生副作用,而端口被用来控制外部硬件,这些硬件需要不同的计时方式来工作。 这也是访问端口比访问内存慢得多的原因。 而许多其他常见的计算机体系结构具有统一的空间,其中设备以与内存相同的速度运行,或者地址空间被划分为具有单独可配置属性的块。

现代x86硬件越来越倾向于统一空间,但出于遗留原因,仍然包含端口。

如何访问端口

x86包含四个从端口空间读取的汇编操作码(opcodes,译者注:CPU指令): IN、INS*、OUT和OUTS* 都有8位和16位版本,386及更高版本也有32位版本。

某个设备含有哪些端口

有三组设备,每组都需要不同的方法查明端口分配情况。 第一组包括所有PC-AT硬件、设备,如PIT-定时器PIC-中断控制器PS/2-键盘控制器端口、串口和并行端口、软盘和IDE-磁盘,以及VGA-显示器。 在过去,设备被连接到固定的端口地址,它们保留端口地址固定在那里是为了向后兼容。 查阅编程信息将告诉您需要使用的端口。

第二类是即插即用(plug-and-play)硬件。 包含大多数现代的插卡和可选设备如PCI、AGP或PCI express。 在启动时,将检查它们的端口要求,并且BIOS将为每个设备分配端口范围。 枚举PCI总线将列出所有这些设备,还可以告诉您它们使用的端口(和内存映射范围)。

第三组是旧的非即插即用兼容硬件。 它们具有跳线或固定地址,可以物理地选择正在使用的端口。 大多数ISA卡都是这样的。 您必须探测端口范围以查找可能的位置,以查看有问题的设备是否存在。 或者,您可以要求用户输入详细信息以进行配置 (例如DOS游戏中看到的soundblaster配置)。 问题是,很难列出所有设备,这使得映射时保证其他设备没有冲突成为一个潜在问题。

此端口上可能有哪些设备

唯一可行的方法是找到系统上的所有设备,然后在所有设备中分析您想要的端口。 但这种查询几乎没有任何用处。