【问题标题】:How to Decide Port I/O Address of ACPI Timer如何确定 ACPI 定时器的端口 I/O 地址
【发布时间】:2022-01-18 06:05:33
【问题描述】:

根据OSDev,为了定位ACPI定时器的端口I/O地址,我们首先打开FADT表,检查条目PM Timer Block LengthPM Timer Block Address。在我的电脑中,PM Timer Block Address 给出了地址0x408,它可以正常工作。

但是,在OVMF的实现中,ACPI定时器的I/O地址计算为PMBA + 0x8。我在互联网上搜索并没有找到有关这种计算方式的信息。

我想知道确定 ACPI 计时器地址的两种方法是否正确?如果两者都正确,我在哪里可以找到关于第二种计算方式的信息定义?

【问题讨论】:

  • 我想是同一个地址。我猜 PMBA 意味着整个 ACPI 块的开始,即 0x400。

标签: operating-system virtual-machine uefi acpi


【解决方案1】:

固件(例如 OVMF)使用芯片组特定的方法来确定 ACPI 计时器的 IO 端口;然后构造 FADT 并填充它,这样操作系统就不需要特定于芯片组。

如果您不想使用 FADT,那么您可以为每个芯片组编写一个芯片组特定的驱动程序。对于某些情况(开源模拟器),这可能相对容易,而对于某些情况(专有和未记录的真实硬件),这几乎是不可能的。

【讨论】:

  • 如果我理解正确的话,OVMF方式是计算IO端口的基本方式吗?我下载了OVMF使用的PIIX4南桥的spec,没找到如何计算ACPI定时器的IO端口的描述...
  • @citrate:对于大多数真正的主板固件可能只是在编译时完全完成(如#define ACPI_TIMER_IO_PORT 0x408)。 OVFM 是不同的,因为它支持 3 种不同的芯片组(例如,您提供了链接的 BaseAcpiTimerLib.c 中第 43 行的 switch (HostBridgeDevId))和不同的虚拟机(例如 VirtualBox 中的 PIIIX4、Qemu 中的 PIIIX4 等),因此它必须是适应能力强很多。我自己,我会以不同的方式完成 OVFM - 让本机主机代码构建 FADT,而不是在客户固件中执行(然后让客户固件在需要时从 FADT 读取它)。
  • 知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2012-04-23
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2019-02-13
相关资源
最近更新 更多