X86架構下Linux啟動過程分析

2021-06-23 02:57:22 字數 3788 閱讀 7189

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 +--------------------------+

|  kernel boot sector    | the kernel legacy boot sector.

090000 +--------------------------+

|  protected-mode kernel | the bulk of the kernel image.

010000 +--------------------------+

|  boot loader    |

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架構系統啟動過程

x86結構下作業系統啟動 計算機加電後,段暫存器cs 0xf000h,指令指標暫存器eip fff0h,在cs暫存器中隱含的乙個基址base ffff0000h,80386中實際位址是base eip ffff0000h 0000fff0h fffffff0h 在8086中最初執行的位址是pc 16...

X86啟動過程分析

一直對計算機的啟動過程不甚清楚,總是一知半解。這幾天蒐集一些這方面的資料,通過學習對啟動過程有個更深入的了解。通常情況下,我們的系統裝在磁碟上。而cpu是不能夠直接訪問磁碟的,必須將磁碟上的內容讀入記憶體後才能被cpu訪問。那麼計算機是如何啟動並執行作業系統 的呢?這裡必定存在乙個將磁碟上的 載入到...

x86的啟動過程

1.上電,首先執行ljmp 0xf000,0xe05b 即位址0xffff0,調轉到bios,開始 執行bios bios負責pci,顯示卡之類裝置的初始化,並把可啟動裝置 軟盤,硬碟,光碟 的引導扇區boot loader 第乙個sector 拷貝到記憶體位址 0x7c00 0x7dff 之間,最...