皮质a9启动和记忆

Ton*_*sad 7 embedded cortex-a

我是一个从微控制器编程开始的新手.这里感兴趣的芯片是cortex-a9.在复位或上电时,我的读数必须是0x0000000处的代码.虽然我的问题可能听起来太微不足道,但这些问题将有助于我提出一些概念.

内存地址0x0000000是否驻留在ROM中?从该地址读取代码后会发生什么?是否应该存在某种类型的引导加载程序,如果存在,那么它应该在哪个地址?它是否也应该驻留在ROM中?最后,内核在什么时候启动?内核代码驻留在哪里?

old*_*mer 9

ARM销售内核而不是芯片,该地址的内容取决于购买ARM内核并将其放入芯片的芯片供应商.实现因供应商,芯片与芯片而异.

传统上,ARM将从地址0启动,更正确地说,复位异常向量位于地址0.与其他处理器系列不同,传统的ARM模型不是异常入口点的地址列表,而是ARM执行该地址的指令,这意味着您需要使用相对分支或load pc指令.较新的cortex-m系列,只有拇指/拇指2(它们不能执行ARM(32位)指令)使用传统的(非ARM)类似的地址列表,零地址也不是异常矢量,它是要加载堆栈指针的地址,然后重置第二个条目,依此类推.此外,cortex-m例外列表不同,该家族有128个独立的中断,其中传统的ARM有两个,快速和正常.最近有一个基于cortex-m的问题,或者也许是用于在thumb2 ARM上运行linux的thumb2问题.我认为cortex-m实现都是微控制器类芯片,只有几十千字节的片上内存,基本上这些并不属于你所要求的类别.无论如何,你问的是cortex-a9.

许多内核或者所有内核都有一个引导选项,其中引导地址可以是0x00000000或类似0xFFFF0000作为备用地址.使用这将是ARM的用户很困惑,但它提供了一个例子,有在同一地址的ROM,并在另一个RAM,让您启动从一个ROM开机,然后切换异常表到RAM中运行操作的能力.您可能拥有一个可以做到这一点的核心芯片,但是由芯片供应商决定是否使用这些核心功能的边缘,或者将它们硬连接到某些设置而不是为您提供这种灵活性.

您需要查看相关芯片的数据表/文档.找出ARM内核的名称,正如你提到的cortex-a9.理想情况下,您想要知道rev以及r0p0类型的东西,然后访问ARM的网站并找到TRM,该核心的技术参考手册.您还需要获取ARM ARM ARM建筑参考手册的副本.ARM ARM中描述了(传统的)ARM异常向量以及更多信息.您还需要芯片供应商文档,并查看其引导方案.有些会在上电时将地址0指向引导方,然后引导加载程序需要执行某些操作,在寄存器中翻转一下,内存控制器将地址0切换为ram.有些人可能有地址0总是被配置为RAM,以及一些其他的地址总是被配置为ROM,可以说为0x80000000例如,芯片将从ROM复制一些项目启动之前的RAM你,或者芯片可能只是功率升将复位向量设置为rom的分支,然后由引导加载程序来修补向量表.你能想到的尽可能多的不同的方案,很可能有人已经尝试过了,所以你要研究芯片供应商的文档或示例代码,基本了解的答案,你的ROM的问题,是它取决于你必须检查与芯片供应商.

核心的ARM TRM应该描述核心上的磁带选项(如能够从备用地址启动),连接供应商实现的磁带选项(如果有的话).ARM ARM并不像TRM那样真正进入那个领域.值得购买的供应商将拥有一些自己的文档和/或代码,以显示他们基于ROM的引导策略是什么.

对于带来了系统,最终注定是你将有一个引导程序,一些非Linux代码(非常喜欢你的台式机/笔记本电脑的BIOS)Linux系统的系统启动的Linux.Linux是将需要的存储器相当数量(相对于微控制器和其它众所周知的ARM实现),即压头可能最终被SRAM或DRAM和引导加载程序可以具有初始化存储器接口,才可以启动linux起来.有像redboot和uboot这样的流行的引导程序.两者都是显着的过度杀伤,但为开发人员和用户提供了能够重新刷新Linux等功能.

ARM linux有ATAG(ARM TAG).你可以使用传统的linux命令行告诉linux启动信息,比如查找根文件系统的地址和ATAG.Atags是内存中的结构,我认为当你从引导加载程序分支到linux时,r0或类似的东西被设置为.一般概念虽然是芯片上电时,从ROM或RAM的靴子,如果准备RAM,使其随时使用,linux的可能想/需要从ROM到RAM中,根文件系统,如果单独复制,可能要被复制到ram中的其他地方.如果需要,ATAG准备告诉arm在哪里解压缩linux,以及在哪里找到命令行和/或在哪里找到像根文件系统这样的东西,一些寄存器准备作为传递给linux的参数,最后引导加载器分支到包含linux内核中入口点的地址.


gby*_*gby 6

您必须在硬件开始执行的地址处提供引导代码.

这通常是通过让硬件将某种闪存或引导ROM映射到引导地址并从那里开始运行来实现的.

请注意,在微控制器中,在启动时开始运行的代码具有非常艰难的寿命 - 没有硬件初始化,并且没有硬件我的意思是即使控制RAM访问的DDR控制器也不能正常工作......所以你的代码需要在没有RAM的情况下运行

在初始引导代码设置足够的硬件(例如设置RAM芯片,设置TLB等,程序MAC等)之后,您可以运行引导加载程序.

在某些系统中,初始引导代码只是引导加载程序的第一部分.在某些系统中,专用的引导代码会设置,然后从闪存中读取引导加载程序并运行它.

引导加载程序的工作是将内核/操作系统的映像带入RAM,通常来自闪存或网络(但也可以是与另一个板,PCI总线等共享内存,尽管这种情况更为罕见).一旦引导加载程序在RAM中具有内核/ OS二进制文件的映像,它可以选择解压缩它,并将控制(调用)内核/ OS映像的起始地址切换.

有时,内核/操作系统映像实际上是一个小的解压缩器和压缩内核的blob.

无论如何,最终结果是内核/ OS在RAM中可用,并且引导加载程序(可选地通过背负式解压缩器)已经将控制传递给它.

然后内核/操作系统开始运行,操作系统启动.