本文簡單介紹一下從我們按開機鍵到可以登入系統,這段時間系統和電腦硬體是怎麼一起工作的。既做為對自己知識的乙個總結整理,也可以給linux初級使用者做乙個入門介紹,高手請略過。
一般來說linux的啟動可以分成三個階段:bios階段,系統引導階段,系統啟動階段。
一、bios階段
bios(基本輸入輸出系統),是固化在電腦rom中的一段程式。這是安裝電腦前都已經固化好的。
對電腦有一些了解的同學應該都知道電腦是由cpu,記憶體,硬碟,顯示器等再加乙個鐵盒子封裝起來,而電腦的執行都是由cpu一條條指令執行並指揮著其他硬體一起協作來完成電腦的正常執行。
當我們按電腦開機鍵的時候,電腦的電源部件就會給cpu以及其他硬體上電,然後cpu開始執行第一條指令,而這第一條指令的位址就是bios所在的位址。也即bios是電腦中執行的第乙個程式,還在作業系統(linux,windows,osx等)之前。再說一下這個「位址」,cpu的指令位址是由cpu中的兩個暫存器來標識的(cs:ip),而cpu的硬體邏輯被設計成加電之後置cs為全f,置ip為全0,所以這個「位址」就是0xffff0(計算方法:cs × 16 + ip)
bios的主要功能是檢測電腦的基本硬體是否滿足執行要求,以及初始化硬體狀態、中斷向量表、中斷服務程式等。根據獲取的硬體資訊去載入可引導介質(目前都是硬碟)的首扇區(mbr)到記憶體中執行,並把控制權轉交給此程式,這樣就到了執行的第二個階段。
二、系統引導階段
mbr是乙個512位元組大小的對映,詳細資訊可以參考下圖(來自linux引導過程內幕):
bootloader: 引導程式
partition table: 硬碟分割槽資訊
magic number: mbr標識,正常值為:0xaa55
其實這裡的bootloader並不是引導程式的全部,而只是引導程式可執行的一小部分(因為mbr的空間太小裝不下整個引導程式)我們稱為第一階段引導程式,主要工作是為了載入引導程式的剩餘部分,稱其為第二階段引導程式。第二階段引導程式的主要功能就是載入作業系統,並將控制權轉交給核心。常見的引導程式有lilo,grub等。
三、系統執行啟動階段
linux核心**現在已經很是龐大,編譯好之後一般都還有5m左右,所以都是用bzimage方式壓縮。早期**的執行順序可以看linux引導過程內幕和linux啟動過程綜述。
本文寫作時核心已經3.17版本了,在新版本中:
1,核心**的入口是arch\x86\boot\header.s,此彙編**通過呼叫同目錄下的main.c中的main函式,從實模式(16位)轉換到保護模式(32位)。
2,protected_mode_jump(boot_params.hdr.code32_start, (u32)&boot_params + (ds() << 4));函式的呼叫會跳轉到
x86/boot/compressed/head_32.s中的startup_32標號處執行。此**會呼叫decompress_kernel函式解壓核心(bzimage)映像檔案。詳細的跳轉過程可以參考:linux kernel boot process
3,並跳轉到x86/kernel/head_32.s中的startup_32標號處執行。此**會呼叫i386_start_kernel函式,而i386_start_kernel會呼叫linux核心的主函式start_kernel。
注意:64位有相應的head_64.s彙編**。流程很類似。
4,將linux比作乙個應用程式的話,start_kernel就是linux的main函式。前面的那些**只是為了linux的執行而做的準備工作。在此函式中才開始我們熟悉的初始化核心各模組的動作,像鎖機制,程序排程,檔案系統等等的初始化工作。最後呼叫kernel_thread(kernel_init, null, clone_fs | clone_sighand);去執行linux系統下的第乙個程序「init」程序。
5,linux應用層的初始化都是由init呼叫啟動指令碼來完成的,最後呼叫乙個login的程序可以顯示我們的登入介面。這裡最常見的
init有
sysvinit, upstart, systemd。
linux系統啟動
本文簡單介紹一下從我們按開機鍵到可以登入系統,這段時間系統和電腦硬體是怎麼一起工作的。既做為對自己知識的乙個總結整理,也可以給linux初級使用者做乙個入門介紹,高手請略過。一般來說linux的啟動可以分成三個階段 bios階段,系統引導階段,系統啟動階段。一 bios階段 bios 基本輸入輸出系...
Linux系統啟動
1.系統啟動流程大概 1 啟動bios 2 mbr中的引導 bootcode 3 執行引導程式 linux中用的最多的是grub 引導程式的主要作用是用來載入核心 4 載入系統核心 5 執行init 6 runlevel init根據當前預設的執行級別來啟動相關的程式及裝置 2.bios basic...
linux 系統啟動
系統啟動流程 我們稱之為基本輸入輸出系統,一般儲存在主機板上的bios晶元中,負責檢查硬體並且查詢可啟動裝置 可設定啟動順序 如果乙個裝置是可啟動,那麼第乙個扇區512位元組的最後兩位元組是55aa mbr bios找到可啟動裝置後執行其引導 引導 為第一扇區的前446位元組 功能 載入乙個更複雜的...