uboot啟動過程理解
對於2440而言,啟動的方式不多。一般就是外界一個NAND FLASH ,2440內部有個NAND FLASH Controller,會自動把NAND FLASH的前4K拷貝到2440的片內SRAM。2440這個片內SRAM就是所謂的Stepping Stone剛好也是4K。 在製作啟動代碼時,就是uboot。一般會把uboot分為兩個部分,一般就會叫做BL1和BL2。 BL1和BL2兩者相加就是整個uboot。這兩個部分各有分工。 為了符合2440的特點,BL1的大小會被設定為4K,這4K需要完成的任務有: 1、配置好記憶體(對於2440來說,記憶體就是SDRAM)。 2、配置好記憶體後,將整個uboot搬運到SDRAM運行。 此時BL1的使命就完成了,接下來是BL2,他在SDRAM上運行,將FLASH上的OS也搬運到SDRAM運行。那麼整個boot的過程就完成了。 晶片換代升級,變成S5PV210,此時啟動的方式不想2440那麼單一了,如SD卡啟動,emmc啟動,USB啟動,等等啟動方式,其次外部的記憶體也不再是SDRAM這種簡單的記憶體了,而是DDR這種記憶體。所以一開始需要做的準備工作大大增加。 所以,S5PV210內部多了一個叫做IROM的東西,他的內部固化了一下程式,在上電之後IROM會啟動內部的程式,將外部的某些裝置進行簡單的初始化,如SD卡,emmc等。 內部的SRAM也從4k升級到了96k.就是為了滿足更複雜的配置要求。 那麼接下來,來看看三星官方推薦的uboot啟動過程和2440啟動過程類似,在上電的時候它會自動將外部的固定大小的程式拷貝到片內的SRAM。對於2440來講,這個大小是4K。而對於210來講這個大小是16K。 假設,我們現在選擇的是SD卡啟動,那麼我們的uboot當然會放到SD卡中。同理為了滿足,210的特性,uboot同樣會被分為兩個部分——BL1和BL2;BL1的大小當然就是16K。 那麼,在上電之後,這個16K會被自動的拷貝到片內的SRAM,這個過程由晶片內部的IROM完成(這個過程通常被稱之為BL0)。而此時片內的SRAM並沒有被填滿,還有80K的容量。 三星想,這80K的容量也夠BL2放的了。所以,按照三星設想,當BL1被載入到SRAM之後。 BL1開始運行,此時BL1的任務只要把BL2也搬運到SRAM就可以了。然後讓BL2去配置DDR, 並且將OS搬運到DDR運行。 也就是說,三星給BL1分配的任務是搬運BL2到SRAM;給BL2分配的任務是配置DDR並且搬運OS到DDR運行。 但是,在學校Uboot的過程中,發現Uboot並沒有採用三星推薦的啟動過程。原因是隨著Uboot的發展,Uboot的大小變得很大,遠超過了96K。就是說Uboot無法整個都放入片內的SRAM。那麼讓就不能採取三星的方式。 所以Uboot給BL1和BL2重新分配任務:(當然BL1的大小還只能是16K,這是應為IROM裡的程式是固定的,它只會將前16K的內容拷貝到SRAM。) Uboot將BL1委以重任,不僅需要將DDR配置好,還要將BL2搬運到DDR上運行。 BL2就只需要將OS搬運到DDR運行即可。 那麼,3星推薦的做法,和Uboot的做法他們的區別就出來的: 1、Uboot交給BL1的任務要比三星交給BL1的任務要多。他首先需要配置DDR,其次再將 BL2搬運到DDR運行。而三星交給BL1的任務,僅僅是將BL2搬運到片內的SRAM運行。 2、UBoot的方式,BL2是在DDR上啟動並執行,而三星的方式BL2是在片內的SRAM啟動並執行。 3、UBoot的方式,BL2隻需搬運OS到DDR;三星的方式,BL2需要先配置DDR,在將OS搬運到DDR。 總結: 1、SRAM他在晶片的內部,他可以直接存取,而無需初始化。而DDR,SDRAM這種外部 記憶體是需初始化的,需要我們寫一些配置程式,初始化之後才可以訪問。所以不管是 2440,還是210,還是intel。都遵循逐步啟動的過程。 2、對於2440來說,先需要將外部Flash的前4K內容載入到SRAM,然後通過在SRAM裡啟動並執行代碼 去初始化SDRAM,並搬運主體程式到SDRAM。 3、對於210來講也是這樣,會先將外部Flash的前16K內容拷貝到SRAM。 4、區分BL0 和BL1,BL2。BL0其實是固化在晶片內部的一段程式。而BL1和BL2是組成Boot的兩個部分 BL1的大小是必鬚根據晶片的特性設計的。對於2440來說你的BL1不應該超過4K,對於210來說BL1不應該超過16K。 5、我們自己寫boot的時候,也可以參照三星步驟,只要你的BL2不大於80K即可。 7、DDR或者是SDRAM會比片內的SRAM大很多倍,所以只要外部記憶體被初始化好了之後,很多東西(如BL2)一定程度上就不再受大小的限制了。