【问题标题】:How does the driver in macosx get the physical address of MMIO registers?macosx中的驱动如何获取MMIO寄存器的物理地址?
【发布时间】:2018-01-09 17:40:59
【问题描述】:

这个问题是概念性/理论性的,与我实际从事的任何工作无关。

我了解在虚拟内存布局中,您有堆、堆栈、数据、内存映射等部分

我想知道如果例如在 macosx 上,驱动程序想要访问内存映射 IO(MMIO) 区域中的寄存器之一,它将如何工作?

我假设它需要知道 MMIO 区域所在位置的物理页码,但它如何得到这个?任何函数调用?

另外,如果一段时间后页面被换出并换入不同的页码怎么办?每次都需要检查/获取 MMIO 寄存器的页码吗?

【问题讨论】:

  • I/O 设备通常不交换 - 它们必须可以从中断处理程序访问。
  • @MartinJames 所以我在这里有点困惑,如果我有 10 个进程在运行,每个进程都有自己的堆、数据等和 MMIO 段,对吗?现在如果启动进程 1,所有的内存段都买进了物理内存?

标签: operating-system driver virtual-memory memory-mapping


【解决方案1】:

如何发现 MMIO 页面取决于我们所讨论的设备和平台类型。在像 Mac 这样复杂而复杂的东西上,像 ACPI 这样的方案用于分配和枚举 MMIO 地址。一些地址很可能也在固件中进行了硬编码,并且操作系统可以通过固件的 API 访问这些地址。在简单的嵌入式平台上,您通常会发现 MMIO 范围硬编码到某个特定的物理地址。

PCI 设备在configuration space 中公布其 MMIO 范围,系统软件(固件和/或操作系统)可以决定设备的 MMIO 范围应位于物理地址空间中的哪个位置。

如果 (x86/-64) CPU 在分页/长模式下运行,对于 Mac 来说即使在 (EFI) 固件中也是如此,则需要使用页表将 MMIO 页面映射到虚拟内存地址空间,以便软件可访问。

另外,如果一段时间后页面被换出并进入 不同的页码?

MMIO 支持的虚拟页面不会被换出 - 虚拟页面被换出的唯一原因是系统未使用的物理系统内存不足,操作系统需要回收一些。从页表中删除支持 MMIO 的页不会释放任何系统内存。

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多