Linux操作系统分析课件_第1页
Linux操作系统分析课件_第2页
Linux操作系统分析课件_第3页
Linux操作系统分析课件_第4页
Linux操作系统分析课件_第5页
已阅读5页,还剩884页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux系統概述

第1章Linux系統概述

Linux作為一個多任務、多用戶的操作系統,以其很好的穩定性贏得了廣大用戶,並迅速發展成為操作系統中的主流。本章簡單介紹Linux的基本概念、Linux操作系統的組成及Linux內核分析方法1.1Linux的特徵及組成

Linux系統是包含內核、系統工具、完整的開發環境和應用的類Unix操作系統。這個系統是由全世界各地的成千上萬的程式員設計和實現的。1984年,RichardStallman創立了GNU工程,其目標是開發一個完全免費的類Unix系統及其應用程式。1991年,芬蘭赫爾辛基大學一位名叫Linus

Torvalds的學生開始了開放源代碼的Linux雛形的設計。其目的是建立不受任何商品化軟體的版權制約的、全世界都能自由使用的Unix相容產品1.1Linux的特徵及組成

Linux系統是包含內核、系統工具、完整的開發環境和應用的類Unix操作系統。這個系統是由全世界各地的成千上萬的程式員設計和實現的。1984年,RichardStallman創立了GNU工程,其目標是開發一個完全免費的類Unix系統及其應用程式。1991年,芬蘭赫爾辛基大學一位名叫Linus

Torvalds的學生開始了開放源代碼的Linux雛形的設計。其目的是建立不受任何商品化軟體的版權制約的、全世界都能自由使用的Unix相容產品由於Linux是一套具有Unix全部功能的免費操作系統,它在眾多的軟體中佔有很大的優勢,為廣大的電腦愛好者提供了學習、探索以及修改電腦操作系統內核的機會1.1.1Linux的主要特性1開放性

開放性是指系統遵循遵循開放系統互連(OpenSystemsInterconnection,OSI)國際標準。凡遵循國際標準所開發的硬體和軟體,都能彼此相容,可方便地實現互連。2多用戶

多用戶是指系統資源可以被不同用戶各自擁有使用,即每個用戶對自己的資源(例如:檔、設備)有特定的許可權,互不影響。Linux和Unix都具有多用戶的特性。

1.1.1Linux的主要特性3多任務

多任務是現代電腦的最主要的一個特點。它是指電腦同時執行多個程式,而且各個程式的運行互相獨立。4良好的用戶介面

Linux向用戶提供了兩種介面:用戶介面和系統調用5設備獨立性

設備獨立性是指操作系統把所有外部設備統一當作成文件來看待,只要安裝它們的驅動程式,任何用戶都可以像使用檔一樣,操縱、使用這些設備,而不必知道它們的具體存在形式。

1.1.1Linux的主要特性6.豐富的網路功能

完善的內置網路是Linux的一大特點。Linux在通信和網路功能方面優於其他操作系統。7可靠的系統安全

Linux採取了許多安全技術措施,包括對讀、寫進行許可權控制、帶保護的子系統、審計跟蹤、核心授權等,這為網路多用戶環境中的用戶提供了必要的安全保障。

8良好的可移植性

可移植性是指將操作系統從一個平臺轉移到另一個平臺使它仍然能按其自身的方式運行的能力。

1.1.2Linux的組成

通常操作系統由內核和一些系統服務程式(命令解釋、庫檔、鏈接和編譯程序等)組成。內核是操作系統的靈魂,它為用戶進程提供了一個虛擬機介面。用戶進程可以並行運行、公平的佔用系統資源而互不干擾。1.

Linux內核

內核是系統的心臟,是運行程式和管理像磁片和印表機等硬體設備的核心程式。它從用戶那裏接受命令並把命令送給內核去執行。

2.

Linux

shell

shell是系統的用戶介面,提供了用戶與內核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內核去執行。

1.1.2Linux的組成3.

Linux檔結構/homebinprocusrbootlibdevetcvarzhengweiYMbinlibmantmplogrunspool1.1.2Linux的組成3.

Linux檔結構名稱

角色root

root檔系統中的內容包括:引導系統的必備檔,檔系統的掛裝資訊以及系統修復工具和備份工具等。/usr/usr檔系統中包含通常操作中不需要進行修改的命令程式檔、程式庫、手冊和其他文檔等。/var/var檔系統中包含經常變化的檔,例如印表機、郵件、新聞等的假脫機目錄、日誌檔、格式化後的手冊頁以及臨時檔等。

/homehome中包含用戶的主目錄,用戶的數據保存在其主目錄中

/proc

/proc檔系統並不保存在磁片上,相反,操作系統在內存中創建這一檔系統。

(1)root檔系統

root檔系統中包含一些關鍵檔,同時其內容也比較小。如果root檔系統被破壞,操作系統就無法正確引導。root檔系統中包含的檔和目錄見表1.2。表1.2root檔系統中的檔和目錄/vmlinuz

檔。系統的標準引導映像,通常以壓縮形式出現。

/bin

包含引導過程必需的命令,也可由普通用戶使用。/sbin和/bin類似,儘管其中的命令可由普通用戶使用,但由於這些命令屬於系統級命令,因此無特殊需求不使用其中的命令。/etc

包含與特定電腦相關的配置檔。/rootroot用戶的主目錄。/lib

root檔系統中的程式要使用的共用庫保存在該目錄中。表1.2root檔系統中的檔和目錄/lib/modules包含可裝載的內核模組。/dev

包含設備檔。/tmp包含臨時檔。引導後運行的程式應當在/var/tmp中保存檔,因為其中的可用空間大一些。/boot

包含引導裝載程式要使用的檔。內核映像通常保存在這個目錄中。因為多個內核映像會佔用很多磁片空間,因此可將該目錄放置在單獨的檔系統中。

/mnt臨時檔系統的掛裝點。/usr,/var,

/home,/proc其他檔系統的掛裝點。(2)/usr檔系統

