歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 理解Linux的啟動過程(一)

理解Linux的啟動過程(一)

日期:2017/2/25 10:38:05   编辑:Linux教程

  從按下PC電源,到出現熟悉的bash提示符"$"或進入漂亮的KDE/GNOME桌面,這是我們每天開機必經的過程。那麼,在這短短幾十秒內,Linux是怎樣啟動的呢?本文介紹Linux的啟動過程。

  平台:PC機, Ubuntu 5.10

  基礎知識

  BIOS (Basic I/O System,基本輸入/輸出系統)

  BIOS,完整地說應該是ROM-BIOS,是只讀存儲器基本輸入/輸出系統的簡寫,它實際上是被固化到計算機中的一組程序,為計算機提供最低級的、最直接的硬件控制。准確地說,BIOS是硬件與軟件程序之間的一個“轉換器”或者說是接口(雖然它本身也只是一個程序),負責解決硬件的即時需求,並按軟件對硬件的操作要求具體執行。

  從功能上看,BIOS分為三個部分:

  1.自檢及初始化程序;

  2.硬件中斷處理;

  3.程序服務請求。

  這裡我們主要關注第一部分——自檢及初始化程序:這部分負責啟動計算機,具體有三個部分,第一個部分是用於計算機剛接通電源時對硬件部分的檢測,也叫做加電自檢(POST),功能是檢查計算機是否良好,例如內存有無故障等。第二個部分是初始化,包括創建中斷向量、設置寄存器、對一些外部設備進行初始化和檢測等,其中很重要的一部分是BIOS設置,主要是對硬件設置的一些參數,當計算機啟動時會讀取這些參數,並和實際硬件設置進行比較,如果不符合,會影響系統的啟動。

  最後一個部分是引導程序,功能是引導DOS或其他操作系統。BIOS先從軟盤或硬盤的開始扇區讀取引導記錄,如果沒有找到,則會在顯示器上顯示沒有引導設備,如果找到引導記錄會把計算機的控制權轉給引導記錄,由引導記錄把操作系統裝入計算機,在計算機啟動成功後,BIOS的這部分任務就完成了。

  關於BIOS的詳細介紹,可以google一下,這篇文章就不錯。

  硬盤

  就物理組成來說,一個硬盤封裝裡有多個盤片(platter),每個盤面有兩個面(surface)。在盤片上都有一個磁頭(head)來進行硬盤盤片的讀/寫,盤片繞軸(spinder)旋轉一周時磁頭所走過的軌跡即磁道(track),所有盤片的同一磁道構成了磁柱(cylinder)。磁道又被分為多個扇區(sector),扇區是最小的磁盤存儲單位,即硬盤分區時的最小單位——通常為512KB。磁道由縫隙(gap)分開,gap中存儲的不是數據位,而是用來確認扇區的格式位。

  MBR

  主引導扇區(MBR, Master Boot Recorder)是硬盤中最重要的部分,它記錄了硬盤的分區信息、引導信息。CU上面有一篇介紹MBR的文章。

  注意這裡所說的MBR是指BIOS中指定的啟動設備中的MBR。如果以軟盤啟動,則MBR是軟盤的第一個扇區。如果是硬盤,則是硬盤的第一個扇區。如果有多個硬盤呢?那麼就是BIOS中指定啟動硬盤的第一個扇區!

  run-level

  運行 $ less /etc/inittab

  顯示下列信息:

  # /etc/init.d executes the S and K scripts upon change

  # of runlevel.

  #

  # Runlevel 0 is halt.

  # Runlevel 1 is single-user.

  # Runlevels 2-5 are multi-user.

  # Runlevel 6 is reboot.

  上面顯示的就是當前可用的登錄模式,共有0~6中級別。常用的是3和5。

  0:關機

  1:單用戶模式(系統有問題時的登錄模式,相當於WINDOWS的"安全模式“)

  2:對於Debian/Ubuntuare來說,2~5都是相同的——多用戶圖形界面模式。對於其他發行版來說,3可能是多用戶文本模式,4為系統保留,5為多用戶圖形模式,具體的定義可以查看該發行版對應的/etc/inittab文件內容。

  6:重新啟動

  另外,還可能有"S"級,它等同於1的單用戶級別。

  運行 $ runlevel 可以查看系統當前運行級別

  如果把運行級別設成了0或6,想象會出現什麼情況?如何解決呢?

  WINDOWS在啟動時,如果按下F8,會出現“安全模式“、”正常啟動“、”MS-DOS“模式的選擇。相當於Linux run-level的1,5,3(不對應於Debian/Ubuntu)。

  關於Debian/Ubuntu中的run-level,看這裡!

  基本流程

  1, 加載BIOS硬件信息,並取得第一個開機裝置的代號。

  2,加載第一個開機裝置中MBR的boot loader(即lilo, grub, spfdisk等)引導信息。

  3,加載Linux內核,內核開始解壓縮,並驅動硬件。

  4,內核執行init程序,並獲得run-level信息;

  5,init 執行 /etc/init.d/rcS 程序;

  6,加載內核模塊(module)

  7,init 執行 對應run-level 級的腳本文件( Scripts );

  8,執行 /bin/login 程序,等待用戶登入;

  9,用戶登入之後,開始以shell控制系統(如果以圖形界面登錄,則運行圖形界面)。

  下面具體介紹流程中的步驟:

  1,加載BIOS

  系統上電時,最先讀取BIOS信息。BIOS(Basic Input/Output System)是計算機與外設最底層的接口,它存儲了計算機啟動時最先加載的數據,包括:CPU類型、啟動設備順序、硬盤大小/類型、芯片組工作狀態、外設I/O地址、PnP (Plug and Play,既插既用設備)的開啟與否、內存時鐘等。

  讀取了BIOS設定值後,系統根據BIOS數據進行開機自我檢測(Power On Self Test, POST),對硬件進行初始化,並設定PnP設備,指定啟動設備,之後從磁盤的MBR中讀取Bootloader數據。

  2,加載Boot Loader

  系統讀完BIOS之後,接著加載第一個引導磁盤的第一個扇區(MBR),boot loader就位於MBR中。此時,啟動工作的接力棒就交到了boot loader的手中。

  常用的boot loader有lilo, grub, spfdisk等,現在最流行的是grub,我用的Ubuntu中,boot loader就是grub,本文假設boot loader是grub,其實基本原理都是一樣的。

  為什麼要在MBR中安裝boot loader呢?它到底有什麼作用?實際上,boot loader的作用就是加載OS內核。系統在啟動時,要讀取文件以加載內核,必須能夠識別硬盤文件系統,但這時候系統還在啟動過程中,對文件系統信息一無所知。boot loader就輔佐系統識別文件格式,加載內核。boot loader不僅不光能夠識別Linux內核,而且能識別WINDOWS內核.所以,如果要安裝多系統,那麼要在MBR中安裝能支持這些系統文件系統的 boot loader.

  如果是以grub啟動,加載它後,會有個選擇啟動那個OS的菜單,當你作出選擇後,grub就從被選定OS所在的扇區中加載相應的內核.

Copyright © Linux教程網 All Rights Reserved