大學課件物聯(lián)網(wǎng)與嵌入式系統(tǒng)開發(fā)-第5章-嵌入式操作系統(tǒng)_第1頁
大學課件物聯(lián)網(wǎng)與嵌入式系統(tǒng)開發(fā)-第5章-嵌入式操作系統(tǒng)_第2頁
大學課件物聯(lián)網(wǎng)與嵌入式系統(tǒng)開發(fā)-第5章-嵌入式操作系統(tǒng)_第3頁
大學課件物聯(lián)網(wǎng)與嵌入式系統(tǒng)開發(fā)-第5章-嵌入式操作系統(tǒng)_第4頁
大學課件物聯(lián)網(wǎng)與嵌入式系統(tǒng)開發(fā)-第5章-嵌入式操作系統(tǒng)_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章

嵌入式操作系統(tǒng)本章主要內容5.1操作系統(tǒng)簡介5.2uC/OS-II簡介5.3VxWorks簡介5.4WinCE簡介5.5Linux簡介5.6其他嵌入式操作系統(tǒng)

思考與習題5.1操作系統(tǒng)簡介

操作系統(tǒng)(OperationSystem,OS)是管理計算機硬件與軟件資源的程序,同時也是計算機系統(tǒng)的內核與基石。操作系統(tǒng)是控制其他程序運行,管理系統(tǒng)資源并為用戶提供操作界面的系統(tǒng)軟件的集合。操作系統(tǒng)身負諸如管理與配置內存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入與輸出設備、操作網(wǎng)絡與管理文件系統(tǒng)等基本事務。操作系統(tǒng)的型態(tài)非常多樣,不同機器安裝的OS可從簡單到復雜,可從手機的嵌入式系統(tǒng)到超級計算機的大型操作系統(tǒng)。目前微機上常見的操作系統(tǒng)有OS/2、UNIX、Linux、Windows等。5.1操作系統(tǒng)簡介

5.1.1操作系統(tǒng)

5.1.2嵌入式操作系統(tǒng)

回本章目錄5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)

操作系統(tǒng)的功能包括管理計算機系統(tǒng)的硬件、軟件及數(shù)據(jù)資源;控制程序運行;改善人機界面;為其他應用軟件提供支持等,使計算機系統(tǒng)所有資源最大限度地發(fā)揮作用,為用戶提供方便的、有效的、友善的服務界面。

回本節(jié)目錄5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))1.操作系統(tǒng)分類應用領域來:桌面操作系統(tǒng)、服務器操作系統(tǒng)、嵌入式操作系統(tǒng)等支持的用戶數(shù):單用戶(如MSDOS)、多用戶系統(tǒng)(如UNIX)源碼開放程度:開源操作系統(tǒng)(Linux)、不開源操作系統(tǒng)(Windows)硬件結構:網(wǎng)絡操作系統(tǒng)(Netware、WindowsNT、OS/2warp)、分布式系統(tǒng)(Amoeba)、多媒體系統(tǒng)(Amiga)等使用環(huán)境和對作業(yè)處理方式:批處理系統(tǒng)(MVX、DOS/VSE)、分時系統(tǒng)(Linux、UNIX、XENIX、MacOS)、實時系統(tǒng)(iEMX、VRTX、RTOS、RTWINDOWS)技術復雜程度:簡單操作系統(tǒng)、智能操作系統(tǒng)指令的長度:8位、16位、32位、64位的操作系統(tǒng)5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))2.流行的主要操作系統(tǒng)目前流行的主要操作系統(tǒng)有Windows系列操作系統(tǒng),由微軟發(fā)行;UNIX類操作系統(tǒng),如SOLARIS、BSD系列(FREEBSD、openbsd、netbsd、pcbsd);Linux類操作系統(tǒng),如Ubuntu、SuseLinux、Fedora等;Mac操作系統(tǒng),由蘋果公司發(fā)行,一般安裝于MAC電腦。5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))3.操作系統(tǒng)主要功能操作系統(tǒng)位于底層硬件與用戶之間,是兩者溝通的橋梁。以現(xiàn)代觀點而言,一個標準個人電腦的OS應該提供以下的功能:進程管理(Processingmanagement)內存管理(Memorymanagement)文件系統(tǒng)(Filesystem)網(wǎng)絡通信(Networking)安全機制(Security)用戶界面(Userinterface)驅動程序(Devicedrivers)5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))4.操作系統(tǒng)組成操作系統(tǒng)組成可分成四大部分。(1)驅動程序。最底層的、直接控制和監(jiān)視各類硬件的部分,它們的職責是隱藏硬件的具體細節(jié),并向其他部分提供一個抽象的、通用的接口。(2)內核。操作系統(tǒng)之最內核部分,通常運行在最高特權級,負責提供基礎性、結構性的功能。(3)接口庫。是一系列特殊的程序庫,它們職責在于把系統(tǒng)所提供的基本服務包裝成應用程序所能夠使用的編程接口(API),是最靠近應用程序的部分。例如,GNUC運行期庫就屬于此類,它把各種操作系統(tǒng)的內部編程接口包裝成ANSIC和POSIX編程接口的形式。5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))4.操作系統(tǒng)組成(續(xù))(4)外圍。所謂外圍,是指操作系統(tǒng)中除以上三類以外的所有其他部分,通常是用于提供特定高級服務的部件。例如,在微內核結構中,大部分系統(tǒng)服務,以及UNIX/Linux中各種守護進程都通常被劃歸此類。當然,本節(jié)所提出的四部分結構觀也絕非放之四海皆準。例如,在早期的微軟視窗操作系統(tǒng)中,各部分耦合程度很深,彼此難以區(qū)分。而在使用外核結構的操作系統(tǒng)中,則根本沒有驅動程序的概念。因而,本節(jié)的討論只適用于一般情況,具體特例需具體分析。操作系統(tǒng)中四大部分的不同布局,也就形成了幾種整體結構的分布,常見的結構包括簡單結構、層結構、微內核結構、垂直結構和虛擬機結構。5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))5.內核結構內核是操作系統(tǒng)最核心、最基礎的構件。內核的結構可以分為單內核、微內核、超微內核以及外核等。單內核結構是指操作系統(tǒng)中各內核部件雜然混居的形態(tài),該結構產(chǎn)生于20世紀60年代(也有20世紀50年代初之說,尚存爭議),歷史最長,是操作系統(tǒng)內核與外圍分離時的最初形態(tài)。微內核結構是20世紀80年代產(chǎn)生出來的較新的內核結構,強調結構性部件與功能性部件的分離。20世紀末,基于微內核結構,理論界中又發(fā)展出了超微內核與外內核等多種結構。盡管自20世紀80年代起,大部分理論研究都集中在以微內核為首的“新興”結構之上,然而,在應用領域之中,以單內核結構為基礎的操作系統(tǒng)卻一直占據(jù)著主導地位。5.1操作系統(tǒng)簡介5.1.1操作系統(tǒng)(續(xù))5.內核結構在眾多常用操作系統(tǒng)之中,除了QNX和基于Mach的UNIX等個別系統(tǒng)外,幾乎全部采用單內核結構,例如大部分的UNIX、Linux,以及Windows(微軟聲稱WindowsNT是基于改良的微內核架構的,但理論界對此存有異議)。微內核和超微內核結構主要用于研究性操作系統(tǒng),還有一些嵌入式系統(tǒng)使用外核?;趩蝺群说牟僮飨到y(tǒng)通常有著較長的歷史淵源。例如,絕大部分UNIX的家族史都可上溯至20世紀60年代。該類操作系統(tǒng)多數(shù)有著相對古老的設計和實現(xiàn)(如某些UNIX中存在著大量20世紀70年代、20世紀80年代的代碼)。另外,往往在性能方面略優(yōu)于同一應用領域中采用其他內核結構的操作系統(tǒng)(但通常認為此種性能優(yōu)勢不能完全歸功于單內核結構)。5.1操作系統(tǒng)簡介5.1.2嵌入式操作系統(tǒng)嵌入式系統(tǒng)是以應用為中心,以計算機技術為基礎,并且軟/硬件可裁剪,適用于應用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統(tǒng)。它一般由嵌入式微處理器、外圍硬件設備、嵌入式操作系統(tǒng)以及用戶的應用程序等四個部分組成,用于實現(xiàn)對其他設備的控制、監(jiān)視或管理等功能。

