我最近开始进入低级别的东西,并研究引导加载程序和操作系统等......
据我了解,至少对于ARM处理器,外围设备由引导加载程序初始化,然后映射到物理内存空间。从这里开始,代码只需将值写入映射到外设寄存器的存储空间即可访问外设。稍后,如果芯片具有MMU,则可以将其用于进一步重新映射到虚拟存储器空间。我是对的吗?
我不明白的是(假设我上面所说的是正确的):
答案 0 :(得分:5)
当设备启动时,MMU会关闭,您通常会以管理员模式运行。这意味着提供的任何地址都是物理地址。
每个ARM SOC(片上系统)都有一个存储器映射。设备的地址对应由哪个物理数据和地址线连接到处理器的哪些部分来确定。所有这些信息都可以在技术参考手册中找到。对于OMAP4芯片,可以找到here。
有几种方法可以连接片外器件。一个是使用GPMC。在这里,您需要在GPMC中选择要在芯片上使用的地址。
当MMU打开时,这些地址可能会根据MMU的编程方式而改变。通常,直接访问硬件也只能在内核模式下使用。
答案 1 :(得分:2)
虽然这是一个老问题,但想到回答这个问题可能有助于像我这样的其他人尝试从stackoverflow获得足够的答案。
你的解释几乎是正确的但是想对这个解释很少: 外围设备由引导加载程序初始化,然后映射到物理内存空间
Onchip外设已经具有预定义的物理地址空间。对于其他外部IO映射外设(如PCIe),我们需要配置物理地址空间,但它们的物理地址空间范围仍然是预定义的。它们不能在随机地址空间配置。
现在回答你的问题,这是我的答案.. 如果外围设备尚未映射到地址空间,引导加载程序如何初始化?
如上所述,所有(片上)外设都预先定义了物理地址空间(通常将在处理器RM的存储器映射章节中列出)。因此,启动加载器(假设MMU关闭)可以直接访问它们。
使用虚拟内存映射,有一些表告诉MMU在哪里映射什么。但是什么决定外围设备在物理内存中的映射位置?
使用VMM,有一些页面表(由内核创建并存储在物理DRAM中),告诉MMU将虚拟地址映射到物理地址。在具有1G内核virt空间的linux内核中(比如来自0xc0000000-0xffffffff的内核虚拟地址),片上外设需要在上面的内核VM空间内拥有一个VM空间(这样内核和内核才能访问它);和页表将被设置为将外围virt addr映射到其实际的物理地址(在RM中定义的那些)
答案 2 :(得分:0)
您无法在ARM处理器中重新映射外设,所有外围设备都对应于内存映射中的固定位置。甚至寄存器也映射到具有永久固定位置的内部RAM存储器。您可以重新映射的唯一内容是SRAM,FLASH等存储设备,通过FSMC或类似的核心功能。但是,您可以重新映射不属于核心本身的内存映射附加自定义外围设备,例如硬盘控制器,但ARM内核中的内容是固定的。
一个良好的开端是查看飞利浦和ST等公司站点的处理器数据表,或www.arm.com上的ARM架构本身。