/usr文件系统中包含所有的程序文件以及联机文档,因此其内容通常很大。/usr檔系統中包含的檔和目錄見表1.3。表1.3/usr檔系統中的目錄/usr/X11R6

包含X窗口系統的所有檔。

/usr/X386

和/usr/X11R6類似,但包含X11的Release5。/usr/bin

絕大多數用戶命令。其他命令包含在/bin和/usr/local/bin中。/usr/sbin

root檔系統中不需要的系統管理命令。/usr/man/usr/info/usr/doc

分別包含手冊頁、GNUInfo文檔以及其他雜項文檔。/usr/include

C語言的頭檔。

/usr/lib

程式和子系統所使用的不變的數據檔。/usr/local

本地掛裝的軟體和其他檔的存放位置。

(3)/var文件系统

/var包含系統運行過程中經常發生變化的檔。/var檔系統中包含的目錄見表1.4。表1.4/var檔系統中的目錄/var/catman格式化手冊頁的高速緩存。/var/lib包含系統運行時經常改變的檔。

/var/local安裝/usr/local中的程式的可變數據。/var/lock包含鎖檔。

/var/log包含程式產生的日誌檔。

/var/run該目錄包含在下次引導之前有效的、和系統相關的資訊/var/spool

排隊任務的假脫機目錄

/var/tmp包含大的臨時檔,或者保存時間較長的臨時檔。(4)/proc檔系統

/proc檔系統並不保存在磁片上,操作系統在內存中創建這一檔系統。/proc檔系統中包含的檔和目錄見表1.5。表1.5/proc檔系統中的檔和目錄/proc/1該目錄中包含進程號為1的進程資訊。每個進程在/proc目錄下有一個以自己的進程號為名稱的目錄。

/proc/cpuinfo

有關CPU名稱、型號、性能和類型的資訊。/proc/devices

當前內核中的設備驅動程式列表。

/proc/dma當前使用的DMA通道。

/proc/filesystems內核支持的檔系統。

/proc/interrupts當前使用的中斷資訊。/proc/ioports當前使用的I/O端口。/proc/kcore系統物理記憶體的映像。

4.

Linux實用工具

標準的Linux系統都有一套叫做實用工具的程式,它們是專門的程式,例如編輯器、執行標準的計算操作等。用戶也可以產生自己的工具。

1.2Linux內核的主要組成部分

操作系統一般由內核和一些系統程式組成,同時,還有一些應用程式幫助用戶完成特定任務。內核是操作系統的靈魂,它負責管理磁片上的檔、記憶體,負責啟動並運行程式,負責從網路上接收和發送數據包等等。

Linux內核主要是由進程調度、記憶體管理、虛擬檔系統、網路介面和進程間通信五部分組成。

(1)進程調度負責控制進程對CPU的訪問,調度程式使用一種策略確保所有的進程都能公平的訪問CPU,並且確保內核在任意時刻能執行必要的硬體操作。

(2)記憶體管理負責管理系統的物理記憶體,實現多進程安全享享電腦的記憶體。

1.2Linux內核的主要組成部分

(3)虛擬檔系統通過將各種設備抽象為一種公共介面,從而遮罩了各種硬體設備的細節。虛擬檔系統可以分為邏輯檔系統和設備驅動程式兩部分。

(4)網路介面提供了對各種網路標準的存取和各種網路硬體的支持,實現了對各種網路標準和網路硬體的訪問。網路介面可分為網路協議和網路驅動程式。網路協議部分負責實現每一種可能的網路傳輸協議。網路設備驅動程式負責與硬體設備通訊,每一種可能的硬體設備都有相應的設備驅動程式。1.2Linux內核的主要組成部分

(5)進程間通信子系統實現了系統內部進程間的多種通信機制。這五個子系統互相依賴,但相對來說進程調度處在比較重要的地位。其他子系統需要掛起和恢復進程的運行都必須依靠進程調度子系統的參與。

1.2.1記憶體管理

對任何一臺電腦而言,其記憶體以及其他資源都是有限的。為了讓有限的物理記憶體滿足應用程式對內存的大需求量,Linux採用了稱為“虛擬記憶體”的記憶體管理方式。Linux將記憶體劃分為容易處理的“記憶體頁”,在系統運行過程中,應用程式對內存的需求大於物理記憶體時,Linux可將暫時不用的記憶體頁交換到硬碟上,這樣,空閒的記憶體頁可以滿足應用程式的記憶體需求,應用程式卻不會注意到記憶體交換發生。

Linux的記憶體管理子系統採用分頁方式管理和使用物理記憶體資源。它根據不同的晶片採用不同層次的頁表系統(例如Alpha採用三層頁表,Intel採用兩層頁表)實現了進程的邏輯地址空間到物理記憶體地址的映射。因此兩個進程可以訪問相同的地址空間而使用不同的物理記憶體。1.2.1記憶體管理1.2.1記憶體管理1.2.1記憶體管理

為了改善系統的運行性能,Linux內核採用了多種Cach技術:緩存Cach、頁面Cach、交換Cach和硬體Cach。緩存Cach:它中存儲的是塊設備驅動模組使用的緩存數據。緩存Cach大小固定,使用設備識別字和塊號進行標識。它能大大的提高內核對外設的訪問速度。頁面Cach:它被用來加快對磁片上影像和數據的訪問速度。它緩存一個檔中邏輯頁面的內容,使用檔和文件中的偏移進行標識。交換Cach:只有被修改的頁面才被再次寫入到交換區中,那些已經在交換區中有備份,而且沒有修改的頁面將被直接丟棄。這樣可以大大的提高虛存交換的速度。硬體Cach:用在進程中的地址轉換,將用過的虛擬地址到物理地址的轉換緩存起來,當需要進行地址轉換時,系統不是直接去找頁表,而是在緩存中找。由於Linux系統採用多級頁表系統,因此這種技術可以大大的加快進程運行速度。1.2.1記憶體管理

