2011-07-16 92 views
6

我是一個從微控制器編程開始的新手。這裏感興趣的芯片是cortex-a9。在重置或加電時,我的讀數必須有0x0000000的代碼。我的問題雖然聽起來可能太微不足道,但能幫助我理解一些概念。cortex a9引導和內存

內存地址0x0000000是否駐留在ROM中? 從該地址讀取代碼後會發生什麼? 如果存在某種類型的引導加載程序&如果是這樣的話應該在&這個地址應該是否也駐留在ROM中? 最後,內核在什麼時候啓動&內核代碼駐留在哪裏?

回答

6

你必須在硬件開始執行的地址有可用的啓動代碼。

這通常通過讓硬件將某種閃存或引導ROM映射到引導地址並從那裏開始運行來完成。

請注意,在微控制器中,啓動時運行的代碼具有相當艱難的生活 - 沒有硬件初始化,而且沒有硬件,我的意思是即使是控制RAM訪問的DDR控制器也沒有工作。 ..所以你的代碼需要運行沒有RAM。

在初始引導代碼設置足夠的硬件(例如設置RAM芯片,設置TLB等,編程MAC等)之後,您將啓動引導加載程序。

在某些系統中,初始引導代碼只是引導加載程序的第一部分。在某些系統中,一個專用的啓動代碼設置了一些東西,然後從閃存中讀取引導裝載程序並運行它。

引導加載程序的工作是將內核/操作系統的映像帶入RAM,通常來自閃存或網絡(但也可以與其他板,PCI總線等共享內存,儘管這種情況更爲罕見) 。一旦引導加載程序在RAM中具有內核/ OS二進制文件的映像,它可以選擇將其解壓縮,並將控制權交給內核/操作系統映像的起始地址。

有時,內核/操作系統映像實際上是一個小的解壓縮程序和壓縮內核的blob。

無論如何最終的結果是,內核/ OS是在RAM和引導裝載程序可用,可選擇通過揹負解壓縮,已通過控制它。

然後內核/ OS開始運行,操作系統啓動。

8

ARM銷售內核而不是芯片,該地址駐留的內容取決於已購買ARM內核並將其放入芯片的芯片供應商。芯片之間的實現因供應商而異。

傳統上,ARM將從地址0開始引導,更正確地說,復位異常向量位於地址零。不像其他的處理器系列,傳統的ARM模式不是例外入口點的地址的列表,而是ARM的執行在該地址,這意味着你需要使用一個相對分支或加載PC指令指令。較新的Cortex-M系列,它們是唯一的拇指/的Thumb2(它們不能執行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指向boot boot,然後bootloader需要做一些事情,在寄存器中翻轉一下,然後內存控制器將地址0切換到ram。有些可能會將地址0始終配置爲ram,而其他地址則始終配置爲rom,例如0x80000000,並且芯片會在引導之前將某些項從ROM複製到RAM,或者芯片可能只是上電將復位向量設置爲分支到ROM,然後由引導加載程序修改向量表。儘管您可以想到很多不同的方案,但可能有人已經嘗試過,所以您必須研究芯片供應商文檔或示例代碼以瞭解基本上針對您的ROM問題的答案,是否取決於您,並且必須檢查芯片供應商。

核心的ARM TRM應描述核心上的帶選項(如可從備用地址引導),連接供應商實現的帶選項(如果有)。 ARM ARM實際上並不像TRM那樣。值得購買的供應商將擁有一些自己的文檔和/或代碼,以顯示基於ROM的啓動策略。

對於一個註定要成爲linux系統的系統,您將擁有一個引導加載程序,一些非Linux代碼(非常類似於臺式機/筆記本電腦上的BIOS),可以啓動系統並最終啓動Linux。 Linux將需要相當數量的內存(相對於微控制器和其他衆所周知的ARM實現),該內存最終可能是sram或dram,並且引導加載程序可能必須在啓動linux之前初始化內存接口。有一些流行的引導程序,如redboot和uboot。這兩個都是顯着的矯枉過正,但爲開發人員和用戶提供功能,如能夠重新刷新linux等。

ARM linux有ATAGs(ARM TAGs)。您可以使用傳統的linux命令行來告訴linux啓動信息,如尋找根文件系統的地址,以及ATAG。 Atags是內存中的結構,我認爲r0或類似的東西是從bootloader分支到linux時設置的。一般的概念雖然是芯片上電,從ROM或RAM啓動,如果準備RAM以便它可以使用,Linux可能需要/需要從ROM複製到RAM,根文件系統,如果單獨,可能需要被複制到公羊的其他地方。如果需要的話,ATAG準備告訴arm在哪裏解壓縮linux,以及在哪裏找到命令行,或者在哪裏找到根文件系統等東西,一些寄存器準備好作爲傳遞給linux的參數,最後bootloader分支到該地址包含linux內核中的入口點。