關於 U-Boot 的程式進入點,我以 SMDK2410 平臺為例來說明。首先,在每張 board 的目錄下,都會有一個 linker script,程式的整體進入點可以閱讀此檔案得知。以 SMDK2410 來說,我們應該由 <U-Boot>/board/smdk2410/u-boot.lds 檔案看起,以下是其內容節錄:
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
*(.text)
}
在 linker script 的 SECTIONS 命令區塊中,.text section 一開始被放進 <U-Boot>/cpu/arm920t/start.o 檔,所以能了解到此檔案是整個 U-Boot 程式的進入點。因此,「整體的 U-Boot 啟動流程,是由 <U-Boot>/cpu/arm920t/start.o 檔案開始的」,start.o 是 U-Boot for ARM9 整個程式碼中,唯一的 assembly code,其原始程式的檔名為 start.S。
所以,由 <U-Boot>/cpu/arm920t/start.S 開始研讀,是了解 U-Boot 整個執行過程的起始點。另外,附帶一提,就概念上來說,start.S 最主要的工作是:
- 設定中斷向量表
- 設定 processor
- Initialization Sequence
- Relocation
因此,我們把 start.S 也稱為「hardware bring-up code」,而且是「前期」的硬體帶動碼(bring-up code)。在 U-Boot 的 cpu/ 目錄下,可以看到 U-Boot 為各種不同的處理器所撰寫的 bring-up code,可見 U-Boot 真的是一個「萬用 bootloader」。
下篇日記,我將會分享 start.S 的研讀筆記,歡迎對 U-Boot 有興趣的朋友來信指教。
--jollen

評論 (2)
寫得真好. Thank you.
由 匿名 | April 22, 2008 2:51 PM
發表於 April 22, 2008 14:51
謝謝您無私的分享,
我是個初學者,
剛剛學 u-boot,
不過對您說的有點疑問,
跟據 ld 的 manual (http://sourceware.org/binutils/docs/ld/Entry-Point.html#Entry-Point)
似乎不一定是第一個 .text 就是進入點,
就您的例子來說,好像是 _start symbol 的地方
不知您的看法呢?
謝謝!
由 lcm82 | November 11, 2008 6:31 PM
發表於 November 11, 2008 18:31