问题是概念/理论,对我实际工作的任何事情都没有任何意义。
我理解在虚拟内存布局中你有堆,堆栈,数据,内存映射等部分
我想知道如果在macosx上驱动程序想要访问内存映射IO(MMIO)区域中的一个寄存器,它会如何工作?
我认为需要知道MMIO区域所在的物理页码是如何知道的,但它会如何得到这个?任何函数调用?
另外,如果一段时间后页面被换出并进入另一个页码,该怎么办?是否需要每次都检查/获取页码到MMIO寄存器?
答案 0 :(得分:1)
如何发现MMIO页面取决于我们所谈论的设备和平台的类型。在像Mac一样复杂和复杂的东西上,像ACPI这样的方案用于分配和枚举MMIO地址。有些地址很可能也在固件中硬编码,并且可以通过固件的API访问操作系统。在简单的嵌入式平台上,您通常只会找到硬编码到某个特定物理地址的MMIO范围。
PCI设备在configuration space中公布其MMIO范围,系统软件(固件和/或OS)可以决定设备的MMIO范围应该位于物理地址空间的哪个位置。
如果(x86 / -64)CPU在分页/长模式下运行,即使在(EFI)固件中,对于Mac也是如此,需要使用页表将MMIO页面映射到虚拟内存地址空间,为了软件可访问。
此外,如果一段时间后页面被换出并进入a 不同的页码?
MMIO支持的虚拟页面不会被换出 - 虚拟页面被换出的唯一原因是因为系统未使用的物理系统内存很少,操作系统需要回收一些。从页表中删除MMIO支持的页面不会释放任何系统内存。