2011-07-11 130 views
7

我最近开始进入低层次的东西,并寻找到引导程序和操作系统等等困惑了内存映射

据我了解,至少ARM处理器,外设引导加载程序初始化,然后将它们映射到物理内存空间。从这里开始,代码只需将值写入映射到外设寄存器的内存空间即可访问外设。稍后如果芯片有MMU,它可以用来进一步重新映射到虚拟内存空间。我对吗?

什么我不明白的(假设我上面所说的是正确的):

  • 如何引导装载程序初始化外设,如果他们没有被映射到的地址空间了吗?
  • 使用虚拟内存映射,有表格告诉MMU在哪里映射什么。但是什么决定了外设在物理内存中的映射位置?

回答

5

当设备引导时,MMU将关闭,并且您通常会以管理员模式运行。这意味着提供的任何地址都是物理地址。

每个ARM SOC(系统芯片)都会有一个存储器映射。与设备地址的对应关系由哪个物理数据和地址线连接到处理器的哪些部分决定。所有这些信息都可以在技术参考手册中找到。对于OMAP4芯片,可以找到here

有几种连接片外器件的方法。一种是使用GPMC。在这里,您需要在GPMC中设置要在芯片上使用的地址。

当MMU接着打开时,这些地址可能会根据MMU的编程方式而改变。通常直接访问硬件也只能在内核模式下使用。

+0

谢谢,这有助于解决问题。最后一个问题:是否有可能在物理内存空间中“取消映射”某些内容? – tangrs

+1

您可以对GPMC进行重新编程,并有效地取消映射内存,但我怀疑这是一个很好的用例。 – doron

0

您不能在ARM处理器中重新映射外设,所有外围设备都对应内存映射中的固定位置。即使寄存器映射到具有永久固定位置的内部RAM存储器。您可以重新映射的唯一东西是内存设备,如SRAM,FLASH等,通过FSMC或类似的核心功能。但是,您可以重新映射内存映射的附加定制外围设备,而不是内核本身的一部分,例如可以说是硬盘控制器,但是固定的内核是什么。

一个好的开始是看看飞利浦和ST等公司网站上的处理器数据表,或ARM架构本身www.arm.com上的处理器数据表。

1

虽然这是一个古老的问题,想到回答这个问题,因为它可能会帮助像我这样的其他人试图从计算器获得足够的答案。

你的解释几乎是正确的,但要给出一点解释这一个: 外设引导加载程序初始化,然后将它们映射到物理内存空间

片上外设已经有一个预先定义的物理地址空间。对于其他外部IO映射外设(如PCIe),我们需要配置物理地址空间,但其物理地址空间范围仍是预定义的。它们不能在随机地址空间中配置。

现在你的问题,这里是我的答案.. 如果引导程序尚未映射到地址空间,引导程序如何初始化外设?如上所述,所有(片上)外设都具有预定义的物理地址空间(通常将在处理器RM的存储器映射章节中列出)。因此,引导装载程序(假设MMU关闭)可以直接访问它们。

使用虚拟内存映射,有表格告诉MMU在哪里映射什么。但是什么决定了外设在物理内存中的映射位置?

在VMM中,有一些页表(通过内核在物理DRAM中创建并存储)告诉MMU将虚拟地址映射到物理地址。在具有1G内核虚拟空间的Linux内核中(比如0xc0000000-0xffffffff的内核虚拟地址),片上外设将需要在上述内核虚拟机空间内拥有虚拟机空间(以便内核只能访问内核)。并且将设置页表以将该外设virt addr映射到其实际物理地址(在RM中定义的地址)