在使用IN或OUT指令访问引导加载程序代码中的I / O端口之前,我想确保该端口与我期望的设备匹配。例如,对于Intel Z370芯片组,I / O端口地址0x0CF8、0x0CFC是PCI配置空间。另一个示例,I / O端口地址0x0060通常是键盘控制器。
有没有一种方法可以在使用前验证或检查端口地址属于哪个?
答案 0 :(得分:4)
不,没有。
可以通过例如读取带有供应商ID的寄存器来探查某些设备。
但是,这并不是100%安全的,因为用于探测的写入/读取顺序可以被同一端口上的另一设备解释为命令。
通常,您必须进行假设。
当然,如果从PCI配置空间或ACPI表中读取端口地址,则您有权假定它是正确的。
传统设备使用的端口不会重复使用,以避免发生此类冲突。
已知存在违反上述经验法则的笨重的实现,并且这种情况并不罕见,采取的方法是假定实现正确并根据具体情况进行修补。
如果您修复平台(例如特定的计算机型号),则始终可以通过一种方法来了解端口背后的内容。
这涉及数据表,有时还包括原理图。
但是,并非所有这些都可能是公开的。