X86架構下Linux啟動過程分析
1、X86架構下的從開機到Start_kernel啟動的整體過程
這個過程簡要概述為:
開機——>BIOS——>GRUB/LILO——>Linux Kernel
其執行的流程圖和重要函數例如以下圖所看到的:
2、載入Linux內核(基於X86)的內存布局圖
| |
0A0000 +--------------------------+
| Reserved for BIOS | Do not use. Reserved for BIOS EBDA.
09A000 +--------------------------+
| Command line |
| Stack/heap | For use by the kernel real-mode code.
098000 +--------------------------+
| Kernel setup | The kernel real-mode code.
090200 +--------------------------+ <--- __start函數開始運行地址
| Kernel boot sector | The kernel legacy boot sector.
090000 +--------------------------+ <--- header.S
| Protected-mode kernel | The bulk of the kernel image.
010000 +--------------------------+
| Boot loader | <- Boot sector entry point 0000:7C00
001000 +--------------------------+
| Reserved for MBR/BIOS |
000800 +---------------------------+
| Typically used by MBR |
000600 +--------------------------+
| BIOS use only |
000000 +--------------------------+
3、啟動
2、BIOS啟動引導階段
BIOS調用Bootloader來把操作系統的內核映像載入到系統RAM中。
(1)、當PC的電源打開後,80x86架構的cpu將自己主動進入實模式,並從地址0xFFFF0(CS:0xFFFF,IP:0x0)開始自己主動運行程序代碼,這個地址一般是BIOS的地址。
(2)、BIOS的首先進行POST(Power On Self Test即加電後自檢),檢測系統中一些關鍵設備是否存在和是否能正常工作,比如內存和顯卡等設備。
此時顯卡還沒有初始化,假設發現了一些致命錯誤,比如沒有找到內存或者內存有問題(此時僅僅會檢查640K常規內存),BIOS會直接控制喇叭發聲來報告錯誤,聲音的長短和次數代表了錯誤的類型。
(3)、然後物理地址0處開始初始化中斷向量(註意:這個BIOS的中斷向量非常重要。後邊的非常多和硬盤等的交互都是通過此中斷向量完畢的)。
(4)、此後。BIOS將啟動設備的第一個扇區(第0磁道第一個扇區被稱為MBR即主引導記錄,它的大小是512字節。裏面存放了用匯編語言編寫的預啟動信息、分區表信息、魔數0x55AA),讀入內存絕對地址0x7C00處。並跳轉到這個地址並運行。
事實上被拷貝到物理內存0x7C00處的內容就是Boot Loader,對於較早的內核不靠grub啟動的。它就是bootsect.S程序。而對於如今PC多數使用grub引導啟動的,就是lilo或者grub了。
3、Bootloader階段
Bootloader程序是為計算機載入(load)計算機OS內核的。bootloader程序通常位於硬盤上,被BIOS調用。用於載入內核。在PC機上常見的bootloader主要有grub和lilo等。
GRUB(GRand Unified Bootloader)是當前linux諸多發行版本號默認的引導程序。嵌入式系統上,最常見的bootloader是U-BOOT。這種bootloader一般位於MBR的最前部。
在linux系統中。bootloader也能夠寫入文件系統所在分區中。
比方,grub程序就很強大。
Gurb執行後。將初始化設置內核執行所需的環境。
然後載入內核鏡像。
grub磁盤引導全過程:
(1)stage1、grub讀取磁盤的第一個512字節的主引導記錄MBR。
(2)stage1.5、識別各種不同的文件系統格式,目的是為了grub能識別到文件系統。
(3)stage2、載入系統引導菜單(/boot/grub/menu.lst或grub.lst)。載入內核vmlinuz和RAM磁盤initrd。
4、Linux內核啟動過程
內核映像文件vmlinuz:包括有linux內核的靜態鏈接的可運行文件,傳統上,vmlinux被稱為可引導的內核鏡像。
vmlinuz是vmlinux的壓縮文件。
其構成包括:
1、第一個512字節的bootsect(第一個塊)
2、第二個是setup代碼,若幹不多個512字節(一會再說它多大)
3、保護模式下的內核代碼
bzImage文件:使用make bzImage命令編譯內核源碼。能夠得到採用zlib算法壓縮的zImage文件,即big zImage文件。
老的zImage解壓縮內核到低端內存,bzImage則解壓縮內核到高端內存(1M(0x100000)以上),在保護模式下運行。
bzImage文件由setup和vmlinux兩部分組成,setup是實模式下的代碼,vmlinux是保護模式下的代碼。詳細包括vmlinuz、bootsect.o、setup.o、解壓縮程序misc.o、以及其它一些相關文件(如 piggy.o)。
initramfs(或initrd)文件:initrd是initialized ram disk的意思。主要用於載入硬件驅動模塊。輔助內核的啟動,掛載真正的根文件系統。
X86架構下Linux啟動過程分析