回本節(jié)目錄5.1操作系統(tǒng)簡介5.1.2嵌入式操作系統(tǒng)(續(xù))嵌入式系統(tǒng)一般指非PC系統(tǒng),它包括硬件和軟件兩部分。硬件包括處理器/微處理器、存儲器及外設器件和I/O端口、圖形控制器等。軟件部分包括操作系統(tǒng)軟件(OS,要求實時和多任務操作)和應用程序編程。有時設計人員把這兩種軟件組合在一起。應用程序控制著系統(tǒng)的運作和行為;而操作系統(tǒng)控制著應用程序編程與硬件的交互作用。5.1操作系統(tǒng)簡介5.1.2嵌入式操作系統(tǒng)(續(xù))嵌入式系統(tǒng)的核心是嵌入式微處理器。嵌入式微處理器一般就具備以下4個特點。(1)強實時性。對實時多任務有很強的支持能力,能完成多任務并且有較短的中斷響應時間。(2)強穩(wěn)定性。具有功能很強的存儲區(qū)保護功能。(3)良好的移植性??蓴U展的處理器結構,以便快速地開發(fā)出滿足應的最高性能的嵌入式微處理器。(4)低功耗。嵌入式微處理器必須功耗很低,尤其是用于便攜式的無線及移動的計算和通信設備中靠電池供電的嵌入式系統(tǒng)更是如此,功耗只有mW,甚至μW級。5.1操作系統(tǒng)簡介5.1.2嵌入式操作系統(tǒng)(續(xù))嵌入式操作系統(tǒng)大致又可分為“實時”和“通用型”兩種。1.實時操作系統(tǒng)實時操作系統(tǒng)(Real-TimeOperatingSystem,RTOS)是指操作系統(tǒng)必須在限定的時間內,對過程調用做出正確的響應。正因為如此,實時操作系統(tǒng)對于時間調度和穩(wěn)定度上有非常嚴格的要求,不容許發(fā)生太大的誤差。嵌入式系統(tǒng)發(fā)展至今,已從專業(yè)性的設備開始向信息家電等消費性電子產(chǎn)品領域拓展,所以實時操作系統(tǒng)也開始從主要的航天、國防領域,將觸角延伸到網(wǎng)絡電話、視訊轉換器等消費性電子產(chǎn)品上。5.1操作系統(tǒng)簡介5.1.2嵌入式操作系統(tǒng)(續(xù))2.通用型操作系統(tǒng)通用型操作系統(tǒng)與實時操作系統(tǒng)最大的不同點在于對時序的要求。通用型操作系統(tǒng)系統(tǒng)的反應時間有著一定的寬容性。而現(xiàn)今這些通用型操作系統(tǒng)大多應用于信息家電、消費性電子產(chǎn)品等。市場上通用型操作系統(tǒng)的產(chǎn)品也不少,有一部分也提供有限的實時能力。此外,由于產(chǎn)品多元,獲取容易,且產(chǎn)品支持能力強大,所以使用通用型操作系統(tǒng)的嵌入式系統(tǒng)也越來越多,市場占有率也隨之提高。5.2uC/OS-II簡介uC/OS-II的前身是uC/OS,最早出自于1992年美國嵌入式系統(tǒng)專家JeanJ.Labrosse在《嵌入式系統(tǒng)編程》雜志的5月和6月刊上刊登的文章連載,并把uC/OS的源碼發(fā)布在該雜志的BBS上。uC/OS-II是一個可以基于ROM運行的、可裁減、搶占式、實時多任務內核,具有高度可移植性,特別適合于微處理器和控制器,是和很多商業(yè)操作系統(tǒng)性能相當?shù)膶崟r操作系統(tǒng)。uC/OS-II的移植性很好,它最大程度上使用ANSIC語言進行開發(fā),現(xiàn)在已經(jīng)移植到近40多種處理器體系。

回本章目錄5.2uC/OS-II簡介uC/OS-II可以簡單地視為一個多任務調度器,在這個任務調度器之上完善并添加了和多任務操作系統(tǒng)相關的系統(tǒng)服務,如信號量、郵箱等。其主要特點有公開源代碼,代碼結構清晰、明了,注釋詳盡,組織有條理,可移植性好,可裁剪,可固化,內核屬于搶占式,最多可以管理60個任務。從1992年開始,由于高度可靠性、魯棒性和安全性,uC/OS-II已經(jīng)廣泛使用在從照相機到航空電子產(chǎn)品的各種應用中。

*最新的版本支持256個任務。5.2uC/OS-II簡介uC/OS-II的主要特點如下:(1)公開源代碼,系統(tǒng)透明,可移植性強。(2)可固化。(3)可裁剪,通過條件編譯可以只使用uC/OS-II中應用程序需要的那些系統(tǒng)服務程序。(4)搶占式,uC/OS-II完全是搶占式(Preemptive)的實時內核。(5)實時多任務。(6)可確定性,全部uC/OS-II的函數(shù)調用與服務的執(zhí)行時間具有可確定性。5.2uC/OS-II簡介

由于uC/OS-II僅是一個實時內核,這就意味著它不像其他實時操作系統(tǒng)那樣提供給用戶的只是一些API函數(shù)接口,有很多工作往往需要用戶自己去完成。把C/OS-II移植到目標硬件平臺上也只是系統(tǒng)設計工作的開始,后面還需要針對實際的應用需求對C/OS-II進行功能擴展,包括底層的硬件驅動、文件系統(tǒng)、用戶圖形接口(GUI)等,從而建立一個實用的RTOS。5.3VxWorks簡介

VxWorks是美國WindRiver公司于1983年設計開發(fā)的一種實時操作系統(tǒng)。它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛(wèi)星通信、軍事演習、導彈制導、飛機導航等。它是目前嵌入式系統(tǒng)領域中使用最廣泛、市場占有率最高的系統(tǒng)之一。它支持多種處理器,如x86,i960,SunSparc,MotorolaMC68xxx,MIPSRX000,PowerPC,ARM,StrongARM等。大多數(shù)的VxWorksAPI是專有的。

回本章目錄5.3VxWorks簡介

VxWorks由一個體積很小的內核及一些可以根據(jù)需要進行定制的系統(tǒng)模塊組成。VxWorks有如下特點:(1)可靠性高。穩(wěn)定、可靠一直是VxWorks的一個突出優(yōu)點。(2)實時性強。其系統(tǒng)本身的開銷很小,進程調度、進程間通信、中斷處理等系統(tǒng)公用程序精練而有效,它們造成的延遲很短。VxWorks提供的多任務機制中對任務的控制采用了優(yōu)先級搶占和輪轉調度機制,也充分保證了可靠的實時性。(3)可裁減。VxWorks允許用戶對其進行裁剪,去除不需要的部分,使生成的內核更小,執(zhí)行速度更快。5.3VxWorks簡介

VxWorks由以下幾個主要部分組成:(1)高性能的實時操作系統(tǒng)核心。VxWorks核心包括多任務調度,任務間的同步和進程間通信機制,以及中斷處理,看門狗和內存管理機制。(2)I/O系統(tǒng)。VxWorks提供了一個快速靈活的與ANSIC兼容的I/O系統(tǒng),包括UNIX標準的緩沖I/O和POSIX標準的異步I/O。(3)文件系統(tǒng)。VxWorks支持四種文件系統(tǒng):dosFs、rt11Fs、rawFs和tapeFs。(4)板級支持包BSP(BoardSupportPackage)。(5)網(wǎng)絡設施。VxWorks提供了對其他網(wǎng)絡和TCP/IP網(wǎng)絡系統(tǒng)的“透明”訪問,包括與BSD套接字兼容的編程接口,遠程過程調用(RPC)、SNMP(可選項)、遠程文件訪問(包括客戶端和服務端的NFS機制,使用RSH、FTP或TFTP的非NFS機制),以及BOOTP和ARP代理。5.3VxWorks簡介