記憶體管理子系統由三個模組組成:體系結構相關模組、體系結構獨立模組和系統調用模組。

(1)體系結構相關模組:實現了一個物理記憶體管理硬體的虛擬介面。(2)體系結構獨立模組:該模組實現了進程地址空間映射和虛擬記憶體交換,負責決定那些記憶體頁交換到檔系統中去。(3)系統調用介面:該模組用來為用戶進程提供有限的訪問許可權。該模塊允許用戶分配和釋放存儲區,將記憶體影像到I/O檔上。1.2.2進程調度

進程實際是某特定應用程式的一個運行實體。在Linux系統中,能夠同時運行多個進程,Linux通過在短的時間間隔內輪流運行這些進程而實現“多任務”。進程是系統分配資源的最小單位。一個進程就是一個運行實體。在Linux中,所有資源都是以進程為對象來進行分配的。Linux系統是一個多任務的系統,進程調度就是要保障各個進程能公平的使用系統的CPU資源。

1.2.2進程調度

Linux内核在保障进程运行效率的实现方面具有很多特点:(1)Linux設計了一系列的數據結構,它們能準確地描述進程的狀態和其資源使用情況,以便能公平有效地使用系統資源。Linux的調度演算法能確保不出現某些進程過度佔用系統資源而導致另一些進程無休止地等待的情況。這一方法從根本上保證了系統的高效和穩定。(2)Linux的進程創建採用了Copyonwrite技術,即不拷貝父進程的空間,而是拷貝父進程的頁表,使父進程和子進程共用物理空間,並將這個共用空間的訪問許可權置為只讀。當父進程和子進程的某一方進行寫操作時,Linux檢測到一個非法操作,這時才將要寫的頁進行複製。這一做法免除了只讀頁的複製,從而降低了開銷。

1.2.2進程調度

進程調度子系統可以分為四個模組:調度策略模組、體系結構相關模組、體系結構獨立模組和系統調用介面模組。(1)調度策略模組:該模組主要負責判斷哪個進程將訪問CPU。策略的制定必須保證所有進程可以得到比較公正的待遇。(2)體系結構相關模組:該模組被設計為將電腦特定體系結構抽象為一種公共介面。這些模組負責和CPU通信實現進程的掛起和運行。它們知道如何為進程保留那些寄存器和狀態資訊以及如何執行彙編代碼來實現進程的掛起和運行。(3)體系結構獨立模組:該模組和調度策略模組通信決定下一個該運行的進程,然後調用體系結構相關模組來恢復進程的運行。另外該模組還調用記憶體管理模組保證要運行的進程的記憶體得到的恢復。(4)系統調用介面模組:該模組只允許用戶進程訪問內核明確公佈的資源。這樣將用戶進程對內核的以來限制在一個很少變化的介面範圍內。

1.2.3設備驅動程式

設備驅動程式是Linux內核的主要部分。和操作系統的其他部分類似,設備驅動程式運行在高特權級的處理器環境中,從而可以直接對硬體進行操作,但正因為如此,任何一個設備驅動程式的錯誤都可能導致操作系統的崩潰。設備驅動程式實際控制操作系統和硬體設備之間的交互。設備驅動程式提供一組操作系統可理解的抽象介面完成和操作系統之間的交互,而與硬體相關的具體操作細節由設備驅動程式完成。一般而言,設備驅動程式和設備的控制晶片有關。例如,如果電腦硬碟是小型電腦系統介面(SmallComputerSystemInterface,SCSI)的硬碟,則需要使用SCSI驅動程式,而不是IDE(IntegratedDriveElectronics)驅動程式。1.2.4檔系統

Linux虚拟文件系统为用户提供了一个一种公共的接口,而不需要了解物理设备或逻辑系统的细节。系统允许系统管理员将在任何物理设备上的逻辑文件系统挂接在文件目录中。Linux支持幾種可執行檔格式。

Linux的虛擬檔系統由五個模組組成:設備驅動模組、設備獨立介面模組、邏輯檔系統模組、系統獨立介面模組和系統調用模組。

1.2.4檔系統

Linux虛擬檔系統為用戶提供了一個一種公共的介面,而不需要瞭解物理設備或邏輯系統的細節。系統允許系統管理員將在任何物理設備上的邏輯檔系統掛接在檔目錄中。Linux支持幾種可執行檔格式。

Linux的虛擬檔系統由五個模組組成:設備驅動模組、設備獨立介面模組、邏輯檔系統模組、系統獨立介面模組和系統調用模組。(1)設備驅動模組:該模組和具體的設備控制器相關。Linux支持大量的設備控制程式。(2)設備獨立介面模組:該模組提供了一種一致的設備視圖。(3)邏輯檔系統模組:針對不同的檔系統都有一個對應的邏輯檔系統模組。Linux主要採用EXT2(SecondExtendedFileSystem)檔系統。

1.2.4檔系統

(4)系統獨立介面模組:該模組提供了一種獨立於硬體和邏輯檔系統的統一視圖,它採用面向字元和麵向塊的檔介面來表示所有的資源。(5)系統介面模組:該模組限制了用戶對系統中功能的訪問保證了系統的安全。

1.2.5網路

TCP/IP協議是Internet的標準協議,同時也是事實上的工業標準。Linux的網路實現支持BSD套接字,支持全部的TCP/IP協議。Linux內核的網路部分由BSD套接字、網路協議層和網路設備驅動程式組成。

Linux網路介面子系統支持多種網路設備並支持各種網路協議,它將網路設備和協議的實現細節抽象化,使用戶不需要知道目前使用的網路設備和網路協議。

1.2.5網路Linux網路介面子系統由五個模組組成:網路設備驅動模組、設備獨立介面模組、網路協議模組、協議獨立介面模組和系統調用介面模組。

