1. 程式人生 > >計算機/linux啟動過程

計算機/linux啟動過程

cut block 系統文件 常見 基於 告訴 設置 不能 數字

開機過程指的是從打開計算機電源直到LINUX顯示用戶登錄畫面的全過程。

分析LINUX開機過程也是深入了解LINUX核心工作原理的一個很好的途徑。

計算機開機過程是一個非常復雜的過程,想真正理解透徹並不容易。

計算機啟動是一個很矛盾的過程:必須先運行程序,然後計算機才能啟動,但是計算機不啟動就無法運行程序!

早期真的是這樣,必須想盡各種辦法,把一小段程序裝進內存,然後計算機才能正常運行。

先了解下BIOS是什麽?

BIOS是英文"Basic Input Output System"的縮略詞,直譯過來後中文名稱就是"基本輸入輸出系統"。其實,它是一組固化到計算機內主板上一個ROM芯片上的程序

BIOS系統文件是存在ROM芯片上的,但是BIOS設置信息是存儲在RAM的,斷電會丟失。這個RAM一般在主板邊緣有一個長約一厘米的長方形相片,可以拔差。

技術分享圖片

1、BIOS自檢,按硬盤啟動順序,進入操作系統所在的硬盤

計算機通電之後,首先從主板上讀取BIOS。

BIOS程序首先檢查,計算機硬件能否滿足運行的基本條件,這叫做"加電自檢"(Power-On Self-Test),縮寫為POST。
如果硬件出現問題,主板會發出不同含義的蜂鳴,啟動中止。如果沒有問題,屏幕就會顯示出CPU、內存、硬盤等信息。

技術分享圖片

自檢完成後,BIOS把控制權轉交給下一階段的啟動程序。
這時,BIOS需要知道,"下一階段的啟動程序"具體存放在哪裏?到底是光驅,普通硬盤,固態硬盤,U盤裏面的哪一種?
打開BIOS的操作界面,裏面有一項就是"設定啟動順序"。

技術分享圖片

2、讀取MBR(主引導記錄 Master boot record),找到操作系統

找到第一個硬盤之後,計算機就開始讀取該硬盤上的MBR主引導記錄。他會告訴計算機應該去到硬盤上哪個位置才能找到操作系統

MBR指的是硬盤上第0磁道第一個扇區,它的大小是512字節,它由三個部分組成:
  (1) 第1-446字節: 引導(PRE-BOOT)區,調用操作系統的機器碼。找到標記為活動(ACTIVE)的分區,並將活動分區的引導區讀入內存。
  (2) 第447-510字節:分區表(Partition table)。記錄硬盤的分區信息
  (3) 第511-512字節:主引導記錄簽名(0x55和0xAA)。最後兩個字節是0x55和0xAA,表明這個設備可以用於啟動;如果不是,表明設備不能用於啟動,控制權於是被轉交給"啟動順序"中的下一個設備。

分區表
硬盤分區有很多好處。考慮到每個區可以安裝不同的操作系統,"主引導記錄"因此必須知道將控制權轉交給哪個區。
分區表的長度只有64個字節,裏面又分成四項,每項16個字節。所以,一個硬盤最多只能分四個一級分區,又叫做"主分區"。
每個主分區的16個字節,由6個部分組成:
  (1) 第1個字節:如果為0x80,就表示該主分區是激活分區,控制權要轉交給這個分區。四個主分區裏面只能有一個是激活的。
  (2) 第2-4個字節:主分區第一個扇區的物理位置(柱面、磁頭、扇區號等等)。
  (3) 第5個字節:主分區類型。
  (4) 第6-8個字節:主分區最後一個扇區的物理位置。
  (5) 第9-12字節:該主分區第一個扇區的邏輯地址。
  (6) 第13-16字節:主分區的扇區總數。
最後的四個字節("主分區的扇區總數"),決定了這個主分區的長度。也就是說,一個主分區的扇區總數最多不超過2的32次方。
如果每個扇區為512個字節,就意味著單個分區最大不超過2TB。再考慮到扇區的邏輯地址也是32位,所以單個硬盤可利用的空間最大也不超過2TB。如果想使用更大的硬盤,只有2個方法:一是提高每個扇區的字節數,二是增加扇區總數。

3、加載啟動管理器bootloader,選擇進入哪個操作系統

系統找到BIOS所指定的硬盤的MBR後,就會將其復制到0×7c00地址所在的物理內存中。其實被復制到物理內存的內容就是啟動管理器Boot Loader,而具體到不同的操作系統,拿linux來說,常見的就是grub了。

技術分享圖片