VxWorks由以下幾個主要部分組成:(6)先進的系列網(wǎng)絡產(chǎn)品。(7)虛擬內存(即VxVMI選項)與共享內存(即VxMP選項)。VxVMI為帶有MMU的目標板提供了虛擬內存機制。VxMP提供了共享信號量,消息隊列和在不同處理器之間的共享內存區(qū)域。(8)目標代理(TargetAgent)。目標代理遵循WBD(WindDebug)協(xié)議,允許目標機與主機上的Tornado開發(fā)工具相連。(9)實用庫VxWorks。提供了一個實用例程的擴展集,包括中斷處理、看門狗計時器、消息登錄、內存分配、字符掃描、線緩沖和環(huán)緩沖管理、鏈表管理和ANSIC標準。(10)基于目標機的工具。在Tornado開發(fā)系統(tǒng)中,開發(fā)工具是駐留在主機上的,但是也可以根據(jù)需要將基于目標機的Shell和裝載卸載模塊加入VxWorks。5.4WinCE簡介

WinCE是微軟公司嵌入式、移動計算平臺的基礎。WinCE中的C代表袖珍(Compact)、消費(Consumer)、通信能力(Connectivity)和伴侶(Companion);E代表電子產(chǎn)品(Electronics)。與Windows95/98、WindowsNT不同的是,WinCE是所有源代碼全部由微軟自行開發(fā)的嵌入式新型操作系統(tǒng),其操作界面雖來源于Windows95/98,但WinCE是基于Win32API重新開發(fā)、新型的信息設備的平臺。

回本章目錄5.4WinCE簡介

WinCE被設計成針對小型設備(它是典型的擁有有限內存的無磁盤系統(tǒng))的通用操作系統(tǒng),WinCE可以通過設計一層位于內核和硬件之間代碼用來用設定硬件平臺,這即眾所周知的硬件抽象層(HAL)。在以前解釋時,這被稱為OEMC(原始設備制造)適應層,即OAL;內核壓縮層,即KAL。WinCE是從整體上為有限資源的平臺設計的多線程、完整優(yōu)先權、多任務的操作系統(tǒng),它的模塊化設計允許它對從掌上電腦到專用的工業(yè)控制器的用戶電子設備進行定制。操作系統(tǒng)的基本內核至少需要200KB的ROM。5.4WinCE簡介

WinCE具有模塊化、結構化和基于Win32應用程序接口和與處理器無關等特點。WinCE不僅繼承了傳統(tǒng)的Windows圖形界面,并且在WinCE平臺上可以使用Windows95/98上的編程工具(如VisualBasic、VisualC++等)、使用同樣的函數(shù)、使用同樣的界面風格,使絕大多數(shù)的應用軟件只需簡單的修改和移植就可以在WinCE平臺上繼續(xù)使用。WinCE并非是專為單一裝置設計的,所以微軟為旗下采用WinCE作業(yè)系統(tǒng)的產(chǎn)品大致分為三條產(chǎn)品線,PocketPC(掌上電腦)、HandheldPC(手持設備)及AutoPC。5.4WinCE簡介

嵌入式WinCE與Linux相比,其優(yōu)點包括:Linux開發(fā)難度較高,需要很高的技術實力,WinCE開發(fā)相對較容易,開發(fā)周期短,內核完善,主要是應用層開發(fā);Linux核心調試工具不全,調試不太方便,而WinCE的GUI豐富開發(fā)工具強大;Linux系統(tǒng)維護難度大,Linux在使用較完整的GUI時一般會占用較大的內存,如果去掉部分無用的功能來減小使用的內存,但是如果不仔細,將引起新的問題。5.4WinCE簡介

嵌入式WinCE與Linux相比的缺點包括:Linux是開放源代碼,遍布全球的眾多Linux愛好者都是Linux開發(fā)者的強大技術支持者;WinCE目前6.0內核全部開放,GUI不開放;Linux的內核小、效率高,而WinCE則占用過多的RAM;Linux在價格上極具競爭力,WinCE需要版權費用;Linux不僅支持x86芯片,還是一個跨平臺的系統(tǒng),更換CPU時就不會遇到更換平臺的困擾;Linux內核的結構在網(wǎng)絡方面是非常完整的。5.4WinCE簡介

2010年6月,微軟正式公布WindowsEmbeddedCompact7,其前身便是簡稱WinCE的系統(tǒng),隨著版本號的升級,其正式改名為WindowsEmbeddedCompact7。盡管WindowsEmbeddedCompact7有諸多優(yōu)點,然而目前國內的WinCE應用還是以WinCE6.0為主。5.5Linux簡介5.5.1Linux簡介5.5.2Linux特點5.5.3嵌入式Linux5.5.4Linux內核版本與發(fā)行版5.5.5Linux進程管理5.5.6存儲管理5.5.7文件系統(tǒng)5.5.8設備管理5.5.9Linux內核模塊5.5.10Linux配置文件5.5.11Linux啟動流程簡介

回本章目錄5.5Linux簡介5.5.1Linux簡介Linux是一種自由和開放源碼的類Unix操作系統(tǒng)。1991年初,Linus開始在一臺386sx兼容微機上學習Minix操作系統(tǒng)。通過學習,他逐漸不能滿足于Minix系統(tǒng)的現(xiàn)有性能,并開始醞釀開發(fā)一個新的免費操作系統(tǒng)。1991年的10月5日,Linux由芬蘭人LinusTorvalds第一次正式在網(wǎng)站上向外公布,以后借助于Internet網(wǎng)絡,并經(jīng)過全世界各地計算機愛好者的共同努力下,現(xiàn)已成為今天世界上使用最多的一種UNIX類操作系統(tǒng),并且使用人數(shù)還在迅猛增長。

回本節(jié)目錄5.5Linux簡介5.5.1Linux簡介(續(xù))目前存在著許多不同的Linux,但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中,從手機、平板電腦、路由器和視頻游戲控制臺,到臺式計算機、大型機和超級計算機。Linux是一個領先的操作系統(tǒng),世界上運算最快的10臺超級計算機運行的都是Linux操作系統(tǒng)。嚴格地講,Linux這個詞本身只表示Linux內核,但實際上人們已經(jīng)習慣了用Linux來形容整個基于Linux內核,并且使用GNU工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)。5.5Linux簡介5.5.2Linux特點Linux具有如下特點:(1)完全免費。Linux是一款免費的操作系統(tǒng),用戶可以通過網(wǎng)絡或其他途徑免費獲得,并可以任意修改其源代碼。(2)完全兼容POSIX1.0標準。這使得可以在Linux下通過相應的模擬器運行常見的DOS、Windows的程序。(3)多用戶、多任務。(4)良好的界面。Linux同時具有字符界面和圖形界面。

回本節(jié)目錄5.5Linux簡介5.5.2Linux特點(續(xù))Linux具有如下特點:(5)豐富的網(wǎng)絡功能。Linux的網(wǎng)絡功能和其內核緊密相連.(6)可靠的安全、穩(wěn)定性能。Linux采取了許多安全技術措施,其中有對讀、寫進行權限控制、審計跟蹤、核心授權等技術,這些都為安全提供了保障。(7)支持多種平臺。Linux可以運行在多種硬件平臺上,如x86、ARM、SPARC、Alpha、MIPS、PowerPC、HP-PA等處理器的平臺。此外Linux還是一種嵌入式操作系統(tǒng),可以運行在掌上電腦、機頂盒或游戲機上。5.5Linux簡介5.5.3嵌入式Linux嵌入式Linux是以Linux為基礎的嵌入式操作系統(tǒng)。典型的嵌入式Linux安裝大概需要2MB的系統(tǒng)內存。嵌入式Linux現(xiàn)在已經(jīng)有許多的版本,包括強實時的嵌入式Linux(如新墨西哥工學院的RT-Linux和堪薩斯大學的KURT-Linux)和一般的嵌入式Linux版本(如μClinux和PocketLinux等)。