1.2.5網路Linux網路介面子系統由五個模組組成:網路設備驅動模組、設備獨立介面模組、網路協議模組、協議獨立介面模組和系統調用介面模組。(1)網路設備驅動模組:該模組針對各種網路設備進行編寫,它負責和硬體的通信工作。(2)設備獨立介面模組:該模組抽象了網路設備的實現細節,為子系統上層模組提供了一個一致的設備視圖。(3)網路協議模組:該模組中每個都實現了相應的網路傳輸協議。(4)網路協議獨立介面模組:該模組提供了一個與網路硬體和網路協議無關的介面,這樣內核可以在一個統一的視圖下訪問網路。(5)系統調用模組:該模組限制了用戶進程對子系統中各種功能的訪問。1.2.6其他

除上述主要組成部分之外,內核還包含一些一般性的任務和機制,這些任務和機制可使Linux內核的各個部分有效地組合在一起,它們是上述主要部分高效工作的必要保證。

Linux是單塊結構的操作系統。為了可方便地在內核中添加新的組件,Linux支持可動態裝載和卸載的模組,這樣可方便地在內核中添加新的組件或卸載不再需要的內核組件。1.2.6其他Linux提供了多種進程間的通信機制,其中,信號和管道是最基本的兩種。此外,Linux也提供SystemV的進程間通信機制,包括消息佇列、信號燈及共用記憶體。為了支持不同機器之間的進程通信,Linux還引入了BSD的Socket機制。1.2.6其他Linux提供了多種進程間的通信機制,其中,信號和管道是最基本的兩種。此外,Linux也提供SystemV的進程間通信機制,包括消息佇列、信號燈及共用記憶體。為了支持不同機器之間的進程通信,Linux還引入了BSD的Socket機制。

Linux內核採用了數據抽象技術。設備驅動程式、檔和網路協議等模組都作為一個獨立的模組存在,並且它們都支持一種公共的介面。1.2.6其他Linux內核還採用了分層的技術,將那些於硬體相關的模組和其他模組嚴格地分離,因此當系統移植到其他平臺時,不需要對內核做太大的修改。圖1.2說明了上述Linux內核的重要組成部分及其相互關係。圖1.2Linux内核的重要组成部分

用戶級程式

系統調用介面虛擬檔系統管理記憶體管理器進程管理器抽象網路程式檔系統驅動程式TCP/IP協議驅程IDE硬碟驅動程式軟碟驅動程式IDE硬碟軟碟以太網卡驅動程式以太網卡1.3Linux內核分析

所有主要Linux發行版本(如Craftworks,Debian、Slackware和Redhat)都包含了源碼在內。Linux系統核心就是從這些源碼中構造出來的。

Linux核心代碼的版本編號很簡單。任何偶數編號的核心(如2.0.30)都是穩定的發行版而奇數編號的核心(如2.1.42)都是正在開發的核心。開發版的核心是試用版本,但具有最新的特徵並支持最新的設備。1.3.1核心源碼的組織

核心源碼的頂層是/usr/src/linux目錄,在此目錄下可以看到大量子目錄:

arch這個子目錄包含了所有體系結構相關的核心代碼。它還包含每種支持的體系結構的子目錄,如i386。

include這個目錄包括了用來重構核心的大多數include檔。對於每種支持的體系結構分別有一個子目錄。

init此目錄包含核心啟動代碼。

mm此目錄包含了所有的記憶體管理代碼。與具體體系結構相關的記憶體管理代碼位於arch/mm目錄下,例如arch/i386/mm/fault.c。

1.3.1核心源碼的組織drivers系统中所有的设备驱动都位于该目录中。它又进一步划分成几类设备驱动,如block。

ipc此目錄包含了核心的進程間通訊代碼。

modules此目錄僅僅包含已建好的模組。

fs所有的檔系統代碼。它也被劃分成對應不同檔系統的子目錄,如vfat和ext2。

kernel主要核心代碼。同時與處理器結構相關代碼都放在arch/kernel目錄下。

net核心的網路部分代碼。

lib此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/lib/目錄下。

scripts此目錄包含用於配置核心的腳本檔(如awk和tk腳本)。1.3.2Linux內核源代碼的組成

閱讀核心某個部分經常要用到好幾個其他的相關檔,對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的瞭解。閱讀linux內核源代碼的基本要求是:

1、操作系統的基本知識。

2、對C語言比較熟悉,最好要有組合語言的知識和GNUC對標準C的擴展的知識的瞭解。另外,在閱讀之前還應該知道Linux內核源代碼的整體分佈情況。

Linux內核源代碼的組成如下1系統啟動與初始化在基於intel的系統上,Linux可以通過loadlin.exe或者LILO將核心載入記憶體並將控制傳遞給它。這部分程式位於arch/i386/kerneld/head.s。此檔完成一些處理器相關操作並跳轉到init/main.c中的main()例程。

2記憶體管理這部分代碼主要位於mm目錄裏,而與處理器結構相關部分在arch/mm中。頁面出錯處理代碼位於mm下的memory.c檔中,記憶體映射與頁面cache代碼位於filemap.c中。buffercache則在mm/buffer.c中實現,swapcache位於mm/swap_state.c和mm/swapfile.c中。Linux內核源代碼的組成3核心大多數通用代碼位於kernel目錄下,而處理器相關代碼被放在arch/kernel中。調度管理程式位於kernel/sched.c,fork代碼位於kernel/fork.c。底層部分處理及中斷處理的代碼位於include/linux/interrupt.h裏。在/linux/sched.h中可以找到task_struct的描敘。

4PCIPCI偽設備驅動位於drivers/pci/pci.c且其系統通用定義放在include/linux/pci.h中。每個處理器結構具有特殊的PCIBIOS代碼,AlphaAXP的位於arch/alpha/kernel/bios32.c中。Linux內核源代碼的組成如下5進程間通訊進程間通訊所有代碼都在ipc目錄中。系統VIPC對象都包含一個ipc_perm結構,它在include/linux/ipc.h中描敘。系統V消息在ipc/msg.c中實現,共用記憶體在ipc/shm.c而信號燈位於ipc/sem.c中。管道在ipc/pipe.c中實現。

