1. 程式人生 > >X86架構下Linux啟動過程分析

X86架構下Linux啟動過程分析

重要 ack csdn 檢查 point article span 註意 eap

1X86架構下的從開機到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、啟動

2BIOS啟動引導階段

BIOS調用Bootloader來把操作系統的內核映像載入到系統RAM中。

(1)、當PC的電源打開後,80x86架構的cpu將自己主動進入實模式,並從地址0xFFFF0(CS0xFFFFIP0x0)開始自己主動運行程序代碼,這個地址一般是BIOS的地址。
(2)、BIOS的首先進行POSTPower 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了。

3Bootloader階段

Bootloader程序是為計算機載入(load)計算機OS內核的。bootloader程序通常位於硬盤上,被BIOS調用。用於載入內核。在PC機上常見的bootloader主要有grub和lilo等。
GRUBGRand Unified Bootloader)是當前linux諸多發行版本號默認的引導程序。嵌入式系統上,最常見的bootloaderU-BOOT。這種bootloader一般位於MBR的最前部。

linux系統中。bootloader也能夠寫入文件系統所在分區中。

比方,grub程序就很強大。

Gurb執行後。將初始化設置內核執行所需的環境。

然後載入內核鏡像。

grub磁盤引導全過程:

1stage1、grub讀取磁盤的第一個512字節的主引導記錄MBR

(2stage1.5、識別各種不同的文件系統格式,目的是為了grub能識別到文件系統。

3stage2、載入系統引導菜單(/boot/grub/menu.lstgrub.lst)。載入內核vmlinuzRAM磁盤initrd

4Linux內核啟動過程

內核映像文件vmlinuz:包括有linux內核的靜態鏈接的可運行文件,傳統上,vmlinux被稱為可引導的內核鏡像。

vmlinuzvmlinux的壓縮文件。

其構成包括:

1第一個512字節的bootsect(第一個塊)

2第二個是setup代碼,若幹不多個512字節(一會再說它多大)

3保護模式下的內核代碼
bzImage文件:使用make bzImage命令編譯內核源碼。能夠得到採用zlib算法壓縮的zImage文件,即big zImage文件。

老的zImage解壓縮內核到低端內存,bzImage則解壓縮內核到高端內存(1M0x100000)以上),在保護模式下運行。

bzImage文件由setup和vmlinux兩部分組成,setup是實模式下的代碼,vmlinux是保護模式下的代碼。詳細包括vmlinuzbootsect.osetup.o、解壓縮程序misc.o、以及其它一些相關文件(如 piggy.o)。

initramfs(initrd)文件:initrdinitialized ram disk的意思。主要用於載入硬件驅動模塊。輔助內核的啟動,掛載真正的根文件系統。

X86架構下Linux啟動過程分析