如何验证或检查 I/O (Input / Output, io, IO) 端口?
How to verify or check I/O (Input / Output, io, IO) ports?
在使用 IN 或 OUT 指令访问引导加载程序代码中的 I/O 端口之前,我想确保端口与我期望的设备匹配。例如,对于 Intel Z370 芯片组,I/O 端口地址 0x0CF8、0x0CFC 是 PCI 配置 Space。另一个例子,I/O 端口地址 0x0060 通常是键盘控制器。
有没有办法在使用前验证或检查端口地址属于哪个?
没有,没有。
可以通过例如读取具有供应商 ID 的寄存器来探测某些设备。
然而,这不是 100% 安全的,因为用于探测的 writes/reads 序列可能会被解释为 table 作为同一端口上另一台设备的命令。
总的来说,你必须做出假设。
当然,如果端口地址是从 PCI 配置 space 或从 ACPI table 读取的,那么您有权假设它是正确的。
遗留设备使用的端口不会被重复使用以避免此类冲突。
已知存在违反上述经验法则的有缺陷的实施并且并不少见,所采取的方法是假设实施是正确的并根据具体情况进行修补。
如果您修复了平台(例如特定的计算机型号),软件总有办法知道端口背后的内容。
这涉及数据表,有时还涉及原理图。
不过,并非所有这些都可能 public。
在使用 IN 或 OUT 指令访问引导加载程序代码中的 I/O 端口之前,我想确保端口与我期望的设备匹配。例如,对于 Intel Z370 芯片组,I/O 端口地址 0x0CF8、0x0CFC 是 PCI 配置 Space。另一个例子,I/O 端口地址 0x0060 通常是键盘控制器。
有没有办法在使用前验证或检查端口地址属于哪个?
没有,没有。
可以通过例如读取具有供应商 ID 的寄存器来探测某些设备。
然而,这不是 100% 安全的,因为用于探测的 writes/reads 序列可能会被解释为 table 作为同一端口上另一台设备的命令。
总的来说,你必须做出假设。
当然,如果端口地址是从 PCI 配置 space 或从 ACPI table 读取的,那么您有权假设它是正确的。
遗留设备使用的端口不会被重复使用以避免此类冲突。
已知存在违反上述经验法则的有缺陷的实施并且并不少见,所采取的方法是假设实施是正确的并根据具体情况进行修补。
如果您修复了平台(例如特定的计算机型号),软件总有办法知道端口背后的内容。
这涉及数据表,有时还涉及原理图。
不过,并非所有这些都可能 public。