這時,計算機的控制權就要轉交給硬盤的某個分區了,這裏又分成三種情況。
3.1 情況A:卷引導記錄
上一節提到,四個主分區裏面,只有一個是激活的。計算機會讀取激活分區的第一個扇區,叫做"卷引導記錄"(Volume boot record,縮寫為VBR)。
"卷引導記錄"的主要作用是,告訴計算機,操作系統在這個分區裏的位置。然後,計算機就會加載操作系統了。
3.2 情況B:擴展分區和邏輯分區
隨著硬盤越來越大,四個主分區已經不夠了,需要更多的分區。但是,分區表只有四項,因此規定有且僅有一個區可以被定義成"擴展分區"(Extended partition)。
所謂"擴展分區",就是指這個區裏面又分成多個區。這種分區裏面的分區,就叫做"邏輯分區"(logical partition)。
計算機先讀取擴展分區的第一個扇區,叫做"擴展引導記錄"(Extended boot record,縮寫為EBR)。它裏面也包含一張64字節的分區表,但是最多只有兩項(也就是兩個邏輯分區)。
計算機接著讀取第二個邏輯分區的第一個扇區,再從裏面的分區表中找到第三個邏輯分區的位置,以此類推,直到某個邏輯分區的分區表只包含它自身為止(即只有一個分區項)。因此,擴展分區可以包含無數個邏輯分區。
但是,似乎很少通過這種方式啟動操作系統。如果操作系統確實安裝在擴展分區,一般采用下一種方式啟動。
3.3 情況C:啟動管理器
在這種情況下,計算機讀取"主引導記錄"前面446字節的機器碼之後,不再把控制權轉交給某一個分區,而是運行事先安裝的"啟動管理器"(boot loader),由用戶選擇啟動哪一個操作系統。
Linux環境中,目前最流行的啟動管理器是Grub。

4、加載內核

進入操作系統後,首先將內核加載到內存。
以Linux系統為例,先載入/boot目錄下面的kernel。

技術分享圖片

內核加載成功後,根據grub設定的內核映像所在路徑,系統讀取內存映像,並進行解壓縮操作。此時,屏幕一般會輸出“Uncompressing Linux”的提示。當解壓縮內核完成後,屏幕輸出“OK, booting the kernel”。

系統將解壓後的內核放置在內存之中,並調用start_kernel()函數來啟動一系列的初始化函數並初始化各種設備,完成Linux核心環境的建立。至此,Linux內核已經建立起來了,基於Linux的程序應該可以正常運行了。

 

5、用戶層init依據inittab文件來設定運行等級

內核被加載後,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,並依據此文件來進行初始化工作。

其實/etc/inittab文件最主要的作用就是設定Linux的運行等級,它表明Linux需要運行在等級3上。

[root@localhost] ~$ cat /etc/inittab 
id:3:initdefault:

6、init進程執行rc.sysinit

在設定了運行等級後,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它做的工作非常多,包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啟動swap分區、設定/proc等等。如果你有興趣,可以到/etc/rc.d中查看一下rc.sysinit文件。

線程init的最終完成狀態是能夠使得一般的用戶程序可以正常地被執行,從而真正完成可供應用程序運行的系統環境。它主要進行的操作有:

  · 設置網絡環境/etc/sysconfig/network,如主機名,網關,IP,DNS等。

  · 掛載/proc。此文件是個特殊文件,大小為0,因為它是在內存當中。裏面東東最好別刪。

  · 根據內核在開機時的結果/proc/sys/kernel/modprobe。開始進行周邊設備的偵測。

  · 載入用戶自定義的模塊/etc/sysconfig/modules/*。modules

  · 讀取/etc/sysctl。conf文件對內核進行設定。

  · 設定時間,終端字體,硬盤LVM或RAID功能,以fsck進行磁盤檢測。

  · 將開機狀況記錄到/var/log/dmesg中。(可以用命令dmesg查看結果)

至此,init()函數結束,Linux內核的引導 部分也到此結束。

7、啟動內核模塊

具體是依據/etc/modules.conf文件或/etc/modules.d目錄下的文件來裝載內核模塊。

8、執行不同運行級別的腳本程序

根據運行級別的不同,會有不同的服務啟動。到/etc/rc.d目錄中,不同的level會有不同的目錄。其中,S(start)開頭的表明開機啟動,K(kill)開頭的表明開機不啟動。數字表示啟動順序。數字越小,啟動越早。

技術分享圖片

9、執行/etc/rc.d/rc.local

你如果打開了此文件,裏面有一句話,讀過之後,你就會對此命令的作用一目了然:

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don’t

# want to do the full Sys V style init stuff.

rc.local就是在一切初始化工作後,Linux留給用戶進行個性化的地方。你可以把你想設置和啟動的東西放到這裏。

10、執行/bin/login程序,進入登錄狀態

此時,系統已經進入到了等待用戶輸入username和password的時候了,你已經可以用自己的帳號登入系統了。

 

技術分享圖片 

1、加電後從主板讀取BIOS程序,找到啟動硬盤。

2、從硬盤上讀取MBR主引導記錄(硬盤的第一個扇區)

3、從MBR主引導記錄上讀取boot loader啟動管理器(grub)

4、加載內核,執行第一個程序/sbin/init

5、 運行環境初始化。

6、啟動系統服務

  

 

參考

http://blog.csdn.net/bailyzheng/article/details/7485105

http://blog.csdn.net/bailyzheng/article/details/7485105

http://www.ruanyifeng.com/blog/2013/02/booting.html

計算機/linux啟動過程