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 之間,最...