2011年6月20日 星期一

EFI OS Loaders

這個段落會討論一些特別的考慮有關OS Loader. OS Loader是一種特別的EFI程式, 負責轉換系統, 從firmware的環境轉到OS的環境. 為了要達成這樣的任務, 有一些重要的步驟需要掌握:

1. OS Loader必須要決定它會從哪裡載入. 這個決定可以允許OS Loader可以從相同的地方取得一些額外的檔案.

2. OS Loader必須要知道OS存在哪裡. 一般而言, OS會在HDD的分割區裡. OS存在的分割區可能無法符合EFI環境能夠使用的檔案系統.  在這個情況下, OS Loader只能夠像Block Device一樣只使用Block I/O來存取分割區. OS Loader接著會需要實做或載入File System Driver去存取在OS分割區上的檔案.

3. OS Loader必須要建立實體記憶體的記憶體對映(memory map of physical memory), 使OS Kernel可以知道記憶體要管理的東西. 系統中一些實體記憶體必須要保留一些區段讓OS Kernel無法存取, 所以OS loader必須使用EFI API去取得系統目前的記憶體對映.

4. OS會有一些儲存Boot Path的選項以及Boot Option, 用環境變數的形式存在非揮發的儲存裝置(nonvolatile storage)裡. OS Loader可能會需要使用到這些儲存在非揮發儲存裝置的環境變數, 此外, OS Loader可能會需要將這些環境變數傳給OS Kernel.

5. 下一個步驟是去呼叫ExitBootServices(), 這個呼叫可以由OS Loader或試OS Kernel來完成, 要特別注意的是必須要在呼叫這個Function之前, 要取得目前記憶體對映(Current Memory Map). 一旦呼叫了ExitBootServices(), 就再也沒有EFI Boot Service可以使用了. 在某些點, 呼叫ExitBootServices()之前或之後, OS Loader就會將控制權交給OS Kernel.

6. 最後, 呼叫ExitBootServices()之後, EFI Boot Service就無法再使用, 這表示一旦OS Kernel取得系統的控制權之後, OS Kernel就只會呼叫EFI Runtime Service. 下列可以找到OS Loader程式的完整列表. 在下列的程式片段中並沒有完成任何的錯誤檢查. OS Loader的範例程式呼叫了幾種EFI Library來做一些簡單的實作. 下列會秀出OS Loader自己的Device Path以及File Path. 它也秀出了OS Loader存在的記憶體位址, 以及使用了多少Bytes. 接著它載入了OSKERNEL.BIN到記憶體, 而OSKERNEL.BIN是從OS Loader相同的目錄中取得的.
接著會秀出數個Block Device的第一個Block. 第一個Block是Floppy Drive的FAT12 File System. 第二個是HDD的MBR(Master Boot Record). 第三個則是相同HDD的大FAT32分割區. 第四個是相同HDD的小FAT16分割區.
最後的步驟是秀出所有System Configuration Table, 系統目前記憶體對映的指標以及列出所有系統的環境變數.  然後最後OS Loader呼叫ExitBootServices().

1 則留言:

  1. "下列可以找到OS Loader程式的完整列"

    請問在哪裡? 沒有看到 source code。

    回覆刪除