6中斷處理核心的中斷處理代碼總是與微處理器結構相關。Intel系統的中斷處理代碼位於arch/i386/kernel/irq.c中,其定義位於include/asm-i386/irq.h中。

Linux內核源代碼的組成如下7設備驅動

Linux核心源碼的大多數都是設備驅動。所有Linux的設備驅動源碼都放在drivers目錄中並分成以下幾類:

/block块设备驱动包括IDE(在ide.c中)驅動。如果想尋找這些可包含檔系統的設備的初始化過程則應該在drivers/block/genhd.c中的device_setup()。當安裝一個nfs檔系統時不但要初始化硬碟還需初始化網路。塊設備包括IDE與SCSI設備。

/char此目錄包含字元設備的驅動,如ttys,串行口以及滑鼠。Linux內核源代碼的組成7設備驅動

Linux核心源碼的大多數都是設備驅動。所有Linux的設備驅動源碼都放在drivers目錄中並分成以下幾類:

/cdrom包含所有LinuxCDROM代碼。在這裏可以找到某些特殊的CDROM設備(如SoundblasterCDROM)。IDE介面的CD驅動位於drivers/block/ide-cd.c中而SCSICD驅動位於drivers/scsi/scsi.c中。

/pci它包含了PCI偽設備驅動源碼。這裏可以找到關於PCI子系統映射與初始化的代碼。另外位於arch/alpha/kernel/bios32.c中的AlphaAXPPCI補丁代碼也值得一讀。

Linux內核源代碼的組成7設備驅動

Linux核心源碼的大多數都是設備驅動。所有Linux的設備驅動源碼都放在drivers目錄中並分成以下幾類:

/scsi這裏可以找到所有的SCSI代碼以及Linux支持的SCSI設備的設備驅動。

/net包含網路驅動源碼,如tulip.c中的DECChip21040PCI以太網驅動。

/sound所有的聲卡驅動源碼。

Linux內核源代碼的組成8檔系統

EXT2檔系統的源碼位於fs/ext2中,其數據結構定義位於include/linux/ext2_fs.h,ext2_fs_i.h以及ext2_fs_sb.h中。虛擬檔系統數據結構在include/linux/fs.h中描敘且其代碼在fs//中。buffercache和update核心後臺進程在fs/buffer.c中實現。

9網路網路代碼位於net目錄而大多數包含檔位於include/net中。BSD套介面代碼位於net/socket.c中。IPV4的INET套介面代碼位於net/ipv4/af_inet.c中。通用協議支撐代碼(包括sk_buff處理過程)位於net/core中,同時TCP/IP網路代碼位於net/ipv4中。網路設備驅動位於drivers/net中。

Linux內核源代碼的組成10核心模組核心模組代碼部分位於核心中部分位於modules包中。核心代碼位於kernel/modules.c且其數據結構與核心後臺進程kerneld消息位於include/linux/module.h和include/linux/kerneld.h目錄中。同時必要時需查閱include/linux/elf.h中的ELF檔格式。1.3.3Linux內核分析方法

Linux的最大的優點之一就是它的源碼公開。首先是可以從中學到很多的電腦的底層知識,如後面將講到的系統的引導和硬體提供的中斷機制等;其他,如虛擬存儲的實現機制、多任務機制、系統保護機制等等,這些都是非讀源碼不能體會的。其次是可以從操作系統的整體結構中,體會整體設計在軟體設計中的份量和作用,以及一些宏觀設計的方法和技巧:Linux的內核為上層應用提供一個與具體硬體不相關的平臺;同時在內核內部,它又把代碼分為與體系結構和硬體相關的部分,和可移植的部分;再例如,Linux雖然不是微內核的,但它把大部分的設備驅動處理成相對獨立的內核模組,這樣減小了內核運行的開銷,增強了內核代碼的模組獨立性。

1.3.3Linux內核分析方法

再是能從對內核源碼的分析中,體會到它在解決某個具體細節問題時的巧妙方法,如Linux通過Botoom_half機制來加快系統對中斷的處理。最重要的是:在源碼的分析過程中,讀者將會被慢慢地、潛移默化地專業化。專業的程式員總是把代碼的清晰性,相容性,可移植性放在很重要的位置。1.3.3Linux內核分析方法

然而,由於內核代碼的冗長,和內核體系結構的龐雜,所以分析內核也是一個很艱難、很需要毅力的事;在缺乏指導和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時的幾種方法:

1.弄懂源碼的檔組織形式要分析Linux內核源碼,首先必須找到各個模組的位置,即搞清楚源碼的檔組織形式。

2.以程式流程為線索,一線串珠第二種方法是“以程式流程為線索、一線串珠”,就是指根據程式的執行流程,把程式執行過程所涉及到的代碼分析清楚。這種方法最典型的應用有兩個:一是系統的初始化過程;二是應用程式的執行流程:從程式的裝載,到運行,一直到程式的退出。

1.3.3Linux內核分析方法

然而,由於內核代碼的冗長,和內核體系結構的龐雜,所以分析內核也是一個很艱難、很需要毅力的事;在缺乏指導和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時的幾種方法:

3.以數據結構為基點,觸類旁通結構化程式設計思想認為:數據結構+演算法=程式。數據結構體現了整個系統的構架,所以數據結構通常都是代碼分析的很好的著手點,對Linux內核分析尤其如此。

4.以功能為中心,各個擊破從功能上看,整個Linux系統可看作由進程管理機制、記憶體管理機制、檔系統、硬體驅動、系統調用等幾個部分組成。以功能為中心、各個擊破,就是指從這五個功能入手,通過源碼分析,找出Linux是怎樣實現這些功能的。

1.3.3Linux内核分析方法

然而,由於內核代碼的冗長,和內核體系結構的龐雜,所以分析內核也是一個很艱難、很需要毅力的事;在缺乏指導和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時的幾種方法:

