啟動過程這塊內容還蠻多的,因此得慢慢來分析,在此之前我也收集到了很多資料,這裡將這些整理加上自己的一些理解。好不容易啊,總算開始核心原始碼之旅了,我們要珍惜這來之不易的這個時刻。
要得到核心結構,我們有很多種方法,比如查看kbuild Makefile、Documentation,但是我選擇了在網路上找,因為我們關注的重點是在於怎麼分析原始碼,特別是後面要分析裝置驅動那塊。
我
們以bzImage大核心映像為例,它由setup.elf和vmlinux組成,而vmlinux又由二進位檔案setup.bin和
vmlinux.bin組成,而vmlinux.bin會進行壓縮儲存,變成vmlinux.bin.gz。因此bzImage有三部分組成
setup.elf、setup.bin、vmlinux.bin.gz。
在來看看它們的分布圖,這裡用文字描述:
0x00007c00 -- BootLoader 載入程式,位於硬碟的MBR中
0x00090000 -- 0x00090000 -- setup.elf的開機磁區512B
0x00090200 -- setup.elf的setup部分
0x00100000 -- vmlinux
(這是大核心)
現在在來簡單介紹一下各個部分:
1、BootLoader:
PC機的Boot Loader遵從linux引導協議2.03,PC 機中的引導載入程式由 BIOS(位於主板flash
rom中的固化程式)和位於硬碟 MBR 中的作業系統Boot Loader(如LILO 和 GRUB 等)組成。BIOS
在完成硬體檢測和資源分派後,將硬碟 MBR 中的 Boot Loader 讀到系統的 RAM 中,然後將控制權交給作業系統Boot
Loader。Boot Loader將核心映象從硬碟上讀到 RAM 中,然後跳轉到核心的進入點去運行,也即開始啟動作業系統。
2、setup.elf:
分為開機磁區和setup扇區,第一部分開機磁區(bootsect)為bzImage前512位元組,以前的版本用於從磁碟片啟動引導Linux部分。目前的版本不支援將它用於從磁碟片引導,
否則,將列印錯誤資訊"Direct booting from floppy is no longer
supported.",這將在代碼中看到。第二部分為setup扇區,是從512個位元組開始的程式,它運行在實模式下,為保護模式的Linux核心啟動準備環境。這個部分最後會切換進入保護模式,跳轉到保護模式的核心執行,也就是0x10000的vmlinux處。
3、vmlinux:
這部分是進入保護模式後的代碼部分,由解壓程式和核心映像壓縮包組成。
好
了,核心映像的結構和被載入入記憶體的結構有一個感性認識後,對我們討論後面的內容會有很大的協助,後面就是原始碼分析來瞭解啟動全過程,這樣的認識會更加
的深刻。希望我們能克服困難走到最後。我會加快分析的步伐,你也一樣,最好將一些重要的東西和我分享,我們共同進步,這樣的學習才是最和諧和快樂的。