我是一个从微控制器编程开始的新手。这里感兴趣的芯片是cortex A9。在复位或上电时,我的读数必须是0x0000000处的代码。尽管我的问题听起来可能太琐碎,但它们将有助于我正确地看待一些概念。
存储器地址0x0000000是否驻留在ROM中?从该地址读取代码后会发生什么?是否应该存在某种引导加载程序&如果是,那么引导加载程序应该位于什么地址&是否也应该驻留在ROM中?最后,内核在什么时候启动&内核代码驻留在哪里?
发布于 2011-07-18 01:37:00
ARM出售的是内核而不是芯片,这个地址上的内容取决于购买ARM内核并将其放入芯片的芯片供应商。不同的供应商、不同的芯片实现方式各不相同。
传统上,ARM将从地址零启动,更准确地说,复位异常向量位于地址零。与其他处理器系列不同,传统的ARM模型不是异常入口点的地址列表,而是ARM在该地址执行指令,这意味着您需要使用相对分支或加载pc指令。较新的cortex-m系列仅为thumb/thumb2 (它们不能执行ARM (32位)指令),使用传统的(非ARM)类地址列表,并且零地址不是异常向量,它是要加载到堆栈指针中的地址,然后重置第二个条目,依此类推。此外,皮质-m异常列表也不同,该系列有128个单独的中断,而传统的ARM有两个,快速和正常。最近有一个基于皮层-m的问题,或者可能被称为在thumb2臂上运行linux的thumb2问题。我认为cortex m的实现都是微控制器类芯片,只有数万字节的片上内存,基本上这些都不属于你所询问的类别。不管怎样,你问的是皮质-A9。
许多内核或所有内核都有启动选项,其中启动地址可以是0x00000000或类似于0xFFFF0000的备用地址。使用它对于ARM用户来说将是非常混乱的,但是它提供了例如在一个地址上具有rom而在另一个地址上具有ram的能力,从而允许您在从rom加电时引导,然后将例外表切换到ram中以用于运行时操作。你可能有一个芯片的核心可以做到这一点,但这取决于芯片供应商是使用这些核心功能的边缘,还是将它们硬连接到某些设置,而不是为您提供这种灵活性。
您需要查看有问题的芯片的数据表/文档。找出ARM核心的名称是什么,正如您提到的皮质-A9。理想情况下,你想知道版本以及r0p0之类的东西,然后去ARM的网站,找到TRM,该核心的技术参考手册。您还需要一份ARM ARM,ARM架构参考手册。在ARM ARM中描述了(传统的) ARM异常向量,以及相当多的信息。您还需要芯片供应商的文档,并查看他们的引导方案。一些人会在上电时将地址0指向引导prom,然后引导加载器将需要做一些事情,翻转寄存器中的一位,并且存储器控制器将地址0切换到ram。一些可能具有总是配置为ram的地址0,以及一些总是配置为rom的其他地址,例如0x80000000,并且芯片将在引导之前为您将一些项从rom复制到ram,或者芯片可能简单地具有复位向量的上电设置为到rom的分支,然后由引导加载器来修补向量表。正如你能想到的许多不同的方案,它很可能有人已经尝试过,所以你必须研究芯片供应商的文档或示例代码,以基本上理解你的rom问题的答案,这取决于,你必须与芯片供应商核实。
内核的ARM TRM应该描述内核上的背带选项(就像能够从备用地址引导),连接供应商实现的那些背带选项(如果有的话)。手臂不会真的像TRM那样进入到那个位置。然而,值得购买的供应商将拥有一些他们自己的文档和/或代码,这些文档和/或代码显示了他们基于rom的引导策略是什么。
对于一个注定要成为linux系统的系统,您将拥有一个引导程序,一些非linux代码(非常类似于您台式机/笔记本电脑上的bios ),它们将启动系统并最终启动linux。Linux将需要相当数量的存储器(相对于微控制器和其它公知的ARM实现),ram最终可能是sram或dram,并且引导加载器可能必须在启动linux之前初始化存储器接口。有一些流行的引导加载程序,比如redboot和uboot。这两个都很夸张,但都为开发人员和用户提供了一些功能,比如能够重新刷新linux等。
ARM linux有ATAG (ARM标签)。您既可以使用传统的linux命令行来告诉linux引导信息,比如查找根文件系统的地址,也可以使用ATAG。Atag是内存中的结构,我认为当你从引导加载程序分支到linux时,r0或类似的东西被设置为这种结构。但是,一般概念是芯片上电,从rom或ram引导,如果准备ram以使其可以使用,则linux可能想要/需要从rom复制到ram,根文件系统如果是分开的,则可能想要复制到ram中的其它地方。ATAG准备告诉arm在哪里解压linux,以及在哪里找到命令行和/或在哪里找到根文件系统之类的东西,一些寄存器准备作为传递给linux的参数,最后引导加载器分支到包含linux内核中入口点的地址。
发布于 2011-07-16 15:44:59
您必须在硬件开始执行的地址有可用的引导代码。
这通常通过让硬件将某种类型的闪存或引导ROM映射到引导地址并从那里开始运行来实现。
请注意,在微控制器中,在引导时开始运行的代码有一个相当艰难的生命-没有硬件初始化,我所说的没有硬件,我的意思是即使是控制对RAM的访问的DDR控制器也无法工作……因此,您的代码需要在没有RAM的情况下运行。
在初始引导代码设置了足够的硬件后(例如设置RAM芯片、设置TLB等、编程MACs等)您已经运行了引导加载器。
在某些系统中,初始引导代码只是引导加载程序的第一部分。在一些系统中,专用的引导代码设置内容,然后从闪存中读取引导加载程序并运行它。
引导加载程序的工作是将内核/OS的映像放入RAM中,通常是从闪存或网络(但也可以是与另一块板、PCI总线等共享内存,尽管这种情况比较少见)。一旦引导加载程序在RAM中获得了内核/OS二进制文件的映像,它可能会有选择地对其进行解压缩,并移交(调用)内核/OS映像的起始地址。
有时,内核/OS映像实际上是压缩内核的一个小的解压缩器和blob。
无论如何,最终结果是内核/OS在RAM中可用,并且引导加载程序(可选地通过piggy back解压缩器)已将控制权传递给它。
然后内核/ OS开始运行,OS启动。
https://stackoverflow.com/questions/6716071
复制相似问题