linux啟動過程 (三)

2022-04-02 07:01:18 字數 2741 閱讀 4027

linux開機啟動程式詳解

我們假設大家已經熟悉其它作業系統的引導過程,了解硬體的自檢引導步驟,就只從linux作業系統的引導引導程式(對個人電腦而言通常是lilo)開始,介紹linux開機引導的步驟。

載入核心

lilo

啟動之後,如果你選擇了linux作為準備引導的作業系統,第乙個被載入的東西就是核心。請記住此時的計算機記憶體中還不存在任何作業系統,pc(因為它們

天然的設計缺陷)也還沒有辦法訪問機器上全部的記憶體。因此,核心就必須完整地載入到可用ram的第乙個兆位元組之內。為了實現這個目的,核心是被壓縮了的。

這個檔案的頭部包含著必要的**,先設定cpu進入安全模式(以此解除記憶體限制),再對核心的剩餘部分進行解壓縮。

執行核心

核在記憶體中解壓縮之後,就可以開始執行了。此時的核心只知道它本身內建的各種功能,也就是說被編譯為模組的核心部分還不能使用。最基本的是,核心必須有足

夠的**設定自己的虛擬記憶體子系統和根檔案系統(通常就是ext2檔案系統)。一旦核心啟動執行,對硬體的檢測就會決定需要對哪些裝置驅動程式進行初始

化。從這裡開始,核心就能夠掛裝根檔案系統(這個過程類似於windows識別並訪問c盤的過程)。核心掛裝了根檔案系統之後,將啟動並執行乙個叫做

init的程式。

注意:在這裡我們故意略去了linux核心啟動的許多細節,這些細節只有核心開發人員才感興趣。如果你好奇的話,可以訪問http:位址處的"kernel hackers guide"。

init程序

init

程序是非核心程序中第乙個被啟動執行的,因此它的程序編號pid的值總是1。init讀它的配置檔案/etc/inittab,決定需要啟動的執行級別

(runlevel)。從根本上說,執行級別規定了整個系統的行為,每個級別(分別由0到6的整數表示)滿足特定的目的。如果定義了

initdefault級別,這個值就直接被選中,否則需要由使用者輸入乙個代表執行級別的數值。

輸入代表執行級別的數字之後,init根據/etc/inittab檔案中的定義執行乙個命令指令碼程式。預設的執行級別取決於安裝階段對登入程式的選擇:是使用基於文字的,還是使用基於x-window的登入程式。

rc命令指令碼程式我們已經知道,當執行級別發生改變時,將由/etc/inittab檔案定義需要執行哪乙個命令指令碼程式。這些命令指令碼程式負責啟動或者停止

該執行級別特定的各種服務。由於需要管理的服務數量很多,因此需要使用rc命令指令碼程式。其中,最主要的乙個是/etc/rc.d/rc,它負責為每乙個

執行級別按照正確的順序呼叫相應的命令指令碼程式。我們可以想象,這樣乙個命令指令碼程式很容易變得難以控制!為了防止這類事件的發生,需要使用精心設計的方

案。對每乙個執行級別來說,在/etc/rc.d子目錄中都有乙個對應的下級目錄。這些執行級別的下級子目錄的命名方法是rcx.d,其

中的x就是代表執行級別的數字。比如說,執行級別3的全部命令指令碼程式都儲存在/etc/rc.d/rc3.d子目錄中。在各個執行級別的子目錄中,都建

立有到/etc/rc.d/init.d子目錄中命令指令碼程式的符號鏈結,但是,這些符號鏈結並不使用命令指令碼程式在/etc/rc.d/init.d子

目錄中原來的名字。如果命令指令碼程式是用來啟動乙個服務的,其符號鏈結的名字就以字母s打頭;如果命令指令碼程式是用來關閉乙個服務的,其符號鏈結的名字就

以字母k打頭。

許多情況下,這些命令指令碼程式的執行順序都很重要。如果沒有先配置網路介面,就沒有辦法使用dns服務解析主機名!為了安排它們的

執行順序,在字母s或者k的後面緊跟著乙個兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/s50inet就會在/etc

/rc.d/rc3.d/s55named之前執行(s50inet配置網路設定,55named啟動dns伺服器)。存放在/etc/rc.d

/init.d子目錄中的、被符號鏈結上的命令指令碼程式是真正的實幹家,是它們完成了啟動或者停止各種服務的操作過程。當/etc/rc.d/rc執行通

過每個特定的執行級別子目錄的時候,它會根據數字的順序依次呼叫各個命令指令碼程式執行。它先執行以字母k打頭的命令指令碼程式,然後再執行以字母s打頭的命

令指令碼程式。對以字母k打頭的命令指令碼程式來說,會傳遞stop引數;類似地對以字母s打頭的命令指令碼程式來說,會傳遞start引數。編寫自己的rc命

或者執行級別5中啟動,原因是我認為只有這兩個執行級別才是日常工作的地方。最後,希望這個命令指令碼程式在進入執行級別6(重啟動)的時候被關閉。

啟用或者禁止服務專案有的時候會發現,在引導的時候並不需要某個特定的服務被啟動。如果你正在考慮使用linux替換windows

nt的檔案和列印伺服器,就更是如此。我們已經知道,在特定的執行級別子目錄中給符號鏈結改個名稱,就可以讓該服務不被啟動,如把其名稱的第乙個字母由s

改為k。一旦熟練掌握了命令列和符號鏈結,就會發現這是啟用或者禁止服務的最快辦法。

在學習這個改名方法的時候,可能會覺得圖形化的操作

介面ksysv比較容易掌握。雖然它原來是設計使用在kde環境裡的,但在red hatlinux

7.2下預設安裝的gnome環境裡也執行得很好。如果想啟動它,只需簡單地開啟乙個xterm視窗,並輸入ksysv命令就可以了。螢幕上會出現乙個窗

修改的時候,要記住所做的修改可能會造成你的系統不能正常工作,而且無法採用重啟動的方法恢復。不要在正常運轉的系統上實驗新的設定,對你準備修改的檔案

要全部進行備份。最重要的是,在手邊要準備一張引導盤以防不測。

Linux啟動過程

1 開啟 pc電源 pc加電後,乙個特殊的硬體電路會觸發 cpu 的 reset 腳的邏輯值,然後一些 cpu 暫存器,如 cs eip 等被給定乙個值,接著 cpu 跳轉到乙個固定位址開始執行 bios 2 bios 自檢,按設定的裝置啟動 bios 對硬體進行一系列徹底的檢查,如 cpu 型別 ...

Linux 啟動過程

fae 將porting 好的linux 提供,幾乎都在寫應用 空閒時間整理一下 b1202 系統啟動的過程 通過 boot vm 進行啟動 vmlinuz init 程序會讀取 etc inittab etc inittab 先 etc rc.d rc.sysinit 再 etc rc.d rc3...

Linux啟動過程

1.加電時由硬體將bios載入到記憶體末尾.這時是實模式,定址空間為1m.2.由硬體將cs段暫存器強制設定為0xffff,ip指令暫存器設定為0x0000.這樣cs ip指向了oxffff0的位址位置.這個位置就是bios程式的入口位址.3.執行bios程式.在記憶體起始位址0x00000設定1k大...