at91sam系列的arm內建了一片bootrom, 如果選擇了合適的bms電平(高電平), 那麼晶元啟動後會將bootrom對映到0x0位址. 啟動bootrom後會從外面的的nvm(dataflash, nandflash..)中去尋找是否存在"合法"的韌體程式. 如果有就將這個韌體拷貝到內部sram中來執行. 而這個韌體程式我們一般放置的就是bootstrap. 再由它去完成u-boot和kernel等等的搬移.
順序如下: bootrom (rom) -> bootstrap (sram) -> u-boot (sdram) -> kernel (sdram)
對於dataflash和nandflash的nvm, atmel很巧妙的將第6個向量處放置的內容當做bootstrap的大小.但是開啟at91bootstrap的原始碼, 發現第6個向量處有2種寫法. 1) b . (或弄乙個標號, 跳轉本身) 2) .word _edata 第一種是直接放了一跳arm跳轉本身的指令在此位置, 轉換為機器碼之後是乙個非常大的數. 遠遠超出了sram的大小. 第二種是用了彙編器的乙個預留關鍵字_edata, 它是指向資料段的結尾. 按道理應該是和編譯出來的bin同樣大小才對. 但是自己通過將bin檔案開啟檢視第6個向量確不相等. 後來才覺悟是由於基位址並不是0x0導致, 由於bootstrap最終是在sram裡執行, 以sam9260為例,sram基位址是0x20000. 所以是_edata=0x20000+程式大小,還是無法滿足要求. 這兩種方式都不正確,那bootrom是怎麼知道要拷貝多大的長度呢?我一開始猜想是不超過最大的長度就ok了,即sram大小減去bootrom程式本身所需的堆疊,這是乙個合理的解釋,不過實際操作起來會浪費很多時間。而真正的內幕是: 原來sam-ba軟體中有乙個send boot file的操作,這個操作暗地裡讀取檔案大小將其寫入第六個向量再寫入0位址,所以bootstrap必須用sam-ba的send boot file的方式燒寫,如果自己從0位址send file是啟動不了的,大家可以做實驗驗證。(其實在iar下也有相應的flashloader可以支援,但是一般沒有人用) over
ARM9 Bootloader的啟動流程
bootloader啟動大多數都分為兩個階段.第乙個階段主要包含依賴於cpu的體系結構硬體初始化的 通常都用組合語言來實現。這個階段的任務有 1 基本的硬體裝置初始化 遮蔽所有的中斷 關閉處理器內部指令 資料cache等 2 為第二階段準備ram空間。3 如果是從某個固態儲存煤質中,則複製bootl...
uboot啟動流程概述 uboot啟動流程
u boot系統啟動流程 大多數bootloader都分為stage1和stage2兩大部分,u boot也不例外。依賴於cpu體系結構的 如裝置初始化 等 通常都放在stage1,且可以用組合語言來實現,而stage2則通常用c語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。2.1...
activity啟動流程 App啟動流程三問
裡面涉及到哪些重要的成員呢?都分別負責了什麼,比如ams?啟動流程了解後,對我們開發有什麼幫助呢?1 比如啟動優化,分析啟動過程,其實可以優化啟動速度的地方有三個地方 activity的oncreate方法,同樣進行執行緒處理,懶載入。或者預建立activity,提前類載入等等。2 又比如外掛程式化...