另一種常用的嵌入式Linux是μClinux,它是針對沒有MMU的處理器而設計的。它不能使用處理器的虛擬內存管理技術,它對內存的訪問是直接的,所有程序中訪問的地址都是實際的物理地址。它專為嵌入式系統(tǒng)做了許多小型化的工作。

回本節(jié)目錄5.5Linux簡介5.5.4Linux內核版本與發(fā)行版Linux的版本號分為兩部分,即內核版本與發(fā)行版本。內核版本號由r.x.y3個數(shù)字組成。r:目前發(fā)布的內核主版本;x:偶數(shù)表示穩(wěn)定版本,奇數(shù)表示開發(fā)中版本;y:錯誤修補的次數(shù)。一般來說,x位為偶數(shù)的版本是一個可以使用的穩(wěn)定版本,如2.4.4;x位為奇數(shù)的版本一般加入了一些新的內容,不一定很穩(wěn)定,是測試版本,如2.1.111。2.6.36版本是2010年10月發(fā)布的版本號,在2.6.39后,Linux開始以3.x.x開始命名。

回本節(jié)目錄5.5Linux簡介5.5.4Linux內核版本與發(fā)行版(續(xù))Linux發(fā)行版指的就是我們通常所說的“Linux操作系統(tǒng)”,它可能是由一個組織、公司或者個人發(fā)行的。一個Linux發(fā)行版包括Linux內核,將整個軟件安裝到電腦上的一套安裝工具,各種GNU軟件,其他的一些自由軟件,在一些特定的Linux發(fā)行版中也有一些專有軟件。目前,超過三百個發(fā)行版被積極地開發(fā),最普遍被使用的發(fā)行版有大約十二個。主流的Linux發(fā)行版有:Ubuntu,DebianGNU/Linux,F(xiàn)edora,Gentoo,MandrivaLinux,SlackwareLinux,openSUSE,Puppylinux,Mint,CentOS,RedHat等。5.5Linux簡介5.5.5Linux進程管理進程(Process)是一個其中運行著一個或多個線程的地址空間和這些線程所需要的系統(tǒng)資源。線程(Thread)是進程的一個實體,是CPU調度和分派的基本單位。線程和進程的關系是:線程是屬于進程的,線程運行在進程空間內,同一進程所產(chǎn)生的線程共享同一內存空間,當進程退出時該進程所產(chǎn)生的線程都會被強制退出并清除。線程可與屬于同一進程的其他線程共享進程所擁有的全部資源,但是其本身基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的信息(如程序計數(shù)器、一組寄存器和棧)。