5.使用閱讀源代碼的工具和交叉參考網站分析核心的一部分代碼通常會要查看其他的幾個相關的檔,而且這些檔可能還不在同一個子目錄下,很快就會忘記原來在幹什麼。因此,沒有一個好的工具是不行的。由於大多數人常用Window系列平臺,在此介紹一個Window下的一個閱讀源代碼的工具:SourceInsight。該軟體可以從因特網下載。思考與練習

1.什麼是操作系統?它有哪些基本功能與基本特徵?

2.怎樣理解“操作系統本身是一個併發系統”?

3.什麼是批處理、即時、分時系統?它們有什麼特徵?各適用哪些場合?

4網路操作系統最基本的功能是什麼?它最使你感興趣的是什麼?

2.1操作系統的啟動

一般來說,操作系統的引導過程分兩個步驟。首先,電腦硬體經過開機自檢(PowerOnSelf-Test,POST)之後,從軟碟或硬碟的固定位置裝載一小段代碼,這段代碼一般稱為“引導裝載器”。然後,由引導裝載器負責裝入並運行操作系統。引導裝載器非常小,一般只有幾百個位元組,而操作系統龐大而複雜。上述分成兩階段的引導過程,可將電腦中的固化軟體保持得足夠小,同時也便於實現對不同操作系統的引導。2.1.1系統引導過程簡介

系統啟動過程主要由以下幾個步驟組成(以硬碟啟動為例):(1)開機(2)BIOS加電自檢(PowerOnSelfTest,POST),記憶體地址為0ffff:0000(3)將硬碟第一個扇區(0頭0道1扇區,也就是BootSector)讀入記憶體地址0000:7c00處。(4)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則轉去嘗試其他啟動介質,如果沒有其他啟動介質則顯示"NoROMBASIC"然後死機。(5)跳轉到0000:7c00處執行MBR中的程式。(6)MBR首先將自己複製到0000:0600處,然後繼續執行。(7)在主分區表中搜索標誌為活動的分區。如果發現沒有活動分區或有不止一個活動分區,則停止。(8)將活動分區的第一個扇區讀入記憶體地址0000:7c00處。(9)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示"MissingOperatingSystem"然後停止,或嘗試軟碟啟動。(10)跳轉到0000:7c00處繼續執行特定系統的啟動程式。(11)啟動系統。以上步驟中2,3,4,5步是由BIOS的引導程式完成。6,7,8,9,10步由MBR中的引導程式完成。一般多系統引導程式(如SmartBootManager、BootStar、PQBoot等)都是將標準主引導記錄替換成自己的引導程式,在運行系統啟動程式之前讓用戶選擇要啟動的分區。而某些系統自帶的多系統引導程式(如LILO,NTLoader等)則可以將自己的引導程式放在系統所處分區的第一個扇區中,在Linux中即為是兩個扇區的SuperBlock。注:以上各步驟中使用的是標準MBR,其他多系統引導程式的引導過程與此不同。2.1.2硬碟結構

1.硬碟參數當硬碟的容量還非常小的時候,人們採用與軟碟類似的結構生產硬碟。硬碟盤片的每一條磁軌都具有相同的扇區數。由此產生了所謂的3D參數(DiskGeometry)以及相應的尋址方式。到目前為止,通常還是沿用這種CHS(Cylinder/Head/Sector)來表示硬碟參數。其中:磁頭數(Heads)表示硬碟總共有幾個磁頭,也就是有幾面盤片,最大為256(用8個二進位位存儲);柱面數(Cylinders)表示硬碟每一面盤片上有幾條磁軌,最大為1024(用10個二進位位存儲);扇區數(Sectorspertrack)表示每一條磁軌上有幾個扇區,最大為63(用6個二進位位存儲)。每個扇區一般是512個位元組。2.基本INT13H調用簡介

BIOSint13H调用是BIOS提供的磁片基本輸入輸出中斷調用,它可以完成磁片(包括硬碟和軟碟)的複位、讀寫、校驗、定位、診斷和格式化等功能。它使用的是CHS尋址方式,因此最大只能訪問8GB左右的硬碟(本文中如不作特殊說明,均以1M=1048576位元組為單位)。3.現代硬碟結構簡介在老式硬碟中,由於每個磁軌的扇區數相等,所以外道的記錄密度要遠低於內道,因此會浪費很多磁片空間。為了進一步提高硬碟容量,人們改用等密度結構生產硬碟。也就是說,外圈磁軌的扇區比內圈磁軌多。採用這種結構後,硬碟不再具有實際的3D參數,尋址方式也改為線性尋址,即以扇區為單位進行尋址。為了與使用3D尋址的老軟體相容(如使用BIOSINT13H介面的軟體),在硬碟控制器內部安裝了一個地址翻譯器,由它負責將老式3D參數翻譯成新的線性參數。不同的工作模式(如LBA、LARGE、NORMAL)對應不同的3D參數。4.擴展INT13H

雖然現代硬碟都已經採用了線性尋址,但是由於基本INT13H的制約,使用BIOS的INT13H介面的程式(如DOS等)還只能訪問8G以內的硬碟空間。為了打破這一限制,Microsoft等幾家公司制定了擴展INT13H標準(ExtendedINT13H),採用線性尋址方式存取硬碟,突破了8G的限制,並還加入了對可拆卸介質(如活動硬碟)的支持。2.1.3引導扇區

1.BootSector的組成

