Memory 开始编写ARM RTOS并对内存映射感到困惑

Memory 开始编写ARM RTOS并对内存映射感到困惑,memory,arm,low-level,rtos,bare-metal,Memory,Arm,Low Level,Rtos,Bare Metal,所以我以前为学校写过一个小型RTOS,不过我们只是使用引导加载程序(redboot)留给我们的内存映射。它(TS-7200)有4x 8MB的ram段,但引导加载程序已“重新映射”它们,使它们从0开始连续。我基本上想知道是什么机制使得这成为可能,因为我现在正在考虑为基于px4fmu arm的auto-pilot编写一个更轻的固件,并且想知道我的内存发生了什么,这样我就可以了解我的链接器脚本以及内存保护 引导加载程序是否打开MMU并设置页表,以便将0-32MB的地址转换为正确的物理地址?如果是这样,

所以我以前为学校写过一个小型RTOS,不过我们只是使用引导加载程序(redboot)留给我们的内存映射。它(TS-7200)有4x 8MB的ram段,但引导加载程序已“重新映射”它们,使它们从0开始连续。我基本上想知道是什么机制使得这成为可能,因为我现在正在考虑为基于px4fmu arm的auto-pilot编写一个更轻的固件,并且想知道我的内存发生了什么,这样我就可以了解我的链接器脚本以及内存保护

引导加载程序是否打开MMU并设置页表,以便将0-32MB的地址转换为正确的物理地址?如果是这样,我认为转换不会自动发生在主管模式下,这就是引导加载程序留给您的


我怀疑事实并非如此,引导加载程序做了一些GPMC咒语来改变内存芯片的寻址方式。我读到一些关于外围设备不可重新映射的文章,这在这个理论上是有道理的。如果是这种情况,有人能给我一个快速的概述如何工作/哪些地址最终意味着什么?我以前在SoC用户指南中看到过关于“总线地址”的内容,这些地址如何关联/转换为各种类型内存中的地址?

因此,有处理器,然后是mmu,然后是一级缓存,然后是“处理器核心”的边缘,尽管埋在早期内存系统下的也是一个核心,但更深层

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

如果mmu已启用,则mmu会从地址中提取一些位,根据地址寄存器进行一些计算,然后在mmu的内存侧(处理器侧和内存侧)生成自己的内存周期。它查找用户编程的mmu表信息,这是如何将虚拟地址更改为物理地址的。一旦mmu完成了收集数据所需的内存周期数(请注意,mmu可能有一个先前查找的小缓存,以保存实际内存周期),然后,只要没有故障(表中描述了正在访问的地址,权限匹配允许您访问该内存,和/或mmu表查找本身没有导致故障)处理器想要执行的访问是使用物理地址执行的

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

一旦你进入amba/axi,你就进入了供应商逻辑,谁制造了芯片(arm不制造芯片——它制造处理器内核,一些供应商用自己的逻辑包装该内核,然后制造芯片并销售芯片)。您可以进入供应商的内存系统,该系统可能非常简单,也可能非常复杂。例如,您可以具有可配置的设置,以便某些地址空间(例如,通电时)可以在一个点上设置为零指向一个rom,然后,如果您稍后更改一个设置,在零或接近零的位置访问将导致它进入某个ram。您可以有一些逻辑来操纵整个地址空间,例如地址的前两位进入某个逻辑,该逻辑有四组控制寄存器,并且对于地址空间的每四分之一,这些寄存器控制r电子注册师可能会对地址或其他类似mmu的东西进行操作

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

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

arm处理器本身不知道外设是ram还是rom,也不知道外设是墙上的洞。地址位只是位,一些它通常不关心的模式,在一些arm处理器架构中,有些例外情况是,arm处理器内部有一些外设,它会解码,不让你进一步了解呃,但arm不知道或不关心供应商的外围设备、ram、rom等,因此这些地址空间的虚拟地址可能与物理地址不同。您不想做的是拥有外围设备地址空间(数据)可缓存。一些较新的arm内核有一些关于分支预测的规则,以及可能获取一些数据的限制,所以如果