回本節(jié)目錄5.5Linux簡介5.5.5Linux進程管理(續(xù))1.進程組成進程由正文段、用戶數(shù)據(jù)段、系統(tǒng)數(shù)據(jù)段組成。正文段存放進程要運行的程序,描述了進程要完成的功能。用戶數(shù)據(jù)段存放正文段在執(zhí)行時所需要的數(shù)據(jù)和工作區(qū)。系統(tǒng)數(shù)據(jù)段存放了進程的控制信息,其中最重要的數(shù)據(jù)結構是task_struct。進程一般分為交互進程、批處理進程和守護進程。守護進程總是活躍的,一般在后臺運行。守護進程一般是由系統(tǒng)在開機時通過腳本自動激活啟動或由超級管理用戶root來啟動。5.5Linux簡介5.5.5Linux進程管理(續(xù))2.進程狀態(tài)1)TASK_RUNNING(運行狀態(tài))表示進程正在被CPU執(zhí)行,或者已經(jīng)準備就緒隨時可由調度程序調度執(zhí)行。若此時進程沒有被CPU執(zhí)行,則稱其處于就緒狀態(tài)。當一個進程在內核代碼中運行時,我們稱其處于內核態(tài);當一個進程正在執(zhí)行用戶自己的代碼時,我們稱其處于用戶態(tài)。當系統(tǒng)資源已經(jīng)可用時,進程就被喚醒而進入準備運行狀態(tài),也就是就緒狀態(tài)。這些狀態(tài)在內核中表示方法相同,都被稱為TASK_RUNNING狀態(tài)。當一個進程剛被創(chuàng)建后就處于TASK_RUNNING狀態(tài)。5.5Linux簡介5.5.5Linux進程管理(續(xù))2.進程狀態(tài)2)TASK_INTERRUPTIBLE(可中斷睡眠狀態(tài))進程處于等待狀態(tài),不會被調度執(zhí)行,當?shù)却馁Y源可用(或等待某條件為真)或者系統(tǒng)產(chǎn)生一個中斷或進程收到一個信號時,進程就被喚醒繼而進入就緒狀態(tài)(TASK_RUNNING)。5.5Linux簡介5.5.5Linux進程管理(續(xù))2.進程狀態(tài)3)TASK_UNINTERRUPTIBLE(不可中斷的睡眠狀態(tài))與TASK_INTERRUPTINLE狀態(tài)的唯一區(qū)別就是該狀態(tài)不可被收到的信號喚醒。這種狀態(tài)很少用到,但在一些特殊的情況下(進程必須等待,直到一個不能被中斷的事件發(fā)生,發(fā)送硬盤I/O要求而等待I/O完成的狀態(tài),等待TTY終端的輸入的狀態(tài)等),這種狀態(tài)是很有用的。5.5Linux簡介5.5.5Linux進程管理(續(xù))2.進程狀態(tài)4)TASK_STOPPED(暫停狀態(tài))當進程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信號后就會進入TASK_STOPPED狀態(tài),可向其發(fā)送SIGCONT信號讓進程轉換到可運行狀態(tài)。5)TASK_DEAD(死亡狀態(tài))“task_struct->state==EXIT_DEAD”是一個特殊情況,為了避免混亂就引入了這個新的狀態(tài)。EXIT_DEAD就只能用于->exit_state字段。一個進程在退出(調用do_exit())時,state字段都被置于TASK_DEAD狀態(tài)。5.5Linux簡介5.5.5Linux進程管理(續(xù))2.進程狀態(tài)6)EXIT_ZOMBIE(僵死進程)該狀態(tài)是task_struct->exit_state字段的值,表示進程的執(zhí)行被終止,但是父進程還沒有發(fā)布wait4()或waitpid()系統(tǒng)調用來返回有關死亡的進程信息。發(fā)布wait()類系統(tǒng)調用前,內核不能丟棄包含在死亡進程描述符中的數(shù)據(jù),因為父進程可能還需要它來取得進程的退出狀態(tài)。5.5Linux簡介5.5.5Linux進程管理(續(xù))2.進程狀態(tài)7)EXIT_DEAD(僵死撤銷狀態(tài))該狀態(tài)也是task_struct->exit字段的值,表示進程的最終狀態(tài)。由于父進程剛發(fā)出wait4()或waitpid()系統(tǒng)調用,因而進程由系統(tǒng)刪除,為了防止其他執(zhí)行線程在同一個進程也執(zhí)行wait()類系統(tǒng)調用,而把進程的狀態(tài)由僵死狀態(tài)(EXIT_ZOMBIE)改為撤銷狀態(tài)(EXIT_DEAD)。5.5Linux簡介5.5.5Linux進程管理(續(xù))3.進程創(chuàng)建與與終止系統(tǒng)啟動時總是處于核心模式,此時只有一個進程,即初始化進程。像所有進程一樣,初始化進程也有一個由堆棧、寄存器等表示的機器狀態(tài)。當系統(tǒng)中有其他進程被創(chuàng)建并運行時,這些信息將被存儲在初始化進程的task_struct結構中。在系統(tǒng)初始化的最后,初始化進程啟動一個核心線程(init),然后保留在idle狀態(tài)。如果沒有任何事要做,調度管理器將運行idle進程。idle進程是唯一不是動態(tài)分配task_struct的進程,它的task_struct在核心構造時靜態(tài)定義并且名字很怪,叫做init_task。5.5Linux簡介5.5.5Linux進程管理(續(xù))3.進程創(chuàng)建與終止由于是系統(tǒng)的第一個真正的進程,所以init核心線程(或進程)的標志符為1,它負責完成系統(tǒng)的一些初始化設置任務(如打開系統(tǒng)控制臺與安裝根文件系統(tǒng)),以及執(zhí)行系統(tǒng)初始化程序,如/etc/init,/bin/init或者/sbin/init,這些初始化程序依賴于具體的系統(tǒng)。init程序使用/etc/inittab作為腳本文件來創(chuàng)建系統(tǒng)中的新進程,這些新進程又創(chuàng)建各自的新進程。例如getty進程將在用戶試圖登錄時創(chuàng)建一個login進程。系統(tǒng)中所有進程都是從init核心線程中派生出來的。5.5Linux簡介5.5.5Linux進程管理(續(xù))3.進程創(chuàng)建與終止新進程通過克隆老進程或當前進程來創(chuàng)建。系統(tǒng)調用fork或clone可以創(chuàng)建新任務,復制發(fā)生在核心狀態(tài)下的核心中。在系統(tǒng)調用的結束處有一個新進程等待調度管理器選擇它去運行。系統(tǒng)從物理內存中分配出來一個新的task_struct數(shù)據(jù)結構,同時還有一個或多個包含被復制進程堆棧(用戶與核心)的物理頁面。然后創(chuàng)建唯一的標記此新任務的進程標志符。但復制進程保留其父進程的標志符也是合理的。新創(chuàng)建的task_struct將被放入task數(shù)組中,另外將被復制進程的task_struct中的內容頁表拷入新的task_struct中。5.5Linux簡介5.5.5Linux進程管理(續(xù))3.進程創(chuàng)建與終止復制完成后,Linux允許兩個進程共享資源而不是復制各自的拷貝,這些資源包括文件、信號處理過程和虛擬內存。進程對共享資源用各自的count來計數(shù)。在兩個進程對資源的使用完畢之前,Linux絕不會釋放此資源,例如復制進程要共享虛擬內存,則其task_struct將包含指向原來進程的mm_struct的指針。mm_struct將增加count變量以表示當前進程共享的次數(shù)。5.5Linux簡介5.5.5Linux進程管理(續(xù))3.進程創(chuàng)建與終止復制進程虛擬空間所用技術的十分巧妙。復制將產(chǎn)生一組新的vm_area_struct結構和對應的mm_struct結構,同時還有被復制進程的頁表。該進程的任何虛擬內存都沒有被復制。Linux使用一種寫時復制(CopyOnWrite)技術:僅當兩個進程之一對虛擬內存進行寫操作時才復制此虛擬內存塊。但是不管寫與不寫,任何虛擬內存都可以在兩個進程間共享。只讀屬性的內存,如可執(zhí)行代碼,總是可以共享的。為了使寫時復制策略工作,必須將那些可寫區(qū)域的頁表入口標記為只讀的,同時描敘它們的vm_area_struct數(shù)據(jù)都被設置為寫時復制。當進程之一試圖對虛擬內存進行寫操作時將產(chǎn)生頁面錯誤。這時Linux將復制這一塊內存并修改兩個進程的頁表以及虛擬內存數(shù)據(jù)結構。5.5Linux簡介5.5.5Linux進程管理(續(xù))4.進程狀態(tài)變遷進程狀態(tài)的變遷卻只有兩個方向——從TASK_RUNNING狀態(tài)變?yōu)榉荰ASK_RUNNING狀態(tài),或者從非TASK_RUNNING狀態(tài)變?yōu)門ASK_RUNNING狀態(tài)。進程從非TASK_RUNNING狀態(tài)變?yōu)門ASK_RUNNING狀態(tài),是由別的進程執(zhí)行喚醒操作來實現(xiàn)的。執(zhí)行喚醒的進程設置被喚醒進程的狀態(tài)為TASK_RUNNING,然后將其加入到某個CPU的可執(zhí)行隊列中,于是被喚醒的進程就有機會被調度執(zhí)行。進程從TASK_RUNNING狀態(tài)變?yōu)榉荰ASK_RUNNING狀態(tài),則有兩種途徑:一是響應信號而進入TASK_STOPED狀態(tài)或TASK_DEAD狀態(tài);二是執(zhí)行系統(tǒng)調用主動進入TASK_INTERRUPTIBLE狀態(tài)或TASK_DEAD狀態(tài);或由于執(zhí)行系統(tǒng)調用需要的資源得不到滿足,而進入TASK_INTERRUPTIBLE狀態(tài)或TASK_UNINTERRUPTIBLE狀態(tài)。5.5Linux簡介5.5.5Linux進程管理(續(xù))4.進程狀態(tài)變遷5.5Linux簡介5.5.5Linux進程管理(續(xù))5.進程調度調度就是從就緒的進程中選出最適合的一個來執(zhí)行,學習進程調度需要掌握調度策略、調度時機和調度步驟三點。Linux提供了如下幾種調度方式:SCHED_NORMAL(SCHED_OTHER):普通的分時進程;SCHED_FIFO:先入先出的實時進程;SCHED_RR:時間片輪轉的實時進程;SCHED_BATCH:批處理進程;SCHED_IDLE:只在系統(tǒng)空閑時才能夠被調度執(zhí)行的進程。調度類的引入增強了內核調度程序的可擴展性,這些類(調度程序模塊)封裝了調度策略,并將調度策略模塊化。5.5Linux簡介5.5.5Linux進程管理(續(xù))5.進程調度CFS調度類(在kernel/sched_fair.c中實現(xiàn))用于以下調度策略:SCHED_NORMAL、SCHED_BATCH和SCHED_IDLE。實時調度類(在kernel/sched_rt.c中實現(xiàn))用于SCHED_RR和SCHED_FIFO策略。調度的發(fā)生有兩種方式:一種是主動式,在內核中直接調用schedule(),當進程需要等待資源等而暫時停止運行時,會把狀態(tài)置于掛起(睡眠),并主動請求調度,讓出CPU;另一種是被動式,即程序被搶占,Linux2.6內核開始支持搶占,用戶搶占發(fā)生在從系統(tǒng)調用返回用戶空間和從中斷處理程序返回用戶空間。內核即將返回用戶空間的時候,如果need_resched標志被設置,會導致schedule()被調用,此時就會發(fā)生用戶搶占。5.5Linux簡介5.5.5Linux進程管理(續(xù))5.進程調度Linux使用schedule()函數(shù)執(zhí)行調度,schedule函數(shù)工作流程如下:①清理當前運行中的進程;②選擇下一個要運行的進程;③設置新進程的運行環(huán)境;④執(zhí)行進程上下文切換。5.5Linux簡介5.5.6存儲管理Linux使用了物理地址、虛擬地址和邏輯地址的概念。物理地址是指出現(xiàn)在CPU地址總線上的地址信號,是地址變換的最終結果,用來尋址物理內存。邏輯地址是程序代碼經(jīng)過編譯后在匯編程序中使用的地址。虛擬地址又名線性地址,在32位CPU架構下,可以表示4GB的地址空間,用十六進制表示就是0x00000000到0xffffffff。CPU要將一個邏輯地址轉換為物理地址,需要兩步:首先CPU利用段式內存管理單元,將邏輯地址轉換成線性地址;再利用頁式內存管理單元,把線性地址最終轉換為物理地址。