BootSector也就是硬碟的第一個扇區,它由MBR(MasterBootRecord),DPT(DiskPartitionTable)和BootRecordID三部分組成。MBR又稱作主引導記錄,佔用BootSector的前446個位元組(0to0x1BD),存放系統主引導程式(它負責從活動分區中裝載並運行系統引導程式)。DPT即主分區表佔用64個位元組(0x1BEto0x1FD),記錄了磁片的基本分區資訊。主分區表分為四個分區項,每項16位元組,分別記錄了每個主分區的資訊(因此最多可以有四個主分區)。BootRecordID即引導區標記佔用兩個位元組(0x1FEand0x1FF),對於合法引導區,它等於0xAA55,這是判別引導區是否合法的標誌。BootSector的具體結構如下圖所示:2.分區表結構簡介分區表由四個分區項構成,每一項的結構如下:BYTEState:分區狀態,0=未啟動,0x80=啟動(注意此項)BYTEStartHead:分区起始磁头号WORDStartSC:分区起始扇区和柱面号,底字节的低6位為扇區號,高2位為柱面號的第9,10位,高位元組為柱面號的低8位BYTEType:分區類型,如0x0B=FAT32,0x83=Linux等,00表示此項未用BYTEEndHead:分区结束磁头号WORDEndSC:分区结束扇区和柱面号,定义同前DWORDRelative:線上性尋址方式下的分區相對扇區地址(對於基本分區即為絕對地址)DWORDSectors:分區大小(總扇區數)

在DOS/Windows系統下,基本分區必須以柱面為單位劃分(Sectors*Heads個扇區),如對於CHS為764/256/63的硬碟,分區的最小尺寸為256*63*512/1048576=7.875MB。由於硬碟的第一個扇區已經被引導扇區佔用,所以一般來說,硬碟第一個磁軌(0頭0道)的其餘62個扇區是不會被分區佔用的。某些分區軟體甚至將第一個柱面全部空出來。3.擴展分區由於主分區表中只能分四個分區,無法滿足需求,因此設計了一種擴展分區格式。基本上說,擴展分區的資訊是以鏈表形式存放的,但也有一些特別的地方。

首先,主分區表中要有一個基本擴展分區項,所有擴展分區都隸屬於它,也就是說其他所有擴展分區的空間都必須包括在這個基本擴展分區中。對於DOS/Windows來說,擴展分區的類型為0x05或0x0F(LBA模式)。除基本擴展分區以外的其他所有擴展分區則以鏈表的形式級聯存放,後一個擴展分區的資料項目記錄在前一個擴展分區的分區表中,但兩個擴展分區的空間並不重疊。

擴展分區類似於一個完整的硬碟,必須進一步分區才能使用。但每個擴展分區中只能存在一個其他分區。此分區在DOS/Windows環境中即為邏輯盤。因此每一個擴展分區的分區表(同樣存儲在擴展分區的第一個扇區中)中最多只能有兩個分區資料項目(包括下一個擴展分區的資料項目)。以上所有擴展分區表中的第二個分區項(指向下一個擴展分區)的相對扇區地址均相對於主擴展分區,而不是前一個擴展分區。

2.2Linux的引導過程

不同電腦平臺引導過程的區別主要在於第一階段的引導過程。對PC機上的Linux系統而言,電腦(即BIOS)負責從軟碟或硬碟的第一個扇區(即引導扇區)中讀取引導裝載器,然後,由引導裝載器從磁片或其他位置裝入操作系統。從軟碟引導時,BIOS讀取並運行引導扇區中的代碼。引導扇區中的代碼讀取軟碟前幾百個塊(依賴於實際的內核大小),然後將這些代碼放置在預先定義好的記憶體位置。利用軟碟引導Linux時,沒有檔系統,內核處於連續的扇區中,這樣安排可簡化引導過程。但是,如果利用LILO(LInuxLOader)也可從包含檔系統的軟碟上引導Linux。

從硬碟引導時,由於硬碟是可分區的,因此引導過程比軟碟複雜一些。BIOS首先讀取並運行硬碟主引導記錄中的代碼,這些代碼首先檢驗主引導記錄中的分區表,尋找到活動分區(即標誌為可引導分區的分區),然後讀取並運行活動分區之引導扇區中的代碼。活動分區引導扇區的作用和軟碟引導扇區的作用一樣:從分區中讀取內核映象並啟動內核。和軟碟引導不同的是,內核映象保存在硬碟分區檔系統中,而不象軟碟那樣保存在後續的連續扇區中,因此,硬碟引導扇區中的代碼還需要定位內核映象在檔系統中的位置,然後裝載內核並啟動內核。Linux系統的常見引導方式有兩種:LILO引導和Loadin引導;其中LILO可實現多重引導,Loadin可在DOS下引導Linux。此外,Linux內核也自帶了一個bootsect-loader。由於bootsect-loader只能实现Linux的引導,不像前兩個那樣具有很大的靈活性,所以在普通應用場合實際上很少使用。但由於bootsect-loader短小、沒有多餘的代碼、並且是內核源碼的有機組成部分。下麵將主要對bootsect-loader檔進行分析。bootsect-loader在內和源碼中對應的程式是/arch/i386/boot/bootsect.s。幾個相關檔是:(1)/arch/i386/boot/bootsect.s(2)/include/linux/config.h(3)/include/asm/boot.h(4)/include/linux/autoconf.h2.2.1Linux系統引導過程分析

