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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章

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

思考與習(xí)題5.1操作系統(tǒng)簡(jiǎn)介

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

5.1.1操作系統(tǒng)

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

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

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

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

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

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

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

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

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

回本章目錄5.3VxWorks簡(jiǎn)介

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

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

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

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

回本章目錄5.4WinCE簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

回本節(jié)目錄5.5Linux簡(jiǎn)介5.5.9Linux內(nèi)核模塊(續(xù))使用模塊的優(yōu)點(diǎn)有:將來(lái)修改內(nèi)核時(shí),不必全部重新編譯整個(gè)內(nèi)核,可節(jié)省不少時(shí)間;系統(tǒng)中如果需要使用新模塊,不必重新編譯內(nèi)核,只要插入相應(yīng)的模塊即可。下面以一個(gè)非常簡(jiǎn)單的hello模塊為例來(lái)介紹Linux內(nèi)核模塊,模塊源代碼如下。5.5Linux簡(jiǎn)介5.5.9Linux內(nèi)核模塊(續(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簡(jiǎn)介5.5.9Linux內(nèi)核模塊(續(xù))一個(gè)Linux內(nèi)核模塊需包含模塊初始化和模塊卸載函數(shù),前者在使用insmod的加載模塊時(shí)運(yùn)行,后者在使用rmmod卸載模塊時(shí)運(yùn)行。初始化與卸載函數(shù)必須在宏module_init和module_exit使用前定義,否則會(huì)出現(xiàn)編譯錯(cuò)誤。Linux內(nèi)核模塊的編譯與應(yīng)用程序的編譯稍有不同,這里不做詳細(xì)介紹。5.5Linux簡(jiǎn)介5.5.10Linux配置文件1.用戶和組的配置文件①/etc/passwd。/etc/passwd用于保存系統(tǒng)的用戶信息,內(nèi)容格式為“用戶名:密碼:用戶ID:組ID:注釋:用戶的home目錄:用戶使用的shell”例如:root:x:0:0:root:/root:/bin/bash

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論