回本節(jié)目錄5.5Linux簡介5.5.6存儲管理(續(xù))Linux內核的設計并沒有全部采用Intel所提供的段機制,僅僅是有限度地使用了段機制。這不僅簡化了Linux內核的設計,而且為把Linux移植到其他平臺創(chuàng)造了條件,因為很多RISC處理器并不支持段機制。Linux中所有段的基地址均為0,即每個段的邏輯地址空間范圍為0~4GB。因為每個段的基地址為0,因此,邏輯地址與線性地址保持一致(即邏輯地址的偏移量字段的值與線性地址的值總是相同的),在Linux中所提到的邏輯地址和虛擬地址(線性地址)可以認為是一致的。這樣,Linux巧妙地繞過段機制,而完全利用了分頁機制。5.5Linux簡介5.5.6存儲管理(續(xù))Linux內核為每種CPU提供統(tǒng)一的界面,都采用了四級頁管理架構,來兼容二級、三級、四級管理架構的CPU,這四級分別為①頁全局目錄(PageGlobalDirectory,PGD),是多級頁表的抽象最高層;②頁上級目錄(PageUpperDirectory,PUD);③頁中間目錄(PageMiddleDirectory,PMD),是頁表的中間層;④頁表(PageTableEntry,PTE)。5.5Linux簡介5.5.6存儲管理(續(xù))5.5Linux簡介5.5.6存儲管理(續(xù))Linux將4GB的虛擬地址空間劃分為兩個部分——用戶空間與內核空間。用戶空間從0到0xbfffffff,內核空間從3GB到4GB。用戶進程在通常情況下只能訪問用戶空間的虛擬地址,不能訪問內核空間,用戶進程通過系統(tǒng)調用才能訪問內核空間。虛擬內存技術不僅僅讓我們可以使用更多的內存,它還提供了下面這些功能。(1)巨大的尋址空間(2)公平的物理內存分配(3)共享虛擬內存(4)進程的保護5.5Linux簡介5.5.6存儲管理(續(xù))Linux虛擬內存的實現(xiàn)需要6種機制的支持:地址映射機制、內存分配回收機制、緩存和刷新機制、請求頁機制、交換機制,以及內存共享機制。在Linux內核中,對應進程內存區(qū)域的數(shù)據(jù)結構是vm_area_struct,內核將每個內存區(qū)域作為一個單獨的內存對象管理,相應的操作也都一致。vm_area_struct是描述進程地址空間的基本管理單元,以鏈表形式鏈接的,為了方便查找,內核又以紅黑樹的形式組織內存區(qū)域。鏈表用于需要遍歷全部節(jié)點的時候用,而紅黑樹適用于在地址空間中定位特定內存區(qū)域的時候。5.5Linux簡介5.5.6存儲管理(續(xù))為了滿足內核對這種小內存塊的需要,Linux系統(tǒng)采用了一種被稱為slab分配器的技術。slab分配器的核心思想就是“存儲池”的運用。內存片段(小塊內存)被使用完后不直接釋放而是被緩存到“存儲池”里,留做下次使用。slob是一個相對簡單一些的分配器,主要使用在小型的嵌入式系統(tǒng)。Linux2.6.22中slub作為slab的可替代選項出現(xiàn)。slub取消了大量的隊列和相關維護費用,并在總體上簡化了slab結構,使用了基于每CPU的緩存,同時保留了slab的用戶接口,而且slub還提供了強大的診斷和調試能力。5.5Linux簡介5.5.7文件系統(tǒng)Linux的文件系統(tǒng)和Windows中的文件系統(tǒng)有很大的區(qū)別,Windows文件系統(tǒng)是以驅動器的盤符為基礎的,而且每一個目錄是與相應的分區(qū)對應,例如“E:\workplace”是指此文件在E盤這個分區(qū)下。而Linux恰好相反,文件系統(tǒng)是一個文件樹,且它的所有文件和外部設備(如硬盤、光驅等)都是以文件的形式掛結在這個文件樹上,例如“\usr\local”。總之,在Windows下,目錄結構屬于分區(qū);Linux下,分區(qū)屬于目錄結構。

回本節(jié)目錄5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))Linux支持很多的文件系統(tǒng),如EXT2、EXT3、VFAT等,并支持這些文件系統(tǒng)共存。Linux通過使用同一套文件I/O系統(tǒng)調用即可對任意文件進行操作而無須考慮其所在的具體文件系統(tǒng)格式;更進一步,對文件的操作可以跨文件系統(tǒng)而執(zhí)行。虛擬文件系統(tǒng)(VirtualFileSystem,VFS)正是實現(xiàn)該特性的關鍵。虛擬文件系統(tǒng)是Linux內核中的一個軟件層,用于給用戶空間的程序提供文件系統(tǒng)接口;同時,它也提供了內核中的一個抽象功能,允許不同的文件系統(tǒng)共存。系統(tǒng)中所有的文件系統(tǒng)不但依賴VFS共存,而且也依靠VFS協(xié)同工作。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))為了能夠支持各種實際文件系統(tǒng),VFS定義了所有文件系統(tǒng)都支持的基本的、概念上的接口和數(shù)據(jù)結構;同時實際文件系統(tǒng)也提供VFS所期望的抽象接口和數(shù)據(jù)結構,將自身的諸如文件、目錄等概念在形式上與VFS的定義保持一致。換句話說,一個實際的文件系統(tǒng)想要被Linux支持,就必須提供一個符合VFS標準的接口才能與VFS協(xié)同工作。實際文件系統(tǒng)在統(tǒng)一的接口和數(shù)據(jù)結構下隱藏了具體的實現(xiàn)細節(jié),所以在VFS層和內核的其他部分看來,所有文件系統(tǒng)都是相同的。圖5-3顯示了VFS在內核中與實際的文件系統(tǒng)的協(xié)同關系,也顯示了VFS在內核中與實際的文件系統(tǒng)的協(xié)同關系。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))從本質上講,文件系統(tǒng)是特殊的數(shù)據(jù)分層存儲結構,它包含文件、目錄和相關的控制信息。為了描述這個結構,Linux引入了一些基本概念。①文件。一組在邏輯上具有完整意義的信息項的系列。在Linux中,除了普通文件,其他諸如目錄、設備、套接字等也以文件被對待。總之,“一切皆文件”。②目錄。目錄好比一個文件夾,用來容納相關文件。因為目錄可以包含子目錄,所以目錄是可以層層嵌套,形成文件路徑。在Linux中,目錄也是以一種特殊文件被對待的,所以用于文件的操作同樣也可以用在目錄上。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))③目錄項。在一個文件路徑中,路徑中的每一部分都被稱為目錄項;如路徑/home/source/helloworld.c中,目錄“/”,“home”,“source”和文件helloworld.c都是一個目錄項。④索引節(jié)點。用于存儲文件的元數(shù)據(jù)的一個數(shù)據(jù)結構。文件的元數(shù)據(jù),也就是文件的相關信息,和文件本身是兩個不同的概念,它包含的是諸如文件的大小、擁有者、創(chuàng)建時間、磁盤位置等和文件相關的信息。⑤超級塊。用于存儲文件系統(tǒng)的控制信息的數(shù)據(jù)結構。描述文件系統(tǒng)的狀態(tài)、文件系統(tǒng)類型、大小、區(qū)塊數(shù)、索引節(jié)點數(shù)等,存放于磁盤的特定扇區(qū)中。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))VFS依靠四個主要的數(shù)據(jù)結構和一些輔助的數(shù)據(jù)結構來描述其結構信息,這些數(shù)據(jù)結構表現(xiàn)得就像是對象;每個主要對象中都包含由操作函數(shù)表構成的操作對象,這些操作對象描述了內核針對這幾個主要的對象可以進行的操作。①超級塊對象。存儲一個已安裝的文件系統(tǒng)的控制信息,代表一個已安裝的文件系統(tǒng);每次一個實際的文件系統(tǒng)被安裝時,內核都會從磁盤的特定位置讀取一些控制信息來填充內存中的超級塊對象。一個安裝實例和一個超級塊對象一一對應。超級塊通過其結構中的一個域s_type記錄它所屬的文件系統(tǒng)類型。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))②索引節(jié)點對象。索引節(jié)點對象存儲了文件的相關信息,代表了存儲設備上的一個實際的物理文件。當一個文件首次被訪問時,內核會在內存中組裝相應的索引節(jié)點對象,以便向內核提供對一個文件進行操作時所必需的全部信息,這些信息一部分存儲在磁盤特定位置,另外一部分是在加載時動態(tài)填充的。③目錄項對象。引入目錄項的目的是方便查找文件。路徑的各個組成部分(目錄或普通的文件)都是一個目錄項對象。不同于前面的兩個對象,目錄項對象沒有對應的磁盤數(shù)據(jù)結構,VFS在遍歷路徑名的過程中現(xiàn)場將它們逐個地解析成目錄項對象。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))④文件對象。文件對象是已打開的文件在內存中的表示,主要用于建立進程和磁盤上的文件的對應關系,它由sys_open()現(xiàn)場創(chuàng)建,由sys_close()銷毀。文件對象和物理文件的關系有點像進程和程序的關系一樣。站在用戶空間來看VFS,只需與文件對象打交道,而無須關心超級塊、索引節(jié)點或目錄項。因為多個進程可以同時打開和操作同一個文件,所以同一個文件也可能存在多個對應的文件對象。文件對象僅僅在進程觀點上代表已經(jīng)打開的文件,它反過來指向目錄項對象(反過來指向索引節(jié)點)。一個文件對應的文件對象可能不是唯一的,但是其對應的索引節(jié)點和目錄項對象無疑是唯一的。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))Linux操作系統(tǒng)的目錄結構進行簡單的介紹。/:根目錄,建議在根目錄底下只有目錄,不要直接有文件。/bin:一般用戶可以使用的可執(zhí)行文件。/boot:存放操作系統(tǒng)啟動時用到的文件。/dev:存放所有外部設備文件,訪問這些文件就相當于訪問外部設備。/etc:存放系統(tǒng)主要的配置文件。 /etc/rc.d:存放Linux啟動和關閉時用到時腳本文件。 /etc/rc.d/init:存放所有Linux服務默認的啟動腳本(新版用到/etc/xinetd.d的內容)。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))/home:普通用戶的默認的工作目錄。/lib:存放系統(tǒng)的動態(tài)鏈接庫文件。/lost+found:大多數(shù)情況為空,系統(tǒng)產(chǎn)生異常時會將一些遺失的片段放在此目錄下。/media:一般為可移動設備的掛載點。/proc:存放系統(tǒng)核心與執(zhí)行程序所需的一些信息,這些信息在內存中由系統(tǒng)產(chǎn)生。/root:該目錄是超級用戶登錄時的主目錄。/sbin:該目錄用來存放系統(tǒng)管理員的常用的系統(tǒng)管理程序。/tmp:存放程序執(zhí)行時產(chǎn)生的臨時文件,一般Linux安裝軟件的默認路徑就是這里。5.5Linux簡介5.5.7文件系統(tǒng)(續(xù))/usr:存放很多應用程序和文件。 /usr/bin:系統(tǒng)用戶使用的應用程序。 /usr/include:存放頭文件。 /usr/sbin:超級用戶使用的比較高級的管理程序和系統(tǒng)守護程序。 /usr/src:內核源代碼默認的放置目錄。/srv:存放一些服務啟動之后需要提取的數(shù)據(jù)。/sys:是內核設備樹的一個直觀反映。當一個內核對象被創(chuàng)建的時候,對應的文件和目錄也在內核對象子系統(tǒng)中被創(chuàng)建/var:主要放置的是系統(tǒng)執(zhí)行過程中經(jīng)常變動的文件,如日志、隊列等。5.5Linux簡介5.5.8設備管理Linux的設備管理把各種設備硬件的復雜物理特性的細節(jié)屏蔽起來,提供一個對各種不同設備使用統(tǒng)一方式進行操作的接口。Linux繼承了UNIX“萬物皆文件”的哲學,把設備看成特殊文件,系統(tǒng)通過虛擬文件系統(tǒng)來管理和控制各種設備。Linux將設備被分為三類:塊設備、字符設備和網(wǎng)絡設備。字符設備是以字符為單位輸入/輸出數(shù)據(jù)的設備,一般不需要使用緩沖區(qū)而直接對它進行讀寫,比如串口就是典型的字符設備。

