1、Bootloader移植
A、引導過程
三星的S5PC100為例
(1)、片內是有固化的程序負責第一級引導
bootloader也在外存上,首先得解決其運行的問題。片內是有固化的程序負責必要的硬件初始化工作,並把外部NANDFLASH或是NORFLASH、SD卡及其他設備上的bootloader的第一階段代碼運行起來。
(2)、Bootloader需要的必要功能
由於片內內存較小,所以得實現自搬移,搬移內核,並執行內核。
B、作用
(1)作必要的硬件初始化工作
CPU(SOC片子:設置時鐘、屏蔽中斷、關MMU等)
內存(外部內存,程序需要上內存才能運行,BOOLOADER必須能夠正確讀寫內存)
外存(BOOLOADER的工作是搬內核上內存,所以需要能夠讀寫外存)
(2)自搬移並搬移內核並給內核傳參
bootloader在外存上,其運行由片內固化程序引導,一般片內程序能讀寫的外存區域不大,所以bootloader僅僅有一部分能夠運行起來,這個先運行起來的代碼負責搬其他代碼上內存(其他代碼之於自搬移代碼是數據)。bootloader真正的工作代碼上了內存,就接管芯片,並把外存上的內核搬到內存上並執行,並傳參數給內核(bootloader 結束時要傳三個值給內核,通過r0 r1 r2三個寄存器。r0:CPUid,R1機器碼,r3:內核參數鏈表;r2必須有,r0一般u-boot是0,不用,r3也不用)。BOOLOADER傳給內核的啟動參數一般是寫死在內存偏移0x100的位置(ARM內核代碼寫死的),所以BOOLOADER負責向內存偏移0x100的位置寫入內核啟動參數。
C、ARM主流開源bootloader
u-boot、vivi、reboot等
D、u-boot兩個階段代碼
第一階段代碼:自搬移(必要的硬件初始化,完成對外存讀內核代碼到內存,移植難點,必須對硬件很熟悉,一般是匯編編寫的)
第二階段代碼:初始化相應設備及邏輯層代碼(命令、協議等,U-BOOT還支持文件系統),C代碼
第一階段代碼位置
S5PC100,u-boot-2012.10為例
arch\arm\cpu\armv7\start.S(有一定注釋,這個是移植時候的重點,不熟悉硬件不行)
鏈接腳本arch\arm\cpu\armv7\u-boot.lds(這個說明那些是代碼段,哪些代碼先放到數據段——被其自搬移,如果第一階段代碼添加了代碼,鏈接腳本也要改下)
第二階段代碼
\arch\arm\lib\board.c
這個就是u-boot自己把自己搬到內存上以後的代碼,C寫的,C入口函數隨著版本變化在變,這個版本的是board_init_f,從第一階段代碼可以看到,第一階段把u-boot其他代碼搬上內存後,就會跳轉到C入口,開始執行。
E、具體移植步驟
(1)選平台(一般芯片公司已經移植了主流bootloader代碼,只需要根據實際板子情況來修改相應代碼,主要是外存和外部內存)
頂層目錄下有個boards.cfg,向裡面添加:
板子名稱 體系平台 ARM核 板子名稱 公司名稱 SOC芯片
fsc100 arm armv7 fsc100 samsung s5pc1xx
上面就是在指定如下目錄需要編譯:
cpu/arm目錄
cpu/arm/arnv7目錄
cpu/arm/arnv7/s5pc1xx目錄
board/samsung/fsc100目錄
也可以寫進頂層目錄下的Makefile,示例如下:
fsc100_config: unconfig
@$(MKCONFIG) $(@:_config=) arm armv7 fsc100 samsung s5pc1xx
在U-BOOT頂層目錄執行
#make fsc100_config
這樣就是在決定應該編譯那些目錄,配置基本平台相關的目錄。
這時候就可以編譯一下了,目的如下:
(a)、檢驗環境(交叉編譯工具鏈安裝及相應的一些庫支持,u-boot不需要第三方庫支持,可能會涉及一些工具及相應編譯環境的庫缺失);
(b)、驗證平台選擇