開啟Intelx86PC的電源後,機器就會開始執行ROMBIOS的一系列系統測試動作,包括檢查RAM、鍵盤、顯示器和軟硬磁片等。接著控制權轉移給ROM中的啟動程式(ROMbootstraproutine);該程式會將磁片上的第0軌第0扇區(稱為bootsector或MasterBootRecord,MBR,系統的引導程式就放在此處)讀入記憶體,放入自0x07C0:0x0000開始的512個位元組處;然後處理機跳轉到該處開始執行(位於該處的)MBR引導程式,CS:IP=0x07C0:0x0000。加電後處理機運行在與8086相相容的實模式下。如果要用bootsect-loader進行系統引導,則必須把bootsect.s編譯連接後對應的二進位代碼置於MBR;当ROMBIOS把bootsect.s編譯連接後對應的二進位代碼裝入記憶體後,機器的控制權就完全轉交給bootsect;也就是說,bootsect將是第一個被讀入記憶體中並執行的程式。Bootsect接管機器控制權後,將依次進行以下一些動作:(1)首先,bootsect將它“自己”(自位置0x07C0:0x0000開始的512個位元組)從被ROMBIOS載入的地址0x07C0:0x0000處搬到0x9000:0000處;這一任務由bootsect.s的前十條指令完成;第十一條指令“jmpigo,INITSEG”則把機器跳轉到“新”的bootsect的“jmpigo,INITSEG”後的那條指令“go:movdi,#0x4000-12”;之後,繼續執行bootsect的剩下的代碼;在bootsect.s中定義了幾個常量:BOOTSEG=0x07C0bios載入MBR的約定位置的段址;INITSEG=0x9000bootsect.s的前十條指令將自己搬到此處(段址)SETUPSEG=0x9020裝入Setup.s的段址SYSSEG=0x1000系統區段址這些常量的定義可參見/include/asm/boot.h;在下面的分析中這些常量會經常用到。(2)以0x9000:0x4000-12為棧底,建立自己的棧區;其中0x9000:0x4000-12到0x9000:0x4000的一十二個位元組預留作磁片參數表區;(3)在0x9000:0x4000-12到0x9000:0x4000的一十二個預留位元組中建立新的磁片參數表。由於設計者考慮到有些老的bios不能準確地識別磁片每個磁軌的扇區數,使得bios建立的磁片參數表妨礙磁片的最高性能發揮,所以設計者在bios建立的磁片參數表的基礎上使用枚舉法測試,試圖建立準確的“新”的磁片參數表(這是在後繼步驟中完成的);並把參數表的位置由原來的0x0000:0x0078搬到0x9000:0x4000-12;且修改老的磁片參數表區使之指向新的磁片參數表;(4)接下來是load_setup子過程;它調用0x13中斷的第2號服務;把第0道第2扇區開始的連續的setup_sects(為常量4)個扇區讀到緊鄰bootsect的記憶體區;,即0x9000:0x0200開始的2048個位元組;而這四個扇區的內容就是/arch/i386/boot/setup.s編譯連接後對應的二進位代碼。換句話說,如果要用bootsect-loader進行系統引導,不僅必須把bootsect.s編譯連接後對應的二進位代碼置於MBR,而且還要將\把setup.s編譯連接後對應的二進位代碼置於緊跟MBR後的連續的四個扇區中。由於setup.s對應的可執行碼是由bootsect裝載的,所以可以根據需要修改bootsect來設置setup.s對應的可執行碼;(5)load_setup子過程的惟一出口是probe_loop子過程;該過程通過枚舉法測試磁片“每個磁軌的扇區數”;(6)接下來幾個子過程比較清晰:顯示“Loading”;讀入系統到0x1000:0x0000;關掉軟驅馬達;根據的5步測出的“每個磁軌的扇區數”確定磁片類型;最後跳轉到0x9000:0x0200,即setup.s對應的可執行碼的入口,將機器控制權轉交setup.s;整個bootsect代碼運行完畢。引導過程執行完後的記憶體映像圖如圖2.3所示。完成了系統的引導後,系統將進入到初始化處理階段。系統的初始化分為實模式和保護模式兩部分。為了簡單起見,在上面的分析中,忽略了對大內核的處理的分析。因為對大內核的處理,只是此引導過程中的一個很小的部分,並不影響對整體的把握。2.2.2實模式下的初始化

實模式下的初始化,主要是指從內核引導成功後,到進入保護模式之前系統所做的一些處理。在內核源碼中對應的程式是/arch/i386/boot/setup.s;以下部分主要對該檔進行分析。這部分的分析要弄懂它的處理流程和INITSEG(9000:0000)段參數表的建立的過程。該參數表包含了很多硬體參數,這些都是以後進行保護模式下初始化以及核心建立的基礎。相關檔有:

/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完成在實模式下版本檢查,並將硬碟、滑鼠及記憶體的參數寫入到INITSEG中,並負責進入保護模式。實模式下的初始化過程如圖2.4及圖2.5所示:

圖2.4實模式下的初始化過程1圖2.5實模式下的初始化過程2表2.1INITSEG(9000:0000)段參數表:(參見include/linux/tty.h)參數名偏移量(段址均為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位標誌④0x004c2arch/i386/boot/setup.sBIOScodeseglength0x004e4arch/i386/boot/setup.sBIOSdataseglength0x00522arch/i386/boot/setup.shd0參數0x008016arch/i386/boot/setup.shd0參數0x009016arch/i386/boot/setup.sPS/2device標誌⑤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保護模式下的初始化

保護模式下的初始化,是指處理機進入保護模式後到運行系統第一個內核程式過程中,系統所做的一些處理。保護模式下的初始化在內核源碼中對應的程式是/arch/i386/boot/compressed/head.s和/arch/i386/kernel/head.s;以下部分主要是針對這兩個檔進行的分析。在i386體系結構中,因為i386本身的問題,在"arch/alpha/kernel/head.s"中需要更多的设置,最终是通过callSYMBOL_NAME(start_kernel)转到start_kernel()這個體系結構無關的函數中去執行了。

在i386系統中,當內核以bzImage的形式壓縮,即大內核方式(BIG_KERNEL)壓縮時就需要預先處理bootsect.s和setup.s,按照大核模式使用$(CPP)處理生成bbootsect.s和bsetup.s,然後再編譯生成相應的.o檔,並使用"arch/i386/boot/compressed/build.c"生成的build工具,將實際的內核(未壓縮的,含kernel中的head.s代碼)與"arch/i386/boot/compressed"下的head.s和misc.c合成到一起,其中的head.s代替了"arch/i386/kernel/head.s"的位置,由Bootloader引導執行(startup_32入口),然後它調用misc.c中定義的decompress_kernel()函數,使用"lib/inflate.c"中定义的gunzip()將內核解壓到0x100000,再轉到其上執行"arch/i386/kernel/head.s"中的startup_32代碼。幾個有關檔是:/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最後的是一條轉跳指令,跳到內核第一條指令並開始執行。指令中指向的是記憶體中的絕對地址,無法依此判斷轉跳到了head.s。但是可以通過Makefile簡單的確定head.s位於內核的前端。在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從這個依賴關係可以獲得大量的資訊:(1)$(HEAD)即head.o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论