回本節(jié)目錄5.5Linux簡介5.5.8設備管理(續(xù))塊設備則是以一定大小的數(shù)據(jù)塊為單位輸入/輸出數(shù)據(jù)的,一般要使用緩沖區(qū)在設備與內存之間傳送數(shù)據(jù),塊設備一般要使用文件系統(tǒng)。網(wǎng)絡設備是通過通信網(wǎng)絡傳輸數(shù)據(jù)的設備,一般指與通信網(wǎng)絡連接的網(wǎng)絡適配器(網(wǎng)卡)等。Linux下字符設備和塊設備都有對應的設備文件,一般情況,應用程序通過讀寫設備文件來操作字符設備,也有一部分程序通過讀寫塊設備文件來操作塊設備,但大多數(shù)情況下,應用程序通過文件系統(tǒng)來讀寫塊設備上的文件。網(wǎng)絡設備沒有對應的設備文件,應用程序通過socket來操作網(wǎng)絡設備。5.5Linux簡介5.5.8設備管理(續(xù))Linux對設備的控制和操作是由設備驅動程序完成的。設備驅動程序是由設備服務子程序和中斷處理程序組成,設備服務子程序包括了對設備進行各種操作的代碼,中斷處理子程序處理設備中斷。設備驅動程序的主要功能是:對設備進行初始化;啟動或停止設備的運行;把設備上的數(shù)據(jù)傳送到內存;把數(shù)據(jù)從內存?zhèn)魉偷皆O備;檢測設備狀態(tài)。5.5Linux簡介5.5.8設備管理(續(xù))驅動程序是與設備相關的。驅動程序的代碼由內核統(tǒng)一管理,在具有特權級的內核態(tài)下運行。設備驅動程序也是輸入/輸出子系統(tǒng)的一部分。驅動程序為某個進程服務,其執(zhí)行過程仍處在進程運行的過程中,即處于進程上下文中。若驅動程序需要等待設備的某種狀態(tài),它將阻塞當前進程,把進程加入到該種設備的等待隊列中。Linux對使用設備類型、主設備號、次設備號設備進行識別,主設備號是與驅動程序一一對應的,同時還使用次設備號來區(qū)分一種設備中的各個具體設備。次設備號用來區(qū)分使用同一個驅動程序的個體設備。5.5Linux簡介5.5.8設備管理(續(xù))在Linux2.6內核以后,一個新的文件系統(tǒng)sysfs被引入。它掛載于/sys下,把系統(tǒng)設備和總線組織成一個分級的文件系統(tǒng),供用戶空間的程序利用這些信息與內核交互。這個系統(tǒng)信息是通過kobject子系統(tǒng)來建立的,是當前系統(tǒng)上實際設備樹的直觀反映。當一個kobject被創(chuàng)建時,對應的文件和目錄也被創(chuàng)建了,它們位于/sys下,供用戶空間讀寫。udev以守護進程的方式運行于Linux系統(tǒng)中,并監(jiān)聽設備初始化或卸載時內核發(fā)出的uevent。udev能夠根據(jù)系統(tǒng)中硬件設備的狀態(tài)實時地更新,包括創(chuàng)建、刪除設備文件。udev為靈活的設備命名提供了解決方案。5.5Linux簡介5.5.9Linux內核模塊Linux內核是一個整體是結構,因此向內核添加任何東西或者刪除某些功能都十分困難。為了解決這個問題,Linux內核引入了模塊(Module)機制,從而可以動態(tài)地向內核中添加或者刪除功能。模塊不被編譯在內核中,因而可以控制了內核的大小。但模塊一旦被插入內核,它就和內核其他部分一樣。模塊是在內核空間運行的程序,實際上是一種目標對象文件,沒有鏈接,不能獨立運行,但是可以裝載到系統(tǒng)中作為內核的一部分運行,從而可以動態(tài)擴充內核的功能。模塊最主要的用處就是用來實現(xiàn)設備驅動程序。

