2009年11月26日 星期四

Before bootloader~

最近相當忙,Blog也荒廢了好一陣子,利用一點時間上來澆澆水

如同標題所提示的
一個 ARM 的系統在bootloader之前究竟有沒有事情可以做?

首先,一個系統必須先上電之後才會跑
那麼第一個跑到的程式碼是什麼?

刻板印象上,聽說CPU會跑去一個固定的位置去抓第一道指令,這個位置通常是一
個flash ROM裡頭放著bootloader,bootloader被執行之後,就會自己將kernel
載入,bla..bla..bla.....最後完成開機。(以上的印象在wince or Linux皆適用。)

那麼before bootloader不就應該什麼也沒有? 因為通電後就跑bootloader了不是嗎?
其實真實的過程並非如此單純,甚至還可以說相當兇險。

在進入到bootloader之前,大致上還可以細分成兩到三個

1) Collect Hardware Information
2) Run BootROM
3) Initialize Boot Device

1) 第一個動作是收集硬體的資訊,主要包含CPU跑多快?是哪種記憶體?跑多快?這個收集的
動作通常由硬體做,或者是固定的資料,所以通常非常快就結束。結束後,CPU這時候才
會真正被通上電源。

2) 上電之後,CPU其實不是去外部的flash ROM拿資料,而是在那內部自己本身的一個ROM
裡頭拿資料開始執行,這個ROM通常叫做BootROM。BootROM裡頭的程式就分析剛剛第一
的動作收集到的資訊,去做對應的工作,可能的工作例如
a) 設置程式執行的stack (需要用到CPU裡頭的SRAM or Cache)
b) 初始化DDR RAM(有些系統還是放在bootloader做)。

3) 一開始的初始化結束後,接著就可以初始化可能放置bootloader地方的device,例如
SATA/PCIE/外部FLASH ROM等等。這樣便可以到這幾個可能的位置去找到bootloader。

以上就是在進入到bootloader可能的動作,CPU會支援這樣的功能,原因是希望可以讓CPU
支援更多種的開機方式,例如可以用SPI Flash,或是接SATA Disk等等,這樣客戶在使用
這顆CPU的時候,可以選擇的boot device就比較多種類,甚至版子就可以省掉flash ROM
的cost直接把bootloader放到硬碟上。

以上粗略的解釋before bootloader的可能的動作,會說『可能』是因為各家做法多多少少
有些差異,但其實想達到的目的都是差不多的。

搜尋此網誌