2013-10-15 45 views
1

因此,我在学校之前编写了一个小型RTOS,但是我们只是使用bootloader(redboot)留给我们的内存映射。它(一个TS-7200)有4个8MB的ram段,但引导程序已将它们重新映射为从0开始连续。我基本上想知道什么机制可以做到这一点,因为我现在正在编写一个px4fmu arm-based自动驾驶仪的重量更轻,想知道我的记忆是怎么回事,所以我可以找出我的链接器脚本以及内存保护。开始编写一个ARM RTOS,并对内存映射感到困惑

引导加载程序是否打开MMU并设置页表,以便将地址0-32MB转换为正确的物理地址?如果是这样,我认为翻译没有发生自动监督模式,这是引导程序离开你。

我怀疑这不是这种情况,并且引导加载程序做了一些GPMC咒语来改变内存芯片得到解决。我读了一些关于外设不可重映射的内容,这对于这个理论是有意义的。如果是这样的话,有人可以简单概述一下它是如何工作的/哪些地址最终意味着什么?我在SoC用户指南中看到过关于“总线地址”的内容,它们如何在各种类型的内存中关联/转换成地址?

回答

3

所以有处理器,然后是mmu,然后是l1缓存,然后是“处理器核心”的边缘,尽管埋在早期存储器系统下的是一个核心,但是更深。

当“处理器”访问程序员直接操作的某个地址(寄存器中用于保存加载或存储地址的值,加上您编码的任何偏移量)。

如果启用了mmu,那么mmu会从地址中取出一些位,根据地址寄存器进行一些计算,以及如何配置mmu,然后在mmu的存储器一侧生成它自己的存储器周期处理器端和存储器端)。它查找用户编程的mmu表信息,这就是如何改变虚拟地址到物理地址的情况。一旦mmu完成了需要收集数据的内存周期数(注意mmu可能有一个小的先前查找缓存以节省实际的内存周期),那么,只要没有错误(访问的地址在表中描述并且权限匹配,以便您可以访问该内存,和/或mmu表查找本身不会导致错误)处理器想要执行的访问是使用物理地址执行的。

如果mmu被禁用,则处理器访问直接进入l1缓存,然后通过axi或amba总线进入内存系统。如果存在l2,则l2缓存位于amba/axi上。

一旦你到达amba/axi,那么你会进入供应商逻辑,无论是谁制造芯片(arm不会制造处理器核心的芯片,有的供应商用自己的逻辑封装该核心,然后制造芯片并销售芯片)。你进入那个供应商的内存系统可能非常简单到非常复杂。例如,你可以设置一些可配置的设置,例如零点等地址空间可以在一个点上(例如加电时)指向一个ROM,然后如果你改变某个设置的访问权限为零或接近零,则会导致它进入一些RAM 。你可以有一些操纵整个地址空间的逻辑,比如说地址的最高两位进入一些逻辑,它有四组控制寄存器,并且对于地址空间的每个四分之一,这些控制寄存器可以做些什么地址或其他与mmu不同的东西。

最终,供应商逻辑将开始解码更多的地址位,并确定您是否尝试访问实际的RAM,ROM或外设,然后当它接近外设内的最终目标csr等时地址位被进一步解码。任何处理器的地址空间都可以(并不总是),但可以像树,干线是地址离开处理器的地方,但是当地址被解析时,它可以在不同的方向分支,最终找到你正在尝试的单个叶子地址,它可能是RAM中的内存位置,某些外设中的csr或外设中的某个ram或其他项目(这可能导致某些其他总线上的其他某些事件链,例如usb或pcie)。

因此,在说出所有这些简短答案之后,首先您应该在没有mmu和缓存的情况下运行,了解芯片(供应商方)的“物理”地址空间,您必须了解有或没有mmu。这个地址空间对于那个供应商来说非常具体,可能是那个芯片或者芯片系列,所以你需要芯片供应商的文档。然后再学习如何使用mmu,我首先建议使用与物理地址相同的虚拟地址来尝试它,学会将ram标记为可缓存,并将外围地址空间标记为不可缓存(然后打开数据缓存并查看是否有效)。然后学会添加指向不同物理地址的虚拟地址空间块,然后您就可以开始将mmu用于操作系统。

手臂处理器本身并不知道来自墙上的一个rom从ram的外围设备。地址位只是位,一些它通常不关心的模式,在一些ARM处理器架构上有一些例外,在ARM架构内部有一些外围设备可以解码,而不是让它们进一步向下,但是厂商的外围设备,内存,ROM等手臂不知道或关心,使这些地址空间可以有他们的虚拟地址不同于物理。你不想做的是让外设地址空间(数据)可缓存。一些较新的arm内核具有关于分支预测的一些规则,并且有一些限制可能会导致一些提取,所以如果您在设置中具有良好的调整灵活性,并且外围设备执行某些更改(读取时清除,自动递增内部地址外围设备等),无论如何,它们在现代系统中都是糟糕的设计选择,因此您可能希望避免可能导致分支预测指令获取可能导致读取到其中一个位置的情况。

您可能面临的redboot可能会或可能不会解决的另一个问题是dram,或者甚至是sram,但是如果ram位于处理器之外,并且它需要训练或调整,并且已经完成了训练或调整因为你购买redboot或red-boot bootloader,那么你真的会想让redboot做到这一点,然后有redboot加载并启动你的rtos。初始化物理内存可以(并非总是)像从头开始编写自己的rtos一样的学习体验,所以在许多这些具有Linux能力的系统上,您需要决定要重新发明多少内容以及为什么。你将有足够的工作去完成没有mmu和一个基于物理地址的内存空间的事情,一次构建一个桥,不要试图一次性构建它们,等到你尝试处理之前到达下一个障碍它。

+0

这大部分都是通用的,并不一定专门针对arm。其他处理器厂商通常会制造自己的芯片,因此您不必处理单独的供应商文档。但是如果您超越每个处理器内存总线的细微差别,那么mmus虚拟和物理端的基础以及内存控制器以及后端如何解码和路由事务的基础是非常相似的。 –