回本節(jié)目錄5.5Linux簡介5.5.9Linux內核模塊(續(xù))使用模塊的優(yōu)點有:將來修改內核時,不必全部重新編譯整個內核,可節(jié)省不少時間;系統(tǒng)中如果需要使用新模塊,不必重新編譯內核,只要插入相應的模塊即可。下面以一個非常簡單的hello模塊為例來介紹Linux內核模塊,模塊源代碼如下。5.5Linux簡介5.5.9Linux內核模塊(續(xù))#include<linux/init.h>#include<linux/module.h>MODULE_LICENSE(“GPL”);staticinthello_init(void){printk(KERN_ALERT“Hello,world!\n”);return0;}staticvoidhello_exit(void){printk(KERN_ALERT”Goodbyeworld!\n”);}module_init(hello_init);module_exit(hello_exit);5.5Linux簡介5.5.9Linux內核模塊(續(xù))一個Linux內核模塊需包含模塊初始化和模塊卸載函數(shù),前者在使用insmod的加載模塊時運行,后者在使用rmmod卸載模塊時運行。初始化與卸載函數(shù)必須在宏module_init和module_exit使用前定義,否則會出現(xiàn)編譯錯誤。Linux內核模塊的編譯與應用程序的編譯稍有不同,這里不做詳細介紹。5.5Linux簡介5.5.10Linux配置文件1.用戶和組的配置文件①/etc/passwd。/etc/passwd用于保存系統(tǒng)的用戶信息,內容格式為“用戶名:密碼:用戶ID:組ID:注釋:用戶的home目錄:用戶使用的shell”例如:root:x:0:0:root:/root:/bin/bash

回本節(jié)目錄5.5Linux簡介5.5.10Linux配置文件(續(xù))1.用戶和組的配置文件②/etc/shadow。/etc/passwd任何用戶都可讀,所以不能使用/etc/passwd來保存用戶密碼,Linux使用shadow文件保護密碼,shadow文件只有root可讀。/etc/shadow的內容格式為“用戶名:密碼:最后一次修改時間:可以修改密碼的最小天數(shù):必須修改密碼的最大天數(shù):密碼過期前多少天提醒用戶:過期后禁用賬戶的天數(shù):密碼過期后到賬戶被禁用的天數(shù):保留”,以上天數(shù)均為1970年1月1日開始。例如:root:……:14919:0:99999:7:::5.5Linux簡介5.5.10Linux配置文件(續(xù))2.網(wǎng)絡配置文件①/etc/sysconfig/network。該文件包含了主機最基本的網(wǎng)絡信息,如HOSTNAME。②/etc/host.conf。該文件是域名服務器客戶端的控制文件,該文件定義了DNS客戶端和主機提出域名查詢請求時的處理順序,默認情況下是hosts,bind,也就是先查看/etc/hosts文件,如果有相應的條目,則不再對DNS進行請求。③/etc/resolv.conf。該文件用于配置域名服務器客戶端的IP地址,它包含了主機的域名搜索順序和DNS服務器的地址。5.5Linux簡介5.5.10Linux配置文件(續(xù))2.網(wǎng)絡配置文件④/etc/hosts。該文件用于完成主機映射為IP地址的功能。⑤/etc/protocols。該文件中保存了主機使用的協(xié)議及其協(xié)議號。⑥/etc/services。該文件中保存了主機使用的網(wǎng)絡服務及其端口。5.5Linux簡介5.5.10Linux配置文件(續(xù))3.啟動腳本①/etc/profile。全局登錄腳本,任何用戶登錄時都會使用到該文件,常在/etc/profile文件中修改環(huán)境變量,在這里修改的內容對所有用戶都起作用,比如PATH、USER、LOGNAME、MAIL、HOSTNAME、HISTSIZE、HISTCONTROL等環(huán)境變量就在該文件中定義。②/etc/bashrc。全局bash腳本,任何用戶啟動非登錄式的bash時都會使用到該文件,比如umask的值就在該文件中定義,另外對vi等程序的配置也可以放到這里。5.5Linux簡介5.5.10Linux配置文件(續(xù))3.啟動腳本③~/.profile。用戶登錄腳本,本用戶登錄時會使用到該文件。④~/.bashrc。用戶bash腳本,本用戶啟動非登錄式的bash時會使用到該文件。5.5Linux簡介5.5.11Linux啟動流程簡介這里以ARM平臺的Linux內核啟動來介紹嵌入式Linux的引導過程。Linux內核一般由Bootloader引導,并由Bootloader向Linux內核傳遞參數(shù)。ARM平臺上,Linux啟動需要滿足下面幾個條件:ARM處于SVC模式;禁止IRQ和FIQ;MMU關閉,即直接讀寫物理地址;數(shù)據(jù)Cache必須關閉,指令Cache可打開也可關閉;ARM的R0寄存器為0;ARM的R1寄存器為MACH_TYPE;ARM的R2寄存器為內核參數(shù)列表的地址。

回本節(jié)目錄5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))以上條件由Bootloader設置,Bootloader設置好這些條件后,將內核復制到RAM中,并執(zhí)行如下語句來啟動Linux內核。void(*startkernel)(intzero,intarch,unsignedintparams_addr)=(void(*)(int,int,unsignedint))KERNEL_RAM_BASE;startkernel(0,MACH_TYPE,(unsignedint)kernel_params_start);5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))Linux內核有兩種映像:一是非壓縮內核,叫做Image,另一種是它的壓縮版本,叫做zImage。zImage是Image經(jīng)過壓縮形成的,所以比Image小,但必須在它的開頭加上解壓縮的代碼,將zImage解壓縮之后才能執(zhí)行,因此它的執(zhí)行速度比Image要慢。但考慮到嵌入式系統(tǒng)的存儲空容量一般比較小,所以一般的嵌入式系統(tǒng)均采用壓縮的內核。5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))ARM系列處理器的zImage入口程序為arch/arm/boot/compressed/head.S,head.S依次完成如下工作:開啟MMU和Cache;調用decompress_kernel()解壓內核;調用call_kernel()進入非壓縮內核Image的啟動。5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))Linux非壓縮內核的入口位于文件/arch/arm/kernel/head.S中,該程序主要完成如下工作。①通過查找處理器內核類型和處理器類型調用相應的初始化函數(shù)。檢測處理器類型是在匯編子函數(shù)__lookup_architecture_type中完成,該函數(shù)返回時會將返回結構保存在r5、r6和r7三個寄存器中,其中r5保存RAM的起始基地址,r6保存I/O基地址,r7保存I/O的頁表偏移地址。5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))②建立頁表。調用__create_page_tables子函數(shù)來建立頁表,它所要做的工作就是將RAM基地址開始的4MB空間的物理地址映射到0xC0000000開始的虛擬地址處。對S3C2440開發(fā)板而言,RAM連接到物理地址0x30000000處,當調用__create_page_tables結束后,0x30000000~0x30400000物理地址將映射到0xC0000000~0xC0400000虛擬地址處。③跳轉到start_kernel()函數(shù)開始內核的初始化工作,這一階段的流程圖如圖5-4所示。5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))當所有的初始化結束之后,使用如下代碼來跳到C程序的入口函數(shù)start_kernel()處,開始之后的內核初始化工作。start_kernel是所有Linux平臺進入系統(tǒng)內核初始化后的入口函數(shù),它主要完成剩余的與硬件平臺相關的初始化工作,如圖5-5所示。在進行一系列與內核相關的初始化后,調用第一個用戶進程(init進程)并等待用戶進程的執(zhí)行,這樣整個Linux內核便啟動完畢。該函數(shù)所做的具體工作如下所述。5.5Linux簡介5.5.11Linux啟動流程簡介(續(xù))①調用setup_arch()函數(shù)進行與體系結構相關的第一個初始化工作。對于ARM平臺而言,該函數(shù)定義在arch/arm/kernel/setup.c。它首先通過檢測出來的處理器類型進行處理器內核的初始化,然后通過bootmem_init()函數(shù)根據(jù)系統(tǒng)定義的meminfo結構進行內存結構的初始化,最后調用paging_init()開啟MMU,創(chuàng)建內核頁表,映射所有的物理內存和I/O空間。②創(chuàng)建異常向量表和初始化中斷處理函數(shù)。③初始化系統(tǒng)核心進程調度器和時鐘中斷處理機制。④初始化串口控制臺(Serial-Consol

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論