虽然这是一个古老的问题,想到回答这个问题,因为它可能会帮助像我这样的其他人试图从计算器获得足够的答案。
你的解释几乎是正确的,但要给出一点解释这一个: 外设引导加载程序初始化,然后将它们映射到物理内存空间
片上外设已经有一个预先定义的物理地址空间。对于其他外部IO映射外设(如PCIe),我们需要配置物理地址空间,但其物理地址空间范围仍是预定义的。它们不能在随机地址空间中配置。
现在你的问题,这里是我的答案.. 如果引导程序尚未映射到地址空间,引导程序如何初始化外设?如上所述,所有(片上)外设都具有预定义的物理地址空间(通常将在处理器RM的存储器映射章节中列出)。因此,引导装载程序(假设MMU关闭)可以直接访问它们。
使用虚拟内存映射,有表格告诉MMU在哪里映射什么。但是什么决定了外设在物理内存中的映射位置?
在VMM中,有一些页表(通过内核在物理DRAM中创建并存储)告诉MMU将虚拟地址映射到物理地址。在具有1G内核虚拟空间的Linux内核中(比如0xc0000000-0xffffffff的内核虚拟地址),片上外设将需要在上述内核虚拟机空间内拥有虚拟机空间(以便内核只能访问内核)。并且将设置页表以将该外设virt addr映射到其实际物理地址(在RM中定义的地址)
谢谢,这有助于解决问题。最后一个问题:是否有可能在物理内存空间中“取消映射”某些内容? – tangrs
您可以对GPMC进行重新编程,并有效地取消映射内存,但我怀疑这是一个很好的用例。 – doron