版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Linux系統(tǒng)概述
第1章Linux系統(tǒng)概述
Linux作為一個多任務(wù)、多用戶的操作系統(tǒng),以其很好的穩(wěn)定性贏得了廣大用戶,並迅速發(fā)展成為操作系統(tǒng)中的主流。本章簡單介紹Linux的基本概念、Linux操作系統(tǒng)的組成及Linux內(nèi)核分析方法1.1Linux的特徵及組成
Linux系統(tǒng)是包含內(nèi)核、系統(tǒng)工具、完整的開發(fā)環(huán)境和應(yīng)用的類Unix操作系統(tǒng)。這個系統(tǒng)是由全世界各地的成千上萬的程式員設(shè)計和實現(xiàn)的。1984年,RichardStallman創(chuàng)立了GNU工程,其目標(biāo)是開發(fā)一個完全免費的類Unix系統(tǒng)及其應(yīng)用程式。1991年,芬蘭赫爾辛基大學(xué)一位名叫Linus
Torvalds的學(xué)生開始了開放源代碼的Linux雛形的設(shè)計。其目的是建立不受任何商品化軟體的版權(quán)制約的、全世界都能自由使用的Unix相容產(chǎn)品1.1Linux的特徵及組成
Linux系統(tǒng)是包含內(nèi)核、系統(tǒng)工具、完整的開發(fā)環(huán)境和應(yīng)用的類Unix操作系統(tǒng)。這個系統(tǒng)是由全世界各地的成千上萬的程式員設(shè)計和實現(xiàn)的。1984年,RichardStallman創(chuàng)立了GNU工程,其目標(biāo)是開發(fā)一個完全免費的類Unix系統(tǒng)及其應(yīng)用程式。1991年,芬蘭赫爾辛基大學(xué)一位名叫Linus
Torvalds的學(xué)生開始了開放源代碼的Linux雛形的設(shè)計。其目的是建立不受任何商品化軟體的版權(quán)制約的、全世界都能自由使用的Unix相容產(chǎn)品由於Linux是一套具有Unix全部功能的免費操作系統(tǒng),它在眾多的軟體中佔有很大的優(yōu)勢,為廣大的電腦愛好者提供了學(xué)習(xí)、探索以及修改電腦操作系統(tǒng)內(nèi)核的機會1.1.1Linux的主要特性1開放性
開放性是指系統(tǒng)遵循遵循開放系統(tǒng)互連(OpenSystemsInterconnection,OSI)國際標(biāo)準(zhǔn)。凡遵循國際標(biāo)準(zhǔn)所開發(fā)的硬體和軟體,都能彼此相容,可方便地實現(xiàn)互連。2多用戶
多用戶是指系統(tǒng)資源可以被不同用戶各自擁有使用,即每個用戶對自己的資源(例如:檔、設(shè)備)有特定的許可權(quán),互不影響。Linux和Unix都具有多用戶的特性。
1.1.1Linux的主要特性3多任務(wù)
多任務(wù)是現(xiàn)代電腦的最主要的一個特點。它是指電腦同時執(zhí)行多個程式,而且各個程式的運行互相獨立。4良好的用戶介面
Linux向用戶提供了兩種介面:用戶介面和系統(tǒng)調(diào)用5設(shè)備獨立性
設(shè)備獨立性是指操作系統(tǒng)把所有外部設(shè)備統(tǒng)一當(dāng)作成文件來看待,只要安裝它們的驅(qū)動程式,任何用戶都可以像使用檔一樣,操縱、使用這些設(shè)備,而不必知道它們的具體存在形式。
1.1.1Linux的主要特性6.豐富的網(wǎng)路功能
完善的內(nèi)置網(wǎng)路是Linux的一大特點。Linux在通信和網(wǎng)路功能方面優(yōu)於其他操作系統(tǒng)。7可靠的系統(tǒng)安全
Linux採取了許多安全技術(shù)措施,包括對讀、寫進行許可權(quán)控制、帶保護的子系統(tǒng)、審計跟蹤、核心授權(quán)等,這為網(wǎng)路多用戶環(huán)境中的用戶提供了必要的安全保障。
8良好的可移植性
可移植性是指將操作系統(tǒng)從一個平臺轉(zhuǎn)移到另一個平臺使它仍然能按其自身的方式運行的能力。
1.1.2Linux的組成
通常操作系統(tǒng)由內(nèi)核和一些系統(tǒng)服務(wù)程式(命令解釋、庫檔、鏈接和編譯程序等)組成。內(nèi)核是操作系統(tǒng)的靈魂,它為用戶進程提供了一個虛擬機介面。用戶進程可以並行運行、公平的佔用系統(tǒng)資源而互不干擾。1.
Linux內(nèi)核
內(nèi)核是系統(tǒng)的心臟,是運行程式和管理像磁片和印表機等硬體設(shè)備的核心程式。它從用戶那裏接受命令並把命令送給內(nèi)核去執(zhí)行。
2.
Linux
shell
shell是系統(tǒng)的用戶介面,提供了用戶與內(nèi)核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內(nèi)核去執(zhí)行。
1.1.2Linux的組成3.
Linux檔結(jié)構(gòu)/homebinprocusrbootlibdevetcvarzhengweiYMbinlibmantmplogrunspool1.1.2Linux的組成3.
Linux檔結(jié)構(gòu)名稱
角色root
root檔系統(tǒng)中的內(nèi)容包括:引導(dǎo)系統(tǒng)的必備檔,檔系統(tǒng)的掛裝資訊以及系統(tǒng)修復(fù)工具和備份工具等。/usr/usr檔系統(tǒng)中包含通常操作中不需要進行修改的命令程式檔、程式庫、手冊和其他文檔等。/var/var檔系統(tǒng)中包含經(jīng)常變化的檔,例如印表機、郵件、新聞等的假脫機目錄、日誌檔、格式化後的手冊頁以及臨時檔等。
/homehome中包含用戶的主目錄,用戶的數(shù)據(jù)保存在其主目錄中
/proc
/proc檔系統(tǒng)並不保存在磁片上,相反,操作系統(tǒng)在內(nèi)存中創(chuàng)建這一檔系統(tǒng)。
(1)root檔系統(tǒng)
root檔系統(tǒng)中包含一些關(guān)鍵檔,同時其內(nèi)容也比較小。如果root檔系統(tǒng)被破壞,操作系統(tǒng)就無法正確引導(dǎo)。root檔系統(tǒng)中包含的檔和目錄見表1.2。表1.2root檔系統(tǒng)中的檔和目錄/vmlinuz
檔。系統(tǒng)的標(biāo)準(zhǔn)引導(dǎo)映像,通常以壓縮形式出現(xiàn)。
/bin
包含引導(dǎo)過程必需的命令,也可由普通用戶使用。/sbin和/bin類似,儘管其中的命令可由普通用戶使用,但由於這些命令屬於系統(tǒng)級命令,因此無特殊需求不使用其中的命令。/etc
包含與特定電腦相關(guān)的配置檔。/rootroot用戶的主目錄。/lib
root檔系統(tǒng)中的程式要使用的共用庫保存在該目錄中。表1.2root檔系統(tǒng)中的檔和目錄/lib/modules包含可裝載的內(nèi)核模組。/dev
包含設(shè)備檔。/tmp包含臨時檔。引導(dǎo)後運行的程式應(yīng)當(dāng)在/var/tmp中保存檔,因為其中的可用空間大一些。/boot
包含引導(dǎo)裝載程式要使用的檔。內(nèi)核映像通常保存在這個目錄中。因為多個內(nèi)核映像會佔用很多磁片空間,因此可將該目錄放置在單獨的檔系統(tǒng)中。
/mnt臨時檔系統(tǒng)的掛裝點。/usr,/var,
/home,/proc其他檔系統(tǒng)的掛裝點。(2)/usr檔系統(tǒng)
/usr文件系統(tǒng)中包含所有的程序文件以及聯(lián)機文檔,因此其內(nèi)容通常很大。/usr檔系統(tǒng)中包含的檔和目錄見表1.3。表1.3/usr檔系統(tǒng)中的目錄/usr/X11R6
包含X窗口系統(tǒng)的所有檔。
/usr/X386
和/usr/X11R6類似,但包含X11的Release5。/usr/bin
絕大多數(shù)用戶命令。其他命令包含在/bin和/usr/local/bin中。/usr/sbin
root檔系統(tǒng)中不需要的系統(tǒng)管理命令。/usr/man/usr/info/usr/doc
分別包含手冊頁、GNUInfo文檔以及其他雜項文檔。/usr/include
C語言的頭檔。
/usr/lib
程式和子系統(tǒng)所使用的不變的數(shù)據(jù)檔。/usr/local
本地掛裝的軟體和其他檔的存放位置。
(3)/var文件系統(tǒng)
/var包含系統(tǒng)運行過程中經(jīng)常發(fā)生變化的檔。/var檔系統(tǒng)中包含的目錄見表1.4。表1.4/var檔系統(tǒng)中的目錄/var/catman格式化手冊頁的高速緩存。/var/lib包含系統(tǒng)運行時經(jīng)常改變的檔。
/var/local安裝/usr/local中的程式的可變數(shù)據(jù)。/var/lock包含鎖檔。
/var/log包含程式產(chǎn)生的日誌檔。
/var/run該目錄包含在下次引導(dǎo)之前有效的、和系統(tǒng)相關(guān)的資訊/var/spool
排隊任務(wù)的假脫機目錄
/var/tmp包含大的臨時檔,或者保存時間較長的臨時檔。(4)/proc檔系統(tǒng)
/proc檔系統(tǒng)並不保存在磁片上,操作系統(tǒng)在內(nèi)存中創(chuàng)建這一檔系統(tǒng)。/proc檔系統(tǒng)中包含的檔和目錄見表1.5。表1.5/proc檔系統(tǒng)中的檔和目錄/proc/1該目錄中包含進程號為1的進程資訊。每個進程在/proc目錄下有一個以自己的進程號為名稱的目錄。
/proc/cpuinfo
有關(guān)CPU名稱、型號、性能和類型的資訊。/proc/devices
當(dāng)前內(nèi)核中的設(shè)備驅(qū)動程式列表。
/proc/dma當(dāng)前使用的DMA通道。
/proc/filesystems內(nèi)核支持的檔系統(tǒng)。
/proc/interrupts當(dāng)前使用的中斷資訊。/proc/ioports當(dāng)前使用的I/O端口。/proc/kcore系統(tǒng)物理記憶體的映像。
4.
Linux實用工具
標(biāo)準(zhǔn)的Linux系統(tǒng)都有一套叫做實用工具的程式,它們是專門的程式,例如編輯器、執(zhí)行標(biāo)準(zhǔn)的計算操作等。用戶也可以產(chǎn)生自己的工具。
1.2Linux內(nèi)核的主要組成部分
操作系統(tǒng)一般由內(nèi)核和一些系統(tǒng)程式組成,同時,還有一些應(yīng)用程式幫助用戶完成特定任務(wù)。內(nèi)核是操作系統(tǒng)的靈魂,它負(fù)責(zé)管理磁片上的檔、記憶體,負(fù)責(zé)啟動並運行程式,負(fù)責(zé)從網(wǎng)路上接收和發(fā)送數(shù)據(jù)包等等。
Linux內(nèi)核主要是由進程調(diào)度、記憶體管理、虛擬檔系統(tǒng)、網(wǎng)路介面和進程間通信五部分組成。
(1)進程調(diào)度負(fù)責(zé)控制進程對CPU的訪問,調(diào)度程式使用一種策略確保所有的進程都能公平的訪問CPU,並且確保內(nèi)核在任意時刻能執(zhí)行必要的硬體操作。
(2)記憶體管理負(fù)責(zé)管理系統(tǒng)的物理記憶體,實現(xiàn)多進程安全享享電腦的記憶體。
1.2Linux內(nèi)核的主要組成部分
(3)虛擬檔系統(tǒng)通過將各種設(shè)備抽象為一種公共介面,從而遮罩了各種硬體設(shè)備的細(xì)節(jié)。虛擬檔系統(tǒng)可以分為邏輯檔系統(tǒng)和設(shè)備驅(qū)動程式兩部分。
(4)網(wǎng)路介面提供了對各種網(wǎng)路標(biāo)準(zhǔn)的存取和各種網(wǎng)路硬體的支持,實現(xiàn)了對各種網(wǎng)路標(biāo)準(zhǔn)和網(wǎng)路硬體的訪問。網(wǎng)路介面可分為網(wǎng)路協(xié)議和網(wǎng)路驅(qū)動程式。網(wǎng)路協(xié)議部分負(fù)責(zé)實現(xiàn)每一種可能的網(wǎng)路傳輸協(xié)議。網(wǎng)路設(shè)備驅(qū)動程式負(fù)責(zé)與硬體設(shè)備通訊,每一種可能的硬體設(shè)備都有相應(yīng)的設(shè)備驅(qū)動程式。1.2Linux內(nèi)核的主要組成部分
(5)進程間通信子系統(tǒng)實現(xiàn)了系統(tǒng)內(nèi)部進程間的多種通信機制。這五個子系統(tǒng)互相依賴,但相對來說進程調(diào)度處在比較重要的地位。其他子系統(tǒng)需要掛起和恢復(fù)進程的運行都必須依靠進程調(diào)度子系統(tǒng)的參與。
1.2.1記憶體管理
對任何一臺電腦而言,其記憶體以及其他資源都是有限的。為了讓有限的物理記憶體滿足應(yīng)用程式對內(nèi)存的大需求量,Linux採用了稱為“虛擬記憶體”的記憶體管理方式。Linux將記憶體劃分為容易處理的“記憶體頁”,在系統(tǒng)運行過程中,應(yīng)用程式對內(nèi)存的需求大於物理記憶體時,Linux可將暫時不用的記憶體頁交換到硬碟上,這樣,空閒的記憶體頁可以滿足應(yīng)用程式的記憶體需求,應(yīng)用程式卻不會注意到記憶體交換發(fā)生。
Linux的記憶體管理子系統(tǒng)採用分頁方式管理和使用物理記憶體資源。它根據(jù)不同的晶片採用不同層次的頁表系統(tǒng)(例如Alpha採用三層頁表,Intel採用兩層頁表)實現(xiàn)了進程的邏輯地址空間到物理記憶體地址的映射。因此兩個進程可以訪問相同的地址空間而使用不同的物理記憶體。1.2.1記憶體管理1.2.1記憶體管理1.2.1記憶體管理
為了改善系統(tǒng)的運行性能,Linux內(nèi)核採用了多種Cach技術(shù):緩存Cach、頁面Cach、交換Cach和硬體Cach。緩存Cach:它中存儲的是塊設(shè)備驅(qū)動模組使用的緩存數(shù)據(jù)。緩存Cach大小固定,使用設(shè)備識別字和塊號進行標(biāo)識。它能大大的提高內(nèi)核對外設(shè)的訪問速度。頁面Cach:它被用來加快對磁片上影像和數(shù)據(jù)的訪問速度。它緩存一個檔中邏輯頁面的內(nèi)容,使用檔和文件中的偏移進行標(biāo)識。交換Cach:只有被修改的頁面才被再次寫入到交換區(qū)中,那些已經(jīng)在交換區(qū)中有備份,而且沒有修改的頁面將被直接丟棄。這樣可以大大的提高虛存交換的速度。硬體Cach:用在進程中的地址轉(zhuǎn)換,將用過的虛擬地址到物理地址的轉(zhuǎn)換緩存起來,當(dāng)需要進行地址轉(zhuǎn)換時,系統(tǒng)不是直接去找頁表,而是在緩存中找。由於Linux系統(tǒng)採用多級頁表系統(tǒng),因此這種技術(shù)可以大大的加快進程運行速度。1.2.1記憶體管理
記憶體管理子系統(tǒng)由三個模組組成:體系結(jié)構(gòu)相關(guān)模組、體系結(jié)構(gòu)獨立模組和系統(tǒng)調(diào)用模組。
(1)體系結(jié)構(gòu)相關(guān)模組:實現(xiàn)了一個物理記憶體管理硬體的虛擬介面。(2)體系結(jié)構(gòu)獨立模組:該模組實現(xiàn)了進程地址空間映射和虛擬記憶體交換,負(fù)責(zé)決定那些記憶體頁交換到檔系統(tǒng)中去。(3)系統(tǒng)調(diào)用介面:該模組用來為用戶進程提供有限的訪問許可權(quán)。該模塊允許用戶分配和釋放存儲區(qū),將記憶體影像到I/O檔上。1.2.2進程調(diào)度
進程實際是某特定應(yīng)用程式的一個運行實體。在Linux系統(tǒng)中,能夠同時運行多個進程,Linux通過在短的時間間隔內(nèi)輪流運行這些進程而實現(xiàn)“多任務(wù)”。進程是系統(tǒng)分配資源的最小單位。一個進程就是一個運行實體。在Linux中,所有資源都是以進程為對象來進行分配的。Linux系統(tǒng)是一個多任務(wù)的系統(tǒng),進程調(diào)度就是要保障各個進程能公平的使用系統(tǒng)的CPU資源。
1.2.2進程調(diào)度
Linux內(nèi)核在保障進程運行效率的實現(xiàn)方面具有很多特點:(1)Linux設(shè)計了一系列的數(shù)據(jù)結(jié)構(gòu),它們能準(zhǔn)確地描述進程的狀態(tài)和其資源使用情況,以便能公平有效地使用系統(tǒng)資源。Linux的調(diào)度演算法能確保不出現(xiàn)某些進程過度佔用系統(tǒng)資源而導(dǎo)致另一些進程無休止地等待的情況。這一方法從根本上保證了系統(tǒng)的高效和穩(wěn)定。(2)Linux的進程創(chuàng)建採用了Copyonwrite技術(shù),即不拷貝父進程的空間,而是拷貝父進程的頁表,使父進程和子進程共用物理空間,並將這個共用空間的訪問許可權(quán)置為只讀。當(dāng)父進程和子進程的某一方進行寫操作時,Linux檢測到一個非法操作,這時才將要寫的頁進行複製。這一做法免除了只讀頁的複製,從而降低了開銷。
1.2.2進程調(diào)度
進程調(diào)度子系統(tǒng)可以分為四個模組:調(diào)度策略模組、體系結(jié)構(gòu)相關(guān)模組、體系結(jié)構(gòu)獨立模組和系統(tǒng)調(diào)用介面模組。(1)調(diào)度策略模組:該模組主要負(fù)責(zé)判斷哪個進程將訪問CPU。策略的制定必須保證所有進程可以得到比較公正的待遇。(2)體系結(jié)構(gòu)相關(guān)模組:該模組被設(shè)計為將電腦特定體系結(jié)構(gòu)抽象為一種公共介面。這些模組負(fù)責(zé)和CPU通信實現(xiàn)進程的掛起和運行。它們知道如何為進程保留那些寄存器和狀態(tài)資訊以及如何執(zhí)行彙編代碼來實現(xiàn)進程的掛起和運行。(3)體系結(jié)構(gòu)獨立模組:該模組和調(diào)度策略模組通信決定下一個該運行的進程,然後調(diào)用體系結(jié)構(gòu)相關(guān)模組來恢復(fù)進程的運行。另外該模組還調(diào)用記憶體管理模組保證要運行的進程的記憶體得到的恢復(fù)。(4)系統(tǒng)調(diào)用介面模組:該模組只允許用戶進程訪問內(nèi)核明確公佈的資源。這樣將用戶進程對內(nèi)核的以來限制在一個很少變化的介面範(fàn)圍內(nèi)。
1.2.3設(shè)備驅(qū)動程式
設(shè)備驅(qū)動程式是Linux內(nèi)核的主要部分。和操作系統(tǒng)的其他部分類似,設(shè)備驅(qū)動程式運行在高特權(quán)級的處理器環(huán)境中,從而可以直接對硬體進行操作,但正因為如此,任何一個設(shè)備驅(qū)動程式的錯誤都可能導(dǎo)致操作系統(tǒng)的崩潰。設(shè)備驅(qū)動程式實際控制操作系統(tǒng)和硬體設(shè)備之間的交互。設(shè)備驅(qū)動程式提供一組操作系統(tǒng)可理解的抽象介面完成和操作系統(tǒng)之間的交互,而與硬體相關(guān)的具體操作細(xì)節(jié)由設(shè)備驅(qū)動程式完成。一般而言,設(shè)備驅(qū)動程式和設(shè)備的控制晶片有關(guān)。例如,如果電腦硬碟是小型電腦系統(tǒng)介面(SmallComputerSystemInterface,SCSI)的硬碟,則需要使用SCSI驅(qū)動程式,而不是IDE(IntegratedDriveElectronics)驅(qū)動程式。1.2.4檔系統(tǒng)
Linux虛擬文件系統(tǒng)為用戶提供了一個一種公共的接口,而不需要了解物理設(shè)備或邏輯系統(tǒng)的細(xì)節(jié)。系統(tǒng)允許系統(tǒng)管理員將在任何物理設(shè)備上的邏輯文件系統(tǒng)掛接在文件目錄中。Linux支持幾種可執(zhí)行檔格式。
Linux的虛擬檔系統(tǒng)由五個模組組成:設(shè)備驅(qū)動模組、設(shè)備獨立介面模組、邏輯檔系統(tǒng)模組、系統(tǒng)獨立介面模組和系統(tǒng)調(diào)用模組。
1.2.4檔系統(tǒng)
Linux虛擬檔系統(tǒng)為用戶提供了一個一種公共的介面,而不需要瞭解物理設(shè)備或邏輯系統(tǒng)的細(xì)節(jié)。系統(tǒng)允許系統(tǒng)管理員將在任何物理設(shè)備上的邏輯檔系統(tǒng)掛接在檔目錄中。Linux支持幾種可執(zhí)行檔格式。
Linux的虛擬檔系統(tǒng)由五個模組組成:設(shè)備驅(qū)動模組、設(shè)備獨立介面模組、邏輯檔系統(tǒng)模組、系統(tǒng)獨立介面模組和系統(tǒng)調(diào)用模組。(1)設(shè)備驅(qū)動模組:該模組和具體的設(shè)備控制器相關(guān)。Linux支持大量的設(shè)備控制程式。(2)設(shè)備獨立介面模組:該模組提供了一種一致的設(shè)備視圖。(3)邏輯檔系統(tǒng)模組:針對不同的檔系統(tǒng)都有一個對應(yīng)的邏輯檔系統(tǒng)模組。Linux主要採用EXT2(SecondExtendedFileSystem)檔系統(tǒng)。
1.2.4檔系統(tǒng)
(4)系統(tǒng)獨立介面模組:該模組提供了一種獨立於硬體和邏輯檔系統(tǒng)的統(tǒng)一視圖,它採用面向字元和麵向塊的檔介面來表示所有的資源。(5)系統(tǒng)介面模組:該模組限制了用戶對系統(tǒng)中功能的訪問保證了系統(tǒng)的安全。
1.2.5網(wǎng)路
TCP/IP協(xié)議是Internet的標(biāo)準(zhǔn)協(xié)議,同時也是事實上的工業(yè)標(biāo)準(zhǔn)。Linux的網(wǎng)路實現(xiàn)支持BSD套接字,支持全部的TCP/IP協(xié)議。Linux內(nèi)核的網(wǎng)路部分由BSD套接字、網(wǎng)路協(xié)議層和網(wǎng)路設(shè)備驅(qū)動程式組成。
Linux網(wǎng)路介面子系統(tǒng)支持多種網(wǎng)路設(shè)備並支持各種網(wǎng)路協(xié)議,它將網(wǎng)路設(shè)備和協(xié)議的實現(xiàn)細(xì)節(jié)抽象化,使用戶不需要知道目前使用的網(wǎng)路設(shè)備和網(wǎng)路協(xié)議。
1.2.5網(wǎng)路Linux網(wǎng)路介面子系統(tǒng)由五個模組組成:網(wǎng)路設(shè)備驅(qū)動模組、設(shè)備獨立介面模組、網(wǎng)路協(xié)議模組、協(xié)議獨立介面模組和系統(tǒng)調(diào)用介面模組。
1.2.5網(wǎng)路Linux網(wǎng)路介面子系統(tǒng)由五個模組組成:網(wǎng)路設(shè)備驅(qū)動模組、設(shè)備獨立介面模組、網(wǎng)路協(xié)議模組、協(xié)議獨立介面模組和系統(tǒng)調(diào)用介面模組。(1)網(wǎng)路設(shè)備驅(qū)動模組:該模組針對各種網(wǎng)路設(shè)備進行編寫,它負(fù)責(zé)和硬體的通信工作。(2)設(shè)備獨立介面模組:該模組抽象了網(wǎng)路設(shè)備的實現(xiàn)細(xì)節(jié),為子系統(tǒng)上層模組提供了一個一致的設(shè)備視圖。(3)網(wǎng)路協(xié)議模組:該模組中每個都實現(xiàn)了相應(yīng)的網(wǎng)路傳輸協(xié)議。(4)網(wǎng)路協(xié)議獨立介面模組:該模組提供了一個與網(wǎng)路硬體和網(wǎng)路協(xié)議無關(guān)的介面,這樣內(nèi)核可以在一個統(tǒng)一的視圖下訪問網(wǎng)路。(5)系統(tǒng)調(diào)用模組:該模組限制了用戶進程對子系統(tǒng)中各種功能的訪問。1.2.6其他
除上述主要組成部分之外,內(nèi)核還包含一些一般性的任務(wù)和機制,這些任務(wù)和機制可使Linux內(nèi)核的各個部分有效地組合在一起,它們是上述主要部分高效工作的必要保證。
Linux是單塊結(jié)構(gòu)的操作系統(tǒng)。為了可方便地在內(nèi)核中添加新的組件,Linux支持可動態(tài)裝載和卸載的模組,這樣可方便地在內(nèi)核中添加新的組件或卸載不再需要的內(nèi)核組件。1.2.6其他Linux提供了多種進程間的通信機制,其中,信號和管道是最基本的兩種。此外,Linux也提供SystemV的進程間通信機制,包括消息佇列、信號燈及共用記憶體。為了支持不同機器之間的進程通信,Linux還引入了BSD的Socket機制。1.2.6其他Linux提供了多種進程間的通信機制,其中,信號和管道是最基本的兩種。此外,Linux也提供SystemV的進程間通信機制,包括消息佇列、信號燈及共用記憶體。為了支持不同機器之間的進程通信,Linux還引入了BSD的Socket機制。
Linux內(nèi)核採用了數(shù)據(jù)抽象技術(shù)。設(shè)備驅(qū)動程式、檔和網(wǎng)路協(xié)議等模組都作為一個獨立的模組存在,並且它們都支持一種公共的介面。1.2.6其他Linux內(nèi)核還採用了分層的技術(shù),將那些於硬體相關(guān)的模組和其他模組嚴(yán)格地分離,因此當(dāng)系統(tǒng)移植到其他平臺時,不需要對內(nèi)核做太大的修改。圖1.2說明了上述Linux內(nèi)核的重要組成部分及其相互關(guān)係。圖1.2Linux內(nèi)核的重要組成部分
用戶級程式
系統(tǒng)調(diào)用介面虛擬檔系統(tǒng)管理記憶體管理器進程管理器抽象網(wǎng)路程式檔系統(tǒng)驅(qū)動程式TCP/IP協(xié)議驅(qū)程IDE硬碟驅(qū)動程式軟碟驅(qū)動程式IDE硬碟軟碟以太網(wǎng)卡驅(qū)動程式以太網(wǎng)卡1.3Linux內(nèi)核分析
所有主要Linux發(fā)行版本(如Craftworks,Debian、Slackware和Redhat)都包含了源碼在內(nèi)。Linux系統(tǒng)核心就是從這些源碼中構(gòu)造出來的。
Linux核心代碼的版本編號很簡單。任何偶數(shù)編號的核心(如2.0.30)都是穩(wěn)定的發(fā)行版而奇數(shù)編號的核心(如2.1.42)都是正在開發(fā)的核心。開發(fā)版的核心是試用版本,但具有最新的特徵並支持最新的設(shè)備。1.3.1核心源碼的組織
核心源碼的頂層是/usr/src/linux目錄,在此目錄下可以看到大量子目錄:
arch這個子目錄包含了所有體系結(jié)構(gòu)相關(guān)的核心代碼。它還包含每種支持的體系結(jié)構(gòu)的子目錄,如i386。
include這個目錄包括了用來重構(gòu)核心的大多數(shù)include檔。對於每種支持的體系結(jié)構(gòu)分別有一個子目錄。
init此目錄包含核心啟動代碼。
mm此目錄包含了所有的記憶體管理代碼。與具體體系結(jié)構(gòu)相關(guān)的記憶體管理代碼位於arch/mm目錄下,例如arch/i386/mm/fault.c。
1.3.1核心源碼的組織drivers系統(tǒng)中所有的設(shè)備驅(qū)動都位于該目錄中。它又進一步劃分成幾類設(shè)備驅(qū)動,如block。
ipc此目錄包含了核心的進程間通訊代碼。
modules此目錄僅僅包含已建好的模組。
fs所有的檔系統(tǒng)代碼。它也被劃分成對應(yīng)不同檔系統(tǒng)的子目錄,如vfat和ext2。
kernel主要核心代碼。同時與處理器結(jié)構(gòu)相關(guān)代碼都放在arch/kernel目錄下。
net核心的網(wǎng)路部分代碼。
lib此目錄包含了核心的庫代碼。與處理器結(jié)構(gòu)相關(guān)庫代碼被放在arch/lib/目錄下。
scripts此目錄包含用於配置核心的腳本檔(如awk和tk腳本)。1.3.2Linux內(nèi)核源代碼的組成
閱讀核心某個部分經(jīng)常要用到好幾個其他的相關(guān)檔,對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的瞭解。閱讀linux內(nèi)核源代碼的基本要求是:
1、操作系統(tǒng)的基本知識。
2、對C語言比較熟悉,最好要有組合語言的知識和GNUC對標(biāo)準(zhǔn)C的擴展的知識的瞭解。另外,在閱讀之前還應(yīng)該知道Linux內(nèi)核源代碼的整體分佈情況。
Linux內(nèi)核源代碼的組成如下1系統(tǒng)啟動與初始化在基於intel的系統(tǒng)上,Linux可以通過loadlin.exe或者LILO將核心載入記憶體並將控制傳遞給它。這部分程式位於arch/i386/kerneld/head.s。此檔完成一些處理器相關(guān)操作並跳轉(zhuǎn)到init/main.c中的main()例程。
2記憶體管理這部分代碼主要位於mm目錄裏,而與處理器結(jié)構(gòu)相關(guān)部分在arch/mm中。頁面出錯處理代碼位於mm下的memory.c檔中,記憶體映射與頁面cache代碼位於filemap.c中。buffercache則在mm/buffer.c中實現(xiàn),swapcache位於mm/swap_state.c和mm/swapfile.c中。Linux內(nèi)核源代碼的組成3核心大多數(shù)通用代碼位於kernel目錄下,而處理器相關(guān)代碼被放在arch/kernel中。調(diào)度管理程式位於kernel/sched.c,fork代碼位於kernel/fork.c。底層部分處理及中斷處理的代碼位於include/linux/interrupt.h裏。在/linux/sched.h中可以找到task_struct的描敘。
4PCIPCI偽設(shè)備驅(qū)動位於drivers/pci/pci.c且其系統(tǒng)通用定義放在include/linux/pci.h中。每個處理器結(jié)構(gòu)具有特殊的PCIBIOS代碼,AlphaAXP的位於arch/alpha/kernel/bios32.c中。Linux內(nèi)核源代碼的組成如下5進程間通訊進程間通訊所有代碼都在ipc目錄中。系統(tǒng)VIPC對象都包含一個ipc_perm結(jié)構(gòu),它在include/linux/ipc.h中描敘。系統(tǒng)V消息在ipc/msg.c中實現(xiàn),共用記憶體在ipc/shm.c而信號燈位於ipc/sem.c中。管道在ipc/pipe.c中實現(xiàn)。
6中斷處理核心的中斷處理代碼總是與微處理器結(jié)構(gòu)相關(guān)。Intel系統(tǒng)的中斷處理代碼位於arch/i386/kernel/irq.c中,其定義位於include/asm-i386/irq.h中。
Linux內(nèi)核源代碼的組成如下7設(shè)備驅(qū)動
Linux核心源碼的大多數(shù)都是設(shè)備驅(qū)動。所有Linux的設(shè)備驅(qū)動源碼都放在drivers目錄中並分成以下幾類:
/block塊設(shè)備驅(qū)動包括IDE(在ide.c中)驅(qū)動。如果想尋找這些可包含檔系統(tǒng)的設(shè)備的初始化過程則應(yīng)該在drivers/block/genhd.c中的device_setup()。當(dāng)安裝一個nfs檔系統(tǒng)時不但要初始化硬碟還需初始化網(wǎng)路。塊設(shè)備包括IDE與SCSI設(shè)備。
/char此目錄包含字元設(shè)備的驅(qū)動,如ttys,串行口以及滑鼠。Linux內(nèi)核源代碼的組成7設(shè)備驅(qū)動
Linux核心源碼的大多數(shù)都是設(shè)備驅(qū)動。所有Linux的設(shè)備驅(qū)動源碼都放在drivers目錄中並分成以下幾類:
/cdrom包含所有LinuxCDROM代碼。在這裏可以找到某些特殊的CDROM設(shè)備(如SoundblasterCDROM)。IDE介面的CD驅(qū)動位於drivers/block/ide-cd.c中而SCSICD驅(qū)動位於drivers/scsi/scsi.c中。
/pci它包含了PCI偽設(shè)備驅(qū)動源碼。這裏可以找到關(guān)於PCI子系統(tǒng)映射與初始化的代碼。另外位於arch/alpha/kernel/bios32.c中的AlphaAXPPCI補丁代碼也值得一讀。
Linux內(nèi)核源代碼的組成7設(shè)備驅(qū)動
Linux核心源碼的大多數(shù)都是設(shè)備驅(qū)動。所有Linux的設(shè)備驅(qū)動源碼都放在drivers目錄中並分成以下幾類:
/scsi這裏可以找到所有的SCSI代碼以及Linux支持的SCSI設(shè)備的設(shè)備驅(qū)動。
/net包含網(wǎng)路驅(qū)動源碼,如tulip.c中的DECChip21040PCI以太網(wǎng)驅(qū)動。
/sound所有的聲卡驅(qū)動源碼。
Linux內(nèi)核源代碼的組成8檔系統(tǒng)
EXT2檔系統(tǒng)的源碼位於fs/ext2中,其數(shù)據(jù)結(jié)構(gòu)定義位於include/linux/ext2_fs.h,ext2_fs_i.h以及ext2_fs_sb.h中。虛擬檔系統(tǒng)數(shù)據(jù)結(jié)構(gòu)在include/linux/fs.h中描敘且其代碼在fs//中。buffercache和update核心後臺進程在fs/buffer.c中實現(xiàn)。
9網(wǎng)路網(wǎng)路代碼位於net目錄而大多數(shù)包含檔位於include/net中。BSD套介面代碼位於net/socket.c中。IPV4的INET套介面代碼位於net/ipv4/af_inet.c中。通用協(xié)議支撐代碼(包括sk_buff處理過程)位於net/core中,同時TCP/IP網(wǎng)路代碼位於net/ipv4中。網(wǎng)路設(shè)備驅(qū)動位於drivers/net中。
Linux內(nèi)核源代碼的組成10核心模組核心模組代碼部分位於核心中部分位於modules包中。核心代碼位於kernel/modules.c且其數(shù)據(jù)結(jié)構(gòu)與核心後臺進程kerneld消息位於include/linux/module.h和include/linux/kerneld.h目錄中。同時必要時需查閱include/linux/elf.h中的ELF檔格式。1.3.3Linux內(nèi)核分析方法
Linux的最大的優(yōu)點之一就是它的源碼公開。首先是可以從中學(xué)到很多的電腦的底層知識,如後面將講到的系統(tǒng)的引導(dǎo)和硬體提供的中斷機制等;其他,如虛擬存儲的實現(xiàn)機制、多任務(wù)機制、系統(tǒng)保護機制等等,這些都是非讀源碼不能體會的。其次是可以從操作系統(tǒng)的整體結(jié)構(gòu)中,體會整體設(shè)計在軟體設(shè)計中的份量和作用,以及一些宏觀設(shè)計的方法和技巧:Linux的內(nèi)核為上層應(yīng)用提供一個與具體硬體不相關(guān)的平臺;同時在內(nèi)核內(nèi)部,它又把代碼分為與體系結(jié)構(gòu)和硬體相關(guān)的部分,和可移植的部分;再例如,Linux雖然不是微內(nèi)核的,但它把大部分的設(shè)備驅(qū)動處理成相對獨立的內(nèi)核模組,這樣減小了內(nèi)核運行的開銷,增強了內(nèi)核代碼的模組獨立性。
1.3.3Linux內(nèi)核分析方法
再是能從對內(nèi)核源碼的分析中,體會到它在解決某個具體細(xì)節(jié)問題時的巧妙方法,如Linux通過Botoom_half機制來加快系統(tǒng)對中斷的處理。最重要的是:在源碼的分析過程中,讀者將會被慢慢地、潛移默化地專業(yè)化。專業(yè)的程式員總是把代碼的清晰性,相容性,可移植性放在很重要的位置。1.3.3Linux內(nèi)核分析方法
然而,由於內(nèi)核代碼的冗長,和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個很艱難、很需要毅力的事;在缺乏指導(dǎo)和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時的幾種方法:
1.弄懂源碼的檔組織形式要分析Linux內(nèi)核源碼,首先必須找到各個模組的位置,即搞清楚源碼的檔組織形式。
2.以程式流程為線索,一線串珠第二種方法是“以程式流程為線索、一線串珠”,就是指根據(jù)程式的執(zhí)行流程,把程式執(zhí)行過程所涉及到的代碼分析清楚。這種方法最典型的應(yīng)用有兩個:一是系統(tǒng)的初始化過程;二是應(yīng)用程式的執(zhí)行流程:從程式的裝載,到運行,一直到程式的退出。
1.3.3Linux內(nèi)核分析方法
然而,由於內(nèi)核代碼的冗長,和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個很艱難、很需要毅力的事;在缺乏指導(dǎo)和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時的幾種方法:
3.以數(shù)據(jù)結(jié)構(gòu)為基點,觸類旁通結(jié)構(gòu)化程式設(shè)計思想認(rèn)為:數(shù)據(jù)結(jié)構(gòu)+演算法=程式。數(shù)據(jù)結(jié)構(gòu)體現(xiàn)了整個系統(tǒng)的構(gòu)架,所以數(shù)據(jù)結(jié)構(gòu)通常都是代碼分析的很好的著手點,對Linux內(nèi)核分析尤其如此。
4.以功能為中心,各個擊破從功能上看,整個Linux系統(tǒng)可看作由進程管理機制、記憶體管理機制、檔系統(tǒng)、硬體驅(qū)動、系統(tǒng)調(diào)用等幾個部分組成。以功能為中心、各個擊破,就是指從這五個功能入手,通過源碼分析,找出Linux是怎樣實現(xiàn)這些功能的。
1.3.3Linux內(nèi)核分析方法
然而,由於內(nèi)核代碼的冗長,和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個很艱難、很需要毅力的事;在缺乏指導(dǎo)和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時的幾種方法:
5.使用閱讀源代碼的工具和交叉參考網(wǎng)站分析核心的一部分代碼通常會要查看其他的幾個相關(guān)的檔,而且這些檔可能還不在同一個子目錄下,很快就會忘記原來在幹什麼。因此,沒有一個好的工具是不行的。由於大多數(shù)人常用Window系列平臺,在此介紹一個Window下的一個閱讀源代碼的工具:SourceInsight。該軟體可以從因特網(wǎng)下載。思考與練習(xí)
1.什麼是操作系統(tǒng)?它有哪些基本功能與基本特徵?
2.怎樣理解“操作系統(tǒng)本身是一個併發(fā)系統(tǒng)”?
3.什麼是批處理、即時、分時系統(tǒng)?它們有什麼特徵?各適用哪些場合?
4網(wǎng)路操作系統(tǒng)最基本的功能是什麼?它最使你感興趣的是什麼?
2.1操作系統(tǒng)的啟動
一般來說,操作系統(tǒng)的引導(dǎo)過程分兩個步驟。首先,電腦硬體經(jīng)過開機自檢(PowerOnSelf-Test,POST)之後,從軟碟或硬碟的固定位置裝載一小段代碼,這段代碼一般稱為“引導(dǎo)裝載器”。然後,由引導(dǎo)裝載器負(fù)責(zé)裝入並運行操作系統(tǒng)。引導(dǎo)裝載器非常小,一般只有幾百個位元組,而操作系統(tǒng)龐大而複雜。上述分成兩階段的引導(dǎo)過程,可將電腦中的固化軟體保持得足夠小,同時也便於實現(xiàn)對不同操作系統(tǒng)的引導(dǎo)。2.1.1系統(tǒng)引導(dǎo)過程簡介
系統(tǒng)啟動過程主要由以下幾個步驟組成(以硬碟啟動為例):(1)開機(2)BIOS加電自檢(PowerOnSelfTest,POST),記憶體地址為0ffff:0000(3)將硬碟第一個扇區(qū)(0頭0道1扇區(qū),也就是BootSector)讀入記憶體地址0000:7c00處。(4)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則轉(zhuǎn)去嘗試其他啟動介質(zhì),如果沒有其他啟動介質(zhì)則顯示"NoROMBASIC"然後死機。(5)跳轉(zhuǎn)到0000:7c00處執(zhí)行MBR中的程式。(6)MBR首先將自己複製到0000:0600處,然後繼續(xù)執(zhí)行。(7)在主分區(qū)表中搜索標(biāo)誌為活動的分區(qū)。如果發(fā)現(xiàn)沒有活動分區(qū)或有不止一個活動分區(qū),則停止。(8)將活動分區(qū)的第一個扇區(qū)讀入記憶體地址0000:7c00處。(9)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示"MissingOperatingSystem"然後停止,或嘗試軟碟啟動。(10)跳轉(zhuǎn)到0000:7c00處繼續(xù)執(zhí)行特定系統(tǒng)的啟動程式。(11)啟動系統(tǒng)。以上步驟中2,3,4,5步是由BIOS的引導(dǎo)程式完成。6,7,8,9,10步由MBR中的引導(dǎo)程式完成。一般多系統(tǒng)引導(dǎo)程式(如SmartBootManager、BootStar、PQBoot等)都是將標(biāo)準(zhǔn)主引導(dǎo)記錄替換成自己的引導(dǎo)程式,在運行系統(tǒng)啟動程式之前讓用戶選擇要啟動的分區(qū)。而某些系統(tǒng)自帶的多系統(tǒng)引導(dǎo)程式(如LILO,NTLoader等)則可以將自己的引導(dǎo)程式放在系統(tǒng)所處分區(qū)的第一個扇區(qū)中,在Linux中即為是兩個扇區(qū)的SuperBlock。注:以上各步驟中使用的是標(biāo)準(zhǔn)MBR,其他多系統(tǒng)引導(dǎo)程式的引導(dǎo)過程與此不同。2.1.2硬碟結(jié)構(gòu)
1.硬碟參數(shù)當(dāng)硬碟的容量還非常小的時候,人們採用與軟碟類似的結(jié)構(gòu)生產(chǎn)硬碟。硬碟盤片的每一條磁軌都具有相同的扇區(qū)數(shù)。由此產(chǎn)生了所謂的3D參數(shù)(DiskGeometry)以及相應(yīng)的尋址方式。到目前為止,通常還是沿用這種CHS(Cylinder/Head/Sector)來表示硬碟參數(shù)。其中:磁頭數(shù)(Heads)表示硬碟總共有幾個磁頭,也就是有幾面盤片,最大為256(用8個二進位位存儲);柱面數(shù)(Cylinders)表示硬碟每一面盤片上有幾條磁軌,最大為1024(用10個二進位位存儲);扇區(qū)數(shù)(Sectorspertrack)表示每一條磁軌上有幾個扇區(qū),最大為63(用6個二進位位存儲)。每個扇區(qū)一般是512個位元組。2.基本INT13H調(diào)用簡介
BIOSint13H調(diào)用是BIOS提供的磁片基本輸入輸出中斷調(diào)用,它可以完成磁片(包括硬碟和軟碟)的複位、讀寫、校驗、定位、診斷和格式化等功能。它使用的是CHS尋址方式,因此最大只能訪問8GB左右的硬碟(本文中如不作特殊說明,均以1M=1048576位元組為單位)。3.現(xiàn)代硬碟結(jié)構(gòu)簡介在老式硬碟中,由於每個磁軌的扇區(qū)數(shù)相等,所以外道的記錄密度要遠(yuǎn)低於內(nèi)道,因此會浪費很多磁片空間。為了進一步提高硬碟容量,人們改用等密度結(jié)構(gòu)生產(chǎn)硬碟。也就是說,外圈磁軌的扇區(qū)比內(nèi)圈磁軌多。採用這種結(jié)構(gòu)後,硬碟不再具有實際的3D參數(shù),尋址方式也改為線性尋址,即以扇區(qū)為單位進行尋址。為了與使用3D尋址的老軟體相容(如使用BIOSINT13H介面的軟體),在硬碟控制器內(nèi)部安裝了一個地址翻譯器,由它負(fù)責(zé)將老式3D參數(shù)翻譯成新的線性參數(shù)。不同的工作模式(如LBA、LARGE、NORMAL)對應(yīng)不同的3D參數(shù)。4.擴展INT13H
雖然現(xiàn)代硬碟都已經(jīng)採用了線性尋址,但是由於基本INT13H的制約,使用BIOS的INT13H介面的程式(如DOS等)還只能訪問8G以內(nèi)的硬碟空間。為了打破這一限制,Microsoft等幾家公司制定了擴展INT13H標(biāo)準(zhǔn)(ExtendedINT13H),採用線性尋址方式存取硬碟,突破了8G的限制,並還加入了對可拆卸介質(zhì)(如活動硬碟)的支持。2.1.3引導(dǎo)扇區(qū)
1.BootSector的組成
BootSector也就是硬碟的第一個扇區(qū),它由MBR(MasterBootRecord),DPT(DiskPartitionTable)和BootRecordID三部分組成。MBR又稱作主引導(dǎo)記錄,佔用BootSector的前446個位元組(0to0x1BD),存放系統(tǒng)主引導(dǎo)程式(它負(fù)責(zé)從活動分區(qū)中裝載並運行系統(tǒng)引導(dǎo)程式)。DPT即主分區(qū)表佔用64個位元組(0x1BEto0x1FD),記錄了磁片的基本分區(qū)資訊。主分區(qū)表分為四個分區(qū)項,每項16位元組,分別記錄了每個主分區(qū)的資訊(因此最多可以有四個主分區(qū))。BootRecordID即引導(dǎo)區(qū)標(biāo)記佔用兩個位元組(0x1FEand0x1FF),對於合法引導(dǎo)區(qū),它等於0xAA55,這是判別引導(dǎo)區(qū)是否合法的標(biāo)誌。BootSector的具體結(jié)構(gòu)如下圖所示:2.分區(qū)表結(jié)構(gòu)簡介分區(qū)表由四個分區(qū)項構(gòu)成,每一項的結(jié)構(gòu)如下:BYTEState:分區(qū)狀態(tài),0=未啟動,0x80=啟動(注意此項)BYTEStartHead:分區(qū)起始磁頭號WORDStartSC:分區(qū)起始扇區(qū)和柱面號,底字節(jié)的低6位為扇區(qū)號,高2位為柱面號的第9,10位,高位元組為柱面號的低8位BYTEType:分區(qū)類型,如0x0B=FAT32,0x83=Linux等,00表示此項未用BYTEEndHead:分區(qū)結(jié)束磁頭號WORDEndSC:分區(qū)結(jié)束扇區(qū)和柱面號,定義同前DWORDRelative:線上性尋址方式下的分區(qū)相對扇區(qū)地址(對於基本分區(qū)即為絕對地址)DWORDSectors:分區(qū)大小(總扇區(qū)數(shù))
在DOS/Windows系統(tǒng)下,基本分區(qū)必須以柱面為單位劃分(Sectors*Heads個扇區(qū)),如對於CHS為764/256/63的硬碟,分區(qū)的最小尺寸為256*63*512/1048576=7.875MB。由於硬碟的第一個扇區(qū)已經(jīng)被引導(dǎo)扇區(qū)佔用,所以一般來說,硬碟第一個磁軌(0頭0道)的其餘62個扇區(qū)是不會被分區(qū)佔用的。某些分區(qū)軟體甚至將第一個柱面全部空出來。3.擴展分區(qū)由於主分區(qū)表中只能分四個分區(qū),無法滿足需求,因此設(shè)計了一種擴展分區(qū)格式。基本上說,擴展分區(qū)的資訊是以鏈表形式存放的,但也有一些特別的地方。
首先,主分區(qū)表中要有一個基本擴展分區(qū)項,所有擴展分區(qū)都隸屬於它,也就是說其他所有擴展分區(qū)的空間都必須包括在這個基本擴展分區(qū)中。對於DOS/Windows來說,擴展分區(qū)的類型為0x05或0x0F(LBA模式)。除基本擴展分區(qū)以外的其他所有擴展分區(qū)則以鏈表的形式級聯(lián)存放,後一個擴展分區(qū)的資料項目記錄在前一個擴展分區(qū)的分區(qū)表中,但兩個擴展分區(qū)的空間並不重疊。
擴展分區(qū)類似於一個完整的硬碟,必須進一步分區(qū)才能使用。但每個擴展分區(qū)中只能存在一個其他分區(qū)。此分區(qū)在DOS/Windows環(huán)境中即為邏輯盤。因此每一個擴展分區(qū)的分區(qū)表(同樣存儲在擴展分區(qū)的第一個扇區(qū)中)中最多只能有兩個分區(qū)資料項目(包括下一個擴展分區(qū)的資料項目)。以上所有擴展分區(qū)表中的第二個分區(qū)項(指向下一個擴展分區(qū))的相對扇區(qū)地址均相對於主擴展分區(qū),而不是前一個擴展分區(qū)。
2.2Linux的引導(dǎo)過程
不同電腦平臺引導(dǎo)過程的區(qū)別主要在於第一階段的引導(dǎo)過程。對PC機上的Linux系統(tǒng)而言,電腦(即BIOS)負(fù)責(zé)從軟碟或硬碟的第一個扇區(qū)(即引導(dǎo)扇區(qū))中讀取引導(dǎo)裝載器,然後,由引導(dǎo)裝載器從磁片或其他位置裝入操作系統(tǒng)。從軟碟引導(dǎo)時,BIOS讀取並運行引導(dǎo)扇區(qū)中的代碼。引導(dǎo)扇區(qū)中的代碼讀取軟碟前幾百個塊(依賴於實際的內(nèi)核大?。会釋⑦@些代碼放置在預(yù)先定義好的記憶體位置。利用軟碟引導(dǎo)Linux時,沒有檔系統(tǒng),內(nèi)核處於連續(xù)的扇區(qū)中,這樣安排可簡化引導(dǎo)過程。但是,如果利用LILO(LInuxLOader)也可從包含檔系統(tǒng)的軟碟上引導(dǎo)Linux。
從硬碟引導(dǎo)時,由於硬碟是可分區(qū)的,因此引導(dǎo)過程比軟碟複雜一些。BIOS首先讀取並運行硬碟主引導(dǎo)記錄中的代碼,這些代碼首先檢驗主引導(dǎo)記錄中的分區(qū)表,尋找到活動分區(qū)(即標(biāo)誌為可引導(dǎo)分區(qū)的分區(qū)),然後讀取並運行活動分區(qū)之引導(dǎo)扇區(qū)中的代碼?;顒臃謪^(qū)引導(dǎo)扇區(qū)的作用和軟碟引導(dǎo)扇區(qū)的作用一樣:從分區(qū)中讀取內(nèi)核映象並啟動內(nèi)核。和軟碟引導(dǎo)不同的是,內(nèi)核映象保存在硬碟分區(qū)檔系統(tǒng)中,而不象軟碟那樣保存在後續(xù)的連續(xù)扇區(qū)中,因此,硬碟引導(dǎo)扇區(qū)中的代碼還需要定位內(nèi)核映象在檔系統(tǒng)中的位置,然後裝載內(nèi)核並啟動內(nèi)核。Linux系統(tǒng)的常見引導(dǎo)方式有兩種:LILO引導(dǎo)和Loadin引導(dǎo);其中LILO可實現(xiàn)多重引導(dǎo),Loadin可在DOS下引導(dǎo)Linux。此外,Linux內(nèi)核也自帶了一個bootsect-loader。由於bootsect-loader只能實現(xiàn)Linux的引導(dǎo),不像前兩個那樣具有很大的靈活性,所以在普通應(yīng)用場合實際上很少使用。但由於bootsect-loader短小、沒有多餘的代碼、並且是內(nèi)核源碼的有機組成部分。下麵將主要對bootsect-loader檔進行分析。bootsect-loader在內(nèi)和源碼中對應(yīng)的程式是/arch/i386/boot/bootsect.s。幾個相關(guān)檔是:(1)/arch/i386/boot/bootsect.s(2)/include/linux/config.h(3)/include/asm/boot.h(4)/include/linux/autoconf.h2.2.1Linux系統(tǒng)引導(dǎo)過程分析
開啟Intelx86PC的電源後,機器就會開始執(zhí)行ROMBIOS的一系列系統(tǒng)測試動作,包括檢查RAM、鍵盤、顯示器和軟硬磁片等。接著控制權(quán)轉(zhuǎn)移給ROM中的啟動程式(ROMbootstraproutine);該程式會將磁片上的第0軌第0扇區(qū)(稱為bootsector或MasterBootRecord,MBR,系統(tǒng)的引導(dǎo)程式就放在此處)讀入記憶體,放入自0x07C0:0x0000開始的512個位元組處;然後處理機跳轉(zhuǎn)到該處開始執(zhí)行(位於該處的)MBR引導(dǎo)程式,CS:IP=0x07C0:0x0000。加電後處理機運行在與8086相相容的實模式下。如果要用bootsect-loader進行系統(tǒng)引導(dǎo),則必須把bootsect.s編譯連接後對應(yīng)的二進位代碼置於MBR;當(dāng)ROMBIOS把bootsect.s編譯連接後對應(yīng)的二進位代碼裝入記憶體後,機器的控制權(quán)就完全轉(zhuǎn)交給bootsect;也就是說,bootsect將是第一個被讀入記憶體中並執(zhí)行的程式。Bootsect接管機器控制權(quán)後,將依次進行以下一些動作:(1)首先,bootsect將它“自己”(自位置0x07C0:0x0000開始的512個位元組)從被ROMBIOS載入的地址0x07C0:0x0000處搬到0x9000:0000處;這一任務(wù)由bootsect.s的前十條指令完成;第十一條指令“jmpigo,INITSEG”則把機器跳轉(zhuǎn)到“新”的bootsect的“jmpigo,INITSEG”後的那條指令“go:movdi,#0x4000-12”;之後,繼續(xù)執(zhí)行bootsect的剩下的代碼;在bootsect.s中定義了幾個常量:BOOTSEG=0x07C0bios載入MBR的約定位置的段址;INITSEG=0x9000bootsect.s的前十條指令將自己搬到此處(段址)SETUPSEG=0x9020裝入Setup.s的段址SYSSEG=0x1000系統(tǒng)區(qū)段址這些常量的定義可參見/include/asm/boot.h;在下面的分析中這些常量會經(jīng)常用到。(2)以0x9000:0x4000-12為棧底,建立自己的棧區(qū);其中0x9000:0x4000-12到0x9000:0x4000的一十二個位元組預(yù)留作磁片參數(shù)表區(qū);(3)在0x9000:0x4000-12到0x9000:0x4000的一十二個預(yù)留位元組中建立新的磁片參數(shù)表。由於設(shè)計者考慮到有些老的bios不能準(zhǔn)確地識別磁片每個磁軌的扇區(qū)數(shù),使得bios建立的磁片參數(shù)表妨礙磁片的最高性能發(fā)揮,所以設(shè)計者在bios建立的磁片參數(shù)表的基礎(chǔ)上使用枚舉法測試,試圖建立準(zhǔn)確的“新”的磁片參數(shù)表(這是在後繼步驟中完成的);並把參數(shù)表的位置由原來的0x0000:0x0078搬到0x9000:0x4000-12;且修改老的磁片參數(shù)表區(qū)使之指向新的磁片參數(shù)表;(4)接下來是load_setup子過程;它調(diào)用0x13中斷的第2號服務(wù);把第0道第2扇區(qū)開始的連續(xù)的setup_sects(為常量4)個扇區(qū)讀到緊鄰bootsect的記憶體區(qū);,即0x9000:0x0200開始的2048個位元組;而這四個扇區(qū)的內(nèi)容就是/arch/i386/boot/setup.s編譯連接後對應(yīng)的二進位代碼。換句話說,如果要用bootsect-loader進行系統(tǒng)引導(dǎo),不僅必須把bootsect.s編譯連接後對應(yīng)的二進位代碼置於MBR,而且還要將\把setup.s編譯連接後對應(yīng)的二進位代碼置於緊跟MBR後的連續(xù)的四個扇區(qū)中。由於setup.s對應(yīng)的可執(zhí)行碼是由bootsect裝載的,所以可以根據(jù)需要修改bootsect來設(shè)置setup.s對應(yīng)的可執(zhí)行碼;(5)load_setup子過程的惟一出口是probe_loop子過程;該過程通過枚舉法測試磁片“每個磁軌的扇區(qū)數(shù)”;(6)接下來幾個子過程比較清晰:顯示“Loading”;讀入系統(tǒng)到0x1000:0x0000;關(guān)掉軟驅(qū)馬達(dá);根據(jù)的5步測出的“每個磁軌的扇區(qū)數(shù)”確定磁片類型;最後跳轉(zhuǎn)到0x9000:0x0200,即setup.s對應(yīng)的可執(zhí)行碼的入口,將機器控制權(quán)轉(zhuǎn)交setup.s;整個bootsect代碼運行完畢。引導(dǎo)過程執(zhí)行完後的記憶體映像圖如圖2.3所示。完成了系統(tǒng)的引導(dǎo)後,系統(tǒng)將進入到初始化處理階段。系統(tǒng)的初始化分為實模式和保護模式兩部分。為了簡單起見,在上面的分析中,忽略了對大內(nèi)核的處理的分析。因為對大內(nèi)核的處理,只是此引導(dǎo)過程中的一個很小的部分,並不影響對整體的把握。2.2.2實模式下的初始化
實模式下的初始化,主要是指從內(nèi)核引導(dǎo)成功後,到進入保護模式之前系統(tǒng)所做的一些處理。在內(nèi)核源碼中對應(yīng)的程式是/arch/i386/boot/setup.s;以下部分主要對該檔進行分析。這部分的分析要弄懂它的處理流程和INITSEG(9000:0000)段參數(shù)表的建立的過程。該參數(shù)表包含了很多硬體參數(shù),這些都是以後進行保護模式下初始化以及核心建立的基礎(chǔ)。相關(guān)檔有:
/arch/i386/boot/bootsect.s/include/linux/config.h/include/asm/boot.h /include/asm/segment.h/include/linux/version.h/include/linux/compile.h
setup.s完成在實模式下版本檢查,並將硬碟、滑鼠及記憶體的參數(shù)寫入到INITSEG中,並負(fù)責(zé)進入保護模式。實模式下的初始化過程如圖2.4及圖2.5所示:
圖2.4實模式下的初始化過程1圖2.5實模式下的初始化過程2表2.1INITSEG(9000:0000)段參數(shù)表:(參見include/linux/tty.h)參數(shù)名偏移量(段址均為0x9000)長度Byte參考檔PARAM_CURSOR_POS0x00002arch/i386/boot/video.sextendedmemSize0x00022arch/i386/boot/setup.sPARAM_VIDEO_PAGE0x00042arch/i386/boot/video.sPARAM_VIDEO_MODE0x00061arch/i386/boot/video.sPARAM_VIDEO_COLS0x00071arch/i386/boot/video.s未用0x00082include/linux/tty.hPARAM_VIDEO_EGA_BX0x000a2arch/i386/boot/video.s未用0x000c2include/linux/tty.hPARAM_VIDEO_LINES0x000e1arch/i386/boot/video.sPARAM_HAVE_VGA0x000f1arch/i386/boot/video.sPARAM_FONT_POINTS0x00102arch/i386/boot/video.sPARAM_LFB_WIDTH0x00122arch/i386/boot/video.sPARAM_LFB_HEIGHT0x00142arch/i386/boot/video.sPARAM_LFB_DEPTH0x00162arch/i386/boot/video.sPARAM_LFB_BASE0x00184arch/i386/boot/video.sPARAM_LFB_SIZE0x001c4arch/i386/boot/video.s暫未用①0x00204include/linux/tty.hPARAM_LFB_LINELENGTH0x00242arch/i386/boot/video.sPARAM_LFB_COLORS0x00266arch/i386/boot/video.s暫未用②0x002c2arch/i386/boot/video.sPARAM_VESAPM_SEG0x002e2arch/i386/boot/video.sPARAM_VESAPM_OFF0x00302arch/i386/boot/video.sPARAM_LFB_PAGES0x00322arch/i386/boot/video.s保留0x0034--0x003f
include/linux/tty.hAPMBIOSVersion③0x00402arch/i386/boot/setup.sBIOScodesegment0x00422arch/i386/boot/setup.sBIOSentryoffset0x00444arch/i386/boot/setup.sBIOS16bitcodeseg0x00482arch/i386/boot/setup.sBIOSdatasegment0x004a2arch/i386/boot/setup.s支持32位標(biāo)誌④0x004c2arch/i386/boot/setup.sBIOScodeseglength0x004e4arch/i386/boot/setup.sBIOSdataseglength0x00522arch/i386/boot/setup.shd0參數(shù)0x008016arch/i386/boot/setup.shd0參數(shù)0x009016arch/i386/boot/setup.sPS/2device標(biāo)誌⑤0x01ff1arch/i386/boot/setup.s
注:①include/linux/tty.h:CL_MAGICandCL_OFFSEThere②include/linux/tty.h:unsignedcharrsvd_size;//0x2cunsignedcharrsvd_pos;//0x2d③0表示沒有電源管理(APM)BIOS④0x0002置位表示支持32位模式⑤0表示沒有,0x0aa表示有滑鼠器2.2.3保護模式下的初始化
保護模式下的初始化,是指處理機進入保護模式後到運行系統(tǒng)第一個內(nèi)核程式過程中,系統(tǒng)所做的一些處理。保護模式下的初始化在內(nèi)核源碼中對應(yīng)的程式是/arch/i386/boot/compressed/head.s和/arch/i386/kernel/head.s;以下部分主要是針對這兩個檔進行的分析。在i386體系結(jié)構(gòu)中,因為i386本身的問題,在"arch/alpha/kernel/head.s"中需要更多的設(shè)置,最終是通過callSYMBOL_NAME(start_kernel)轉(zhuǎn)到start_kernel()這個體系結(jié)構(gòu)無關(guān)的函數(shù)中去執(zhí)行了。
在i386系統(tǒng)中,當(dāng)內(nèi)核以bzImage的形式壓縮,即大內(nèi)核方式(BIG_KERNEL)壓縮時就需要預(yù)先處理bootsect.s和setup.s,按照大核模式使用$(CPP)處理生成bbootsect.s和bsetup.s,然後再編譯生成相應(yīng)的.o檔,並使用"arch/i386/boot/compressed/build.c"生成的build工具,將實際的內(nèi)核(未壓縮的,含kernel中的head.s代碼)與"arch/i386/boot/compressed"下的head.s和misc.c合成到一起,其中的head.s代替了"arch/i386/kernel/head.s"的位置,由Bootloader引導(dǎo)執(zhí)行(startup_32入口),然後它調(diào)用misc.c中定義的decompress_kernel()函數(shù),使用"lib/inflate.c"中定義的gunzip()將內(nèi)核解壓到0x100000,再轉(zhuǎn)到其上執(zhí)行"arch/i386/kernel/head.s"中的startup_32代碼。幾個有關(guān)檔是:/arch/i386/boot/compressed/head.s/arch/i386/kernel/head.s//arch/i386/boot/compressed/MISC.c/arch/i386/boot/setup.s/include/asm/segment.h/arch/i386/kernel/traps.c/include/i386/desc.h/include/asm-i386/processor.h保護模式下的初始化過程大致如下:1./arch/i386/kernel/head.s流程因為在setup.s最後的是一條轉(zhuǎn)跳指令,跳到內(nèi)核第一條指令並開始執(zhí)行。指令中指向的是記憶體中的絕對地址,無法依此判斷轉(zhuǎn)跳到了head.s。但是可以通過Makefile簡單的確定head.s位於內(nèi)核的前端。在arch/i386的Makefile中定義了HEAD:=arch/i386/kernel/head.o
在Linux總的Makefile中的語句includearch/$(ARCH)/Makefile說明HEAD定義在該檔中有效。由如下語句:vmlinux:$(CONFIGURATION)init/main.oinit/version.olinuxsubdirs$(LD)$(LINKFLAGS)$(HEAD)init/main.oinit/version.o\$(ARCHIVES)\$(FILESYSTEMS)\$(DRIVERS)\$(LIBS)-ovmlinux$(NM)vmlinux|grep-v'\(compiled\)\|\(\.o$$\)\|\(a\)'|sort>System.map從這個依賴關(guān)係可以獲得大量的資訊:(1)$(HEAD)即head.o
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論