【基础】ARM芯片上电取第一条指令流程
轉載:ARM上電啟動及Uboot代碼分析
網上關于ARM的bootloader(以Uboot為例)的啟動順序的資料有好多,但是對于Uboot的地址映射、體系結構級操作介紹很少,都是直接開始Start.s代碼的閱讀。本文擬詳細分析Uboot從上電,到第一條指令的執行,同時分析代碼對于cache、TLB等部件的操作過程。
以下內容以u-boot-2012.04.01源碼為例,從網上很容易下載該版本。
1 ARM上電取第一條指令流程
1.1 上電后的第一條指令在哪里?
首先明確:對于ARM芯片,啟動時pc值由CPU設計者規定,不同的ARM CPU有不同的值,例如S3C2440芯片上電后PC值被硬件設計者規定為0x0;其他ARM芯片不一定是0x0。
第一章講述的上電取第一條指令過程以S3C2440為例,該芯片是ARMv4T架構,其他芯片在原理上類似。
S3C2440的啟動時讀取的第一條指令是在內存0x00地址處,不管是從nand flash還是nor flash啟動。
但是上電后內存中是沒有數據的,那么0x00地址處的指令是如何放進去的?針對不同的flash(nandflash、norflash),操作方式是不同的,下面講述從nandflash和norflash啟動的不同流程。
?
1.1.1 ?norflash和nandflash的異同
nandflash:價格低,容量大,適合大容量數據存儲,地址線和數據線共用I/O線,所有信息都通過一條線傳送,類比于PC的硬盤,
norflash:價格貴,容量小,適合小容量的程序或數據存儲,類似硬盤,但是能在其中運行程序;有獨立地址線、數據線
sdram:主要用于程序執行時的程序存儲、執行或計算,類比于PC的內存;
?
綜上:norflash比較適合頻繁隨即讀寫的場合,通常用于存儲代碼并直接在其中運行。nandflash用于存儲資料。
只要知道以上大概區別就行。以下說明ARM從兩種flash啟動方式的異同。
?
1.1.1.1 ?ARM從nandFlash啟動
若從nandflash啟動,上電后nandflash控制器自動把nandflash存儲器中的0——4K內容加載到芯片內的起步石(Steppingstone,起步石這個機制是處理器中集成的功能,對程序員透明),即內部SRAM緩沖器中,同時把內部SRAM的起始地址設置為0x0(不同的CPU上電后的PC值不盡相同,對不同的CPU該值也不盡相同),然后把這段片內SRAM映射到nGCS0片選的空間,進而CPU開始從內部SRAM的0x0處開始取得第一條指令,該過程全部是硬件自動完成,不需要程序代碼控制。
或許你有個疑問,為什么不能直接把nandflash映射到0x0地址處?非要經過內部SRAM緩沖?
答案是,nandflash根本沒有地址線,沒法直接映射,必須使用SRAM做一個載體,通過SRAM把剩余的nandflash代碼(即剩余的uboot啟動代碼)復制到SDRAM中運行。
若想從nandflash啟動,那么uboot最核心的代碼必須放在前4k完成。這4k代碼要完成ARM CPU的核心配置以及將剩余的代碼拷貝到SDRAM中(若從norflash啟動則沒有4k這個大小的限制,但是還會在完成最主要的設置后進入SDRAM中運行)。
?
1.1.1.2 ARM從norflash啟動
若從norflash啟動,則norflash直接被映射到內存的0x0地址處(就是nGCS0,這里就不需要片內SRAM來輔助了,所以片內SRAM的起始地址不變,還是0x40000000),然后cpu從0x00000000開始執行(也就是在Norfalsh中執行)。
??????需要說明的是,uboot代碼段(.text段)起始位置必須是與上電后PC值一致,即編譯uboot時,TEXT_BASE宏必須設置成0x0?,反匯編uboot文件后,文本段第一條指令的地址也是0.
總結:
1、從norflash還是從nandflash啟動,是由ARM的OM1和OM0引腳組合決定
2、不管從norflash還是nandflash啟動,S3C2440上電后的pc值為0x0
3、如果某芯片上電后PC值不是0x0,假如是0x38ff0000,那么從norflash啟動時,硬件就要自動將其映射到0x38ff0000地址處;如果從nandflash啟動,那么硬件就要自動將nandflash中的前4K內容加載到0x38ff0000地址處。
總結
以上是生活随笔為你收集整理的【基础】ARM芯片上电取第一条指令流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那些好用的iOS开发工具
- 下一篇: 【面试】网易游戏面试题目整理及答案(3)