




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式操作系統(tǒng)第一頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)22.1Linux及其應(yīng)用Linux操作系統(tǒng)是UNIX操作系統(tǒng)的一種克隆系統(tǒng)。它誕生于1991年的10月5日(這是第一次正式向外公布的時(shí)間)。此后借助于因特網(wǎng),經(jīng)過(guò)全世界各地計(jì)算機(jī)愛(ài)好者的共同努力,現(xiàn)已成為當(dāng)今世界上使用最多的一種UNIX類(lèi)操作系統(tǒng),并且使用人數(shù)還在迅猛增長(zhǎng)。2.1.1Linux與UNIX和GNU2.1.2Linux的特點(diǎn)2.1.3Linux的發(fā)展及應(yīng)用第二頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)3Linux與UNIX和GNUUNIX操作系統(tǒng)是美國(guó)貝爾實(shí)驗(yàn)室的Ken.Thompson和DennisRitchie于1969年夏在DECPDP-7小型計(jì)算機(jī)上開(kāi)發(fā)的一個(gè)分時(shí)操作系統(tǒng)。KenThompson在1969年夏天利用一個(gè)月的時(shí)間開(kāi)發(fā)了UNIX操作系統(tǒng)的原型。后經(jīng)DennisRitchie于1972年用移植性很強(qiáng)的C語(yǔ)言進(jìn)行了改寫(xiě),使得UNIX系統(tǒng)在大專(zhuān)院校得到了推廣。MINIX系統(tǒng)是由AndrewS.Tanenbaum(AST)于1987年開(kāi)發(fā)的,主要用于學(xué)生學(xué)習(xí)操作系統(tǒng)原理。AST工作在荷蘭Amsterdam的Vrije大學(xué),并從事數(shù)學(xué)與計(jì)算機(jī)科學(xué)系統(tǒng)研究,是ACM和IEEE的資深會(huì)員(全世界也只有很少人是兩會(huì)的資深會(huì)員)。GNU計(jì)劃和自由軟件基金會(huì)FSF(theFreeSoftwareFoundation)是由RichardM.Stallman于1984年一手創(chuàng)辦的,旨在開(kāi)發(fā)一個(gè)類(lèi)似UNIX,并且是自由軟件的完整操作系統(tǒng):GNU系統(tǒng)(GNU是“GNU’sNotUNIX”的遞歸縮寫(xiě),它的發(fā)音為“gun-NEW”)。各種使用Linux作為核心的GNU操作系統(tǒng)正在被廣泛地使用。雖然這些系統(tǒng)通常被稱(chēng)為“Linux”,但是Stallman認(rèn)為,以嚴(yán)格意義上講,它們應(yīng)該被稱(chēng)為GNU/Linux系統(tǒng)。到20世紀(jì)90年代初,GNU項(xiàng)目已經(jīng)開(kāi)發(fā)出許多高質(zhì)量的免費(fèi)軟件,其中包括有名的emacs編輯系統(tǒng)、bashshell程序、gcc系列編譯程序、gdb調(diào)試程序,等等。這些軟件為L(zhǎng)inux操作系統(tǒng)的開(kāi)發(fā)創(chuàng)造了一個(gè)合適的環(huán)境,這也是Linux能夠誕生的基礎(chǔ)之一,以至于目前許多人都將Linux操作系統(tǒng)稱(chēng)為“GNU/Linux”操作系統(tǒng)。第三頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)4POSIX(PortableOperatingSystemInterfaceforComputingSystems)是由IEEE和ISO/IEC開(kāi)發(fā)的一組標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)是基于現(xiàn)有UNIX的實(shí)踐經(jīng)驗(yàn),描述了操作系統(tǒng)的調(diào)用服務(wù)接口。用于保證編制的應(yīng)用程序可以在源代碼一級(jí)上、在多種操作系統(tǒng)上移植和運(yùn)行。它是在1980年一個(gè)UNIX用戶(hù)組(usr/group)的早期工作基礎(chǔ)上完成的。20世紀(jì)90年代初,POSIX標(biāo)準(zhǔn)的制定處于最后投票敲定的時(shí)候,此時(shí)也正是Linux剛剛起步的時(shí)候,這個(gè)UNIX標(biāo)準(zhǔn)為L(zhǎng)inux提供了極為重要的信息,使得Linux能夠在標(biāo)準(zhǔn)的指導(dǎo)下進(jìn)行開(kāi)發(fā),并能夠與絕大多數(shù)UNIX操作系統(tǒng)兼容。通過(guò)上述說(shuō)明,我們可以對(duì)上述Linux的5大支柱歸納如下:
UNIX操作系統(tǒng)——Linux就是UNIX的一種克隆系統(tǒng)。UNIX的重要性就不用多說(shuō)了。
MINIX操作系統(tǒng)——MINIX操作系統(tǒng)也是UNIX的一種克隆系統(tǒng),它于1987年由著名計(jì)算機(jī)教授AndrewS.Tanenbaum開(kāi)發(fā)完成。由于MINIX系統(tǒng)的出現(xiàn)并且提供源代碼(只能免費(fèi)用于大學(xué)內(nèi)),在全世界的大學(xué)中刮起了學(xué)習(xí)UNIX系統(tǒng)旋風(fēng)。Linux剛開(kāi)始就是參照MINIX系統(tǒng)于1991年才開(kāi)始開(kāi)發(fā)。
GNU計(jì)劃——開(kāi)發(fā)Linux操作系統(tǒng),以及Linux上所用大多數(shù)軟件基本上都出自GNU計(jì)劃。Linux只是操作系統(tǒng)的一個(gè)內(nèi)核,沒(méi)有GNU軟件環(huán)境(如bashshell),則Linux將寸步難行。
POSIX標(biāo)準(zhǔn)——該標(biāo)準(zhǔn)在推動(dòng)Linux操作系統(tǒng)以后朝著正規(guī)路上發(fā)展起著重要的作用,是Linux前進(jìn)的燈塔。
Internet——如果沒(méi)有Internet網(wǎng),沒(méi)有遍布全世界的無(wú)數(shù)計(jì)算機(jī)黑客的無(wú)私奉獻(xiàn),那么Linux最多只能發(fā)展到0.13(0.95)版的水平第四頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)5Linux的特點(diǎn)1.開(kāi)放性是指系統(tǒng)遵循世界標(biāo)準(zhǔn)規(guī)范,特別是遵循開(kāi)放系統(tǒng)互聯(lián)(OSI)國(guó)際標(biāo)準(zhǔn)。凡遵循國(guó)際標(biāo)準(zhǔn)所開(kāi)發(fā)的硬件和軟件,都能彼此兼容,可方便地實(shí)現(xiàn)互聯(lián)。Linux采用GPL授權(quán),除了把源代碼公開(kāi)以外,任何人都可以自由使用、修改、散布;而Linux核心本身采用模塊化設(shè)計(jì),讓人很容易增減功能,由于Linux具有這樣高的可伸縮性,所以可以調(diào)出最適合我們硬件平臺(tái)的核心出來(lái)。2.多用戶(hù)是指系統(tǒng)資源可以被不同用戶(hù)各自擁有并使用,即每個(gè)用戶(hù)對(duì)自己的資源有特定的權(quán)限,互不影響。Linux和UNIX都具有多用戶(hù)的特性。3.多任務(wù)是現(xiàn)代計(jì)算機(jī)最主要的一個(gè)特點(diǎn)。它是指計(jì)算機(jī)同時(shí)執(zhí)行多個(gè)程序,而且各個(gè)程序的運(yùn)行互相獨(dú)立。Linux系統(tǒng)調(diào)度每一個(gè)進(jìn)程平等地訪(fǎng)問(wèn)微處理器。由于CPU的處理速度非???,其結(jié)果是,啟動(dòng)的應(yīng)用程序看起來(lái)好像在并行運(yùn)行。4.穩(wěn)定性強(qiáng),Linux不屬于任何一家公司,但它卻擁有全世界愿意投入自由軟件的開(kāi)發(fā)人員。在全球各處都有無(wú)數(shù)的人參與Linux核心的改進(jìn)、調(diào)試與測(cè)試,也正因此造就了穩(wěn)定度高的Linux。所以,Linux雖不是商業(yè)的產(chǎn)物,但它的質(zhì)量卻不遜于商業(yè)產(chǎn)品。5.設(shè)備獨(dú)立性,是指操作系統(tǒng)把所有外部設(shè)備統(tǒng)一當(dāng)做文件來(lái)看待,只要安裝它們的驅(qū)動(dòng)程序,任何用戶(hù)都可以像使用文件一樣,操縱、使用這些設(shè)備,而不必知道它們的具體存在形式。另外,由于用戶(hù)可以免費(fèi)得到Linux的內(nèi)核源代碼,因此,用戶(hù)可以修改內(nèi)核源代碼,以便適應(yīng)新增加的外部設(shè)備。第五頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)66.提供了豐富的網(wǎng)絡(luò)功能完善的內(nèi)置網(wǎng)絡(luò)是Linux的一大特點(diǎn)。Linux在通信和網(wǎng)絡(luò)功能方面優(yōu)于其他操作系統(tǒng)。Linux為用戶(hù)提供了完善的、強(qiáng)大的網(wǎng)絡(luò)功能,包括支持Internet、文件傳輸和遠(yuǎn)程訪(fǎng)問(wèn)。7.可靠的系統(tǒng)安全在Linux操作系統(tǒng)中采取了許多安全技術(shù)措施,包括對(duì)讀、寫(xiě)進(jìn)行權(quán)限控制、帶保護(hù)的子系統(tǒng)、審計(jì)跟蹤、核心授權(quán)等,這些措施為網(wǎng)絡(luò)多用戶(hù)環(huán)境中的用戶(hù)提供了必要的安全保障。8.良好的可移植性可移植性是指將操作系統(tǒng)從一個(gè)平臺(tái)轉(zhuǎn)移到另一個(gè)平臺(tái),并使它仍然能按其自身的方式運(yùn)行的能力。Linux一開(kāi)始是基于Intel386機(jī)器設(shè)計(jì)的,但是隨著網(wǎng)絡(luò)的散布,加上有許多工程師致力于各式平臺(tái)的移植,使得Linux可以在x86、MIPS、ARM/StrongARM、PowerPC、Motorola68k、HitachiSH3/SH4、Transmeta等平臺(tái)上運(yùn)行。這些平臺(tái)幾乎覆蓋了所有嵌入式系統(tǒng)的CPU種類(lèi),這樣,在硬件平臺(tái)設(shè)計(jì)時(shí),使得可以考慮的CPU種類(lèi)增加了不少。9.應(yīng)用軟件多自由軟件世界里有個(gè)很大的特點(diǎn)就是軟件多,授權(quán)幾乎都是采用GPL方式,大家都可以自由參考與使用,但是因?yàn)檫@些軟件多半是由設(shè)計(jì)者利用空余時(shí)間開(kāi)發(fā)的,不以贏利為目的,所以并不能擔(dān)保這些軟件完全沒(méi)有問(wèn)題。盡管如此,仍有許多優(yōu)秀軟件出現(xiàn),例如,大家熟知的KDE與GNOME便是很好的證明。第六頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)7Linux的發(fā)展及應(yīng)用1991年10月5日,LinusTorvalds在新聞組comp.os.minix發(fā)布了大約有1萬(wàn)行代碼的Linuxv0.01版本。1992年,大約有1000人在使用Linux,基本上都屬于真正意義上的黑客。1993年,大約有100余名程序員參與Linux內(nèi)核代碼編寫(xiě)/修改工作,其中核心組由5人組成,此時(shí)Linux0.99的代碼大約有十萬(wàn)行,用戶(hù)大約有10萬(wàn)個(gè)左右。1994年3月,Linux1.0發(fā)布,代碼量為17萬(wàn)行,正式采用GPL協(xié)議。Linux的代碼中充實(shí)了對(duì)不同硬件系統(tǒng)的支持,大大提高了跨平臺(tái)移植性。1995年,Linux可在Intel、Digital,以及SunSPARC處理器上運(yùn)行了,用戶(hù)量也超過(guò)了50萬(wàn),相關(guān)介紹Linux的LinuxJournal雜志的發(fā)行也超過(guò)10萬(wàn)冊(cè)。1996年6月,Linux2.0內(nèi)核發(fā)布,此內(nèi)核大約有40萬(wàn)行代碼,并可以支持多個(gè)處理器。此時(shí)的Linux已經(jīng)進(jìn)入了實(shí)用階段,全球大約有350萬(wàn)人使用。1997年夏,好萊塢影片《泰坦尼克號(hào)》在制作特效中使用的160臺(tái)Alpha圖形工作站中,有105臺(tái)采用了Linux操作系統(tǒng)。1998年是Linux迅猛發(fā)展的一年。RedHat5.0獲得了InfoWorld的操作系統(tǒng)獎(jiǎng)項(xiàng)。4月,Mozilla代碼發(fā)布,成為L(zhǎng)inux圖形界面上的王牌瀏覽器。王牌搜索引擎“Google”現(xiàn)身,采用的也是Linux服務(wù)器。Mysql數(shù)據(jù)庫(kù)充分得到發(fā)展。12月,IBM發(fā)布了適用于Linux的文件系統(tǒng)AFS3.5,以及JikesJava編輯器和SecureMailer及DB2測(cè)試版,IBM的此番行為,可以看做是與Linux的第一次親密接觸。迫于Windows和Linux的壓力,Sun逐漸開(kāi)放了Java協(xié)議,并且在UltraSparc上支持Linux操作系統(tǒng)。由此可見(jiàn),1998年可以說(shuō)是Linux與商業(yè)接觸的一年。第七頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)81999年,IBM宣布與Redhat公司建立伙伴關(guān)系,以確保Redhat在IBM機(jī)器上正確運(yùn)行。3月,第一屆LinuxWorld大會(huì)的召開(kāi),象征Linux時(shí)代的來(lái)臨。IBM、Compaq和Novell宣布投資Redhat公司,以前一直對(duì)Linux持否定態(tài)度的Oracle公司也宣布投資。5月,SGI公司宣布向Linux移植其先進(jìn)的XFS文件系統(tǒng)。7月,IBM啟動(dòng)對(duì)Linux的支持服務(wù),并發(fā)布了LinuxDB2。2000年初始,Sun公司在Linux的壓力下宣布Solaris8降低售價(jià)。事實(shí)上,Linux對(duì)Sun造成的沖擊遠(yuǎn)比對(duì)Windows來(lái)得更大。2月,RedHat發(fā)布了嵌入式Linux的開(kāi)發(fā)環(huán)境,Linux在嵌入式行業(yè)的潛力逐漸被發(fā)掘出來(lái)。2001年Oracle宣布在OTN上的所有會(huì)員都可免費(fèi)索取Oracle9i的Linux版本。IBM則決定投入10億美元擴(kuò)大Linux系統(tǒng)的應(yīng)用。到了5月,微軟公開(kāi)反對(duì)“GPL”,此舉引起了一場(chǎng)大規(guī)模的論戰(zhàn)。8月,紅色代碼爆發(fā),引得許多站點(diǎn)紛紛從Windows操作系統(tǒng)轉(zhuǎn)向Linux操作系統(tǒng)。12月,RedHat為IBMs/390大型計(jì)算機(jī)提供了Linux解決方案。2002年是Linux企業(yè)化的一年。2月,微軟公司迫于各州政府的壓力,宣布擴(kuò)大公開(kāi)代碼行動(dòng),這是Linux開(kāi)源帶來(lái)的深刻影響的結(jié)果。3月,內(nèi)核開(kāi)發(fā)者宣布新的Linux系統(tǒng)支持64位的計(jì)算機(jī)。2003年1月,NEC宣布將在其手機(jī)中使用Linux操作系統(tǒng),代表著Linux成功進(jìn)軍手機(jī)領(lǐng)域。2004年6月的統(tǒng)計(jì)報(bào)告顯示在世界500強(qiáng)超級(jí)計(jì)算機(jī)系統(tǒng)中,使用Linux操作系統(tǒng)的已經(jīng)占到了280席,搶占了原本屬于各種UNIX的份額。9月HP開(kāi)始網(wǎng)羅Linux內(nèi)核代碼人員,以影響新版本的內(nèi)核朝對(duì)HP有利的方式發(fā)展,而IBM則準(zhǔn)備推出OpenPower服務(wù)器,僅運(yùn)行Linux系統(tǒng)。第八頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)9Linux的應(yīng)用和優(yōu)勢(shì)(以銀行為例)銀行業(yè)是中國(guó)各行業(yè)中開(kāi)展信息化建設(shè)最早的行業(yè)之一,其信息化建設(shè)投入力度大,信息化水平高,在各行業(yè)的IT應(yīng)用和系統(tǒng)建設(shè)中走在前列。(1)銀行業(yè)的數(shù)據(jù)量大且集中決定了其對(duì)主機(jī)、存儲(chǔ)設(shè)備、網(wǎng)絡(luò)設(shè)備等硬件設(shè)備需求很大;同時(shí)對(duì)存儲(chǔ)管理、數(shù)據(jù)倉(cāng)庫(kù)、網(wǎng)絡(luò)管理、網(wǎng)絡(luò)安全、CRM等方面的軟件需求也不小。正由于銀行業(yè)的數(shù)據(jù)量大且集中,因此金融安全問(wèn)題也越發(fā)突出。Linux的高可靠性和安全性是它在這一行業(yè)中應(yīng)用的有力保障。(2)對(duì)銀行業(yè)而言,成本因素在整體經(jīng)濟(jì)環(huán)境欠佳的今天顯得尤其重要。選擇Linux的動(dòng)力很大程度上來(lái)自于各個(gè)企業(yè)公司預(yù)算的減少。(3)Linux系統(tǒng)所具有的優(yōu)良集群特性也是吸引更多客戶(hù)的原因。Linux集群系統(tǒng)能夠讓客戶(hù)相對(duì)落后的PⅡ或PⅢ計(jì)算機(jī)變成可以處理復(fù)雜任務(wù)的超級(jí)計(jì)算機(jī)系統(tǒng)。這對(duì)客戶(hù)來(lái)說(shuō)是非常有吸引力的。(4)北京市商業(yè)銀行綜合業(yè)務(wù)系統(tǒng)建設(shè)采用了基于IBMServeri系列服務(wù)器的Linux解決方案。該解決方案從整體上減少了總擁有成本,并且減少了系統(tǒng)管理的復(fù)雜性,實(shí)現(xiàn)了對(duì)人員、財(cái)政及信息技術(shù)的有效管理,同時(shí)還提高了服務(wù)器管理能力。(5)再以印度工業(yè)開(kāi)發(fā)銀行(IDBI)為例。他們自1995年開(kāi)始使用Linux系統(tǒng)從事關(guān)鍵的電話(huà)銀行、資產(chǎn)追蹤及人力資源管理等業(yè)務(wù),IDBI因此節(jié)省的IT預(yù)算達(dá)到70%。(6)如今有越來(lái)越多的商業(yè)公司采用Linux作為操作系統(tǒng),例如,科學(xué)工作者使用Linux來(lái)進(jìn)行分布式計(jì)算,ISP使用Linux配置Intranet服務(wù)器、電話(huà)撥號(hào)服務(wù)器等網(wǎng)絡(luò)服務(wù)器,CERN(西歐核子中心)采用Linux做物理數(shù)據(jù)處理。第九頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)102.2Linux內(nèi)核由于的源代碼是完全公開(kāi)的,任何人只要遵循GPL,就可以對(duì)內(nèi)核加以修改并發(fā)布給他人使用。因此,在廣大編程人員的支持下,Linux的內(nèi)核版本不斷更新,新的內(nèi)核修改了舊內(nèi)核的缺陷,并增加了許多新的特性。用戶(hù)如果想在自己的系統(tǒng)中使用這些新的特性,或想根據(jù)自己的系統(tǒng)量身定制更高效、更穩(wěn)定可靠的內(nèi)核,只需要重新編譯內(nèi)核。當(dāng)內(nèi)核的編譯工作完成之后,會(huì)生成一個(gè)可執(zhí)行的二進(jìn)制文件,該二進(jìn)制文件放入嵌入式系統(tǒng)的ROM中,可以完成系統(tǒng)的上電、復(fù)位自動(dòng)運(yùn)行。2.2.1Linux的內(nèi)核特征2.2.2進(jìn)程管理2.2.3內(nèi)存管理2.2.4文件系統(tǒng)管理2.2.5設(shè)備管理2.2.6進(jìn)程間通信機(jī)制第十頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)11Linux的內(nèi)核特征內(nèi)核是操作系統(tǒng)的內(nèi)部核心程序,它向外部提供了對(duì)計(jì)算機(jī)設(shè)備的核心管理調(diào)用。操作系統(tǒng)的代碼分為以下兩部分,內(nèi)核所在的地址空間稱(chēng)為內(nèi)核空間,外部管理程序與用戶(hù)進(jìn)程所占據(jù)的地址空間稱(chēng)為外部空間(用戶(hù)空間)。通常,一個(gè)程序會(huì)跨越兩個(gè)空間。當(dāng)執(zhí)行到內(nèi)核空間的一段代碼時(shí),稱(chēng)程序處于核心態(tài);而當(dāng)程序執(zhí)行到外部空間代碼時(shí),稱(chēng)程序處于用戶(hù)態(tài)。單一內(nèi)核(MonolithicKernel)曾經(jīng)是操作系統(tǒng)的主流,它是指操作系統(tǒng)中所有的系統(tǒng)相關(guān)功能都被封裝在內(nèi)核中。它們與外部程序處在不同的內(nèi)存地址空間中,并通過(guò)各種方式防止外部程序直接訪(fǎng)問(wèn)內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)。程序只有通過(guò)一套稱(chēng)作系統(tǒng)調(diào)用(SystemCall)的界面訪(fǎng)問(wèn)內(nèi)核結(jié)構(gòu)。近些年來(lái),微內(nèi)核(MicroKernel)結(jié)構(gòu)逐漸流行起來(lái),成為操作系統(tǒng)的主要潮流。在微內(nèi)核結(jié)構(gòu)中,操作系統(tǒng)的內(nèi)核只需要提供最基本、最核心的一部分操作(例如,創(chuàng)建和刪除任務(wù)、內(nèi)存管理、中斷管理等)即可,而其他管理程序(如文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧等)則盡可能放在內(nèi)核以外。這些外部程序可以獨(dú)立運(yùn)行,并對(duì)外部用戶(hù)程序提供操作系統(tǒng)服務(wù),服務(wù)之間使用進(jìn)程間通信機(jī)制(IPC)進(jìn)行交互。如同面向?qū)ο蟪绦蛟O(shè)計(jì)帶來(lái)的好處一樣,微內(nèi)核使操作系統(tǒng)內(nèi)部結(jié)構(gòu)變得簡(jiǎn)單清晰。在內(nèi)核以外的外部程序分別獨(dú)立運(yùn)行,其間并不互相關(guān)聯(lián)。這樣,可以對(duì)這些程序分別進(jìn)行維護(hù)和拆裝,只要遵循已經(jīng)規(guī)定好的界面,就不會(huì)對(duì)其他程序有任何干擾。這使得程序代碼在維護(hù)上十分方便,體現(xiàn)了面向?qū)ο笫杰浖慕Y(jié)構(gòu)特征。第十一頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)12微內(nèi)核的結(jié)構(gòu)也存在著不足之處。首先,程序代碼之間的相互隔離,使得整個(gè)系統(tǒng)喪失了許多優(yōu)化的機(jī)會(huì)。其次,部分資源浪費(fèi)在外部進(jìn)程之間的通信上,這樣,微內(nèi)核結(jié)構(gòu)在效率上必然低于傳統(tǒng)的單一內(nèi)核結(jié)構(gòu),這些效率損失將作為結(jié)構(gòu)精簡(jiǎn)的代價(jià)??傮w上說(shuō),在當(dāng)前的硬件條件下,微內(nèi)核在效率上的損失小于其在結(jié)構(gòu)上獲得的收益,故而選取微內(nèi)核成為操作系統(tǒng)的一大潮流。然而,Linux系統(tǒng)恰恰使用了單一內(nèi)核結(jié)構(gòu)。這是由于Linux是一個(gè)實(shí)用主義的操作系統(tǒng)。LinusTorvalds將代碼執(zhí)行效率作為自己操作系統(tǒng)的第一要?jiǎng)?wù)。在這樣的發(fā)展過(guò)程中,參與Linux系統(tǒng)開(kāi)發(fā)的程序員大多數(shù)為世界各地的黑客們。比起結(jié)構(gòu)的清晰,他們更加注重功能的強(qiáng)大和高效率的代碼。于是,他們將大量的精力花在優(yōu)化代碼上,而這樣的全局性?xún)?yōu)化必然以損失結(jié)構(gòu)精練作為代價(jià),導(dǎo)致Linux中的每個(gè)部件都不能被輕易拆出,否則,必然破壞整體效率。雖然Linux是一個(gè)單一內(nèi)核操作系統(tǒng),但它與傳統(tǒng)的單一內(nèi)核UNIX操作系統(tǒng)不同。在普通的單一內(nèi)核系統(tǒng)中,所有內(nèi)核代碼都是被靜態(tài)編譯連入的。而在Linux中,可以動(dòng)態(tài)裝入和卸載內(nèi)核中的部分代碼。Linux中將這樣的代碼段稱(chēng)為模塊(Module),并對(duì)模塊給予了強(qiáng)有力的支持。在Linux中,可以在需要時(shí)自動(dòng)裝入和卸載模塊。Linux的內(nèi)核為非搶占式的(Non-preemptive)。這就是說(shuō),Linux并不能通過(guò)改變優(yōu)先權(quán)來(lái)影響內(nèi)核當(dāng)前的執(zhí)行流程。Linux并不是一個(gè)“硬”實(shí)時(shí)操作系統(tǒng)。Linux操作系統(tǒng)的內(nèi)核穩(wěn)定而高效,以獨(dú)占的方式執(zhí)行最底層任務(wù),來(lái)保證其他程序的正常運(yùn)行。它是整個(gè)操作系統(tǒng)的核心,具有獨(dú)特的性質(zhì)。第十二頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)13進(jìn)程管理進(jìn)程是運(yùn)行于自己的虛擬地址空間的一個(gè)程序??梢哉f(shuō),任何在Linux系統(tǒng)下運(yùn)行的都是進(jìn)程。Linux系統(tǒng)中包括下面幾種類(lèi)型的進(jìn)程。
交互進(jìn)程:該進(jìn)程是由shell控制和運(yùn)行的。它既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行。
批處理進(jìn)程:該進(jìn)程不屬于某個(gè)終端,被提交到一個(gè)隊(duì)列中以便順序執(zhí)行。
守護(hù)進(jìn)程:該進(jìn)程只有在需要時(shí)才被喚起在后臺(tái)運(yùn)行。它一般在Linux啟動(dòng)時(shí)開(kāi)始執(zhí)行。進(jìn)程是動(dòng)態(tài)的,在處理器執(zhí)行機(jī)器代碼時(shí)進(jìn)程一直在變化。進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計(jì)數(shù)器和CPU的所有寄存器,以及存儲(chǔ)臨時(shí)數(shù)據(jù)的進(jìn)程堆棧。由此可見(jiàn),正在執(zhí)行的進(jìn)程包括處理器當(dāng)前的一切活動(dòng)。Linux是一個(gè)多進(jìn)程的操作系統(tǒng),每個(gè)進(jìn)程都有自己的權(quán)限和任務(wù),某一進(jìn)程的失敗一般不會(huì)導(dǎo)致其他進(jìn)程的失敗,進(jìn)程之間可以通過(guò)由內(nèi)核控制的機(jī)制相互通訊。在進(jìn)程的整個(gè)運(yùn)行期間,它將會(huì)用到各種系統(tǒng)資源,會(huì)用到CPU運(yùn)行它的指令,需要物理內(nèi)存保存它的數(shù)據(jù)。它可能打開(kāi)和使用各種文件,直接或間接地使用系統(tǒng)中的各種物理設(shè)備。Linux系統(tǒng)內(nèi)核必須了解進(jìn)程本身的情況和進(jìn)程所用到的各種資源,以便在多個(gè)進(jìn)程之間合理地分配系統(tǒng)資源。系統(tǒng)中最為寶貴的資源是CPU,因?yàn)樵谝话闱闆r下,一個(gè)系統(tǒng)只有一個(gè)CPU。Linux是一個(gè)多進(jìn)程的操作系統(tǒng),所以,其他的進(jìn)程必須等到正在運(yùn)行的進(jìn)程空閑CPU后才能運(yùn)行。當(dāng)正在運(yùn)行的進(jìn)程等待其他的系統(tǒng)資源時(shí),Linux內(nèi)核將取得CPU的控制權(quán),并將CPU分配給其他正在等待的進(jìn)程。內(nèi)核中的調(diào)度算法決定將CPU分配給哪一個(gè)進(jìn)程。第十三頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)14進(jìn)程管理程序能夠進(jìn)行進(jìn)程的創(chuàng)建、激活、運(yùn)行、阻塞、再運(yùn)行、釋放,以及刪除。進(jìn)程管理程序執(zhí)行下列操作:在多進(jìn)程(或者任務(wù)、線(xiàn)程)系統(tǒng)中執(zhí)行每一個(gè)進(jìn)程,使得進(jìn)程狀態(tài)可以切換。進(jìn)程的順序經(jīng)過(guò)以下這些狀態(tài):“創(chuàng)建”、“就緒或者激活”、“產(chǎn)生”(創(chuàng)建且激活)、“運(yùn)行”、“阻塞”、“再運(yùn)行”、“完成”,以及“完成”之后的“就緒”(當(dāng)進(jìn)程中存在無(wú)限循環(huán)時(shí))。最后,釋放或者刪除(在長(zhǎng)進(jìn)程中,阻塞和再運(yùn)行可以發(fā)生很多次)。進(jìn)程管理程序?qū)崿F(xiàn)以下功能:
使進(jìn)程能夠順序執(zhí)行或者在需要資源時(shí)發(fā)生阻塞,并使其在資源可用時(shí)繼續(xù)運(yùn)行。
為進(jìn)行資源管理(包括CPU上的進(jìn)程調(diào)度)實(shí)現(xiàn)了與資源管理程序的邏輯鏈接。
限制某些資源只在某些進(jìn)程間共享。
按照系統(tǒng)的資源分配機(jī)制分配資源。
管理系統(tǒng)中的進(jìn)程和資源。第十四頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)151.進(jìn)程與線(xiàn)程現(xiàn)在的嵌入式操作系統(tǒng)幾乎都被要求能夠與個(gè)人計(jì)算機(jī)上的操作系統(tǒng)一樣,提供多任務(wù)(Multitasking)功能。但是多數(shù)的嵌入式系統(tǒng)只有一個(gè)處理器,要完成這樣的要求,操作系統(tǒng)必須為這些不同的任務(wù)分配執(zhí)行時(shí)間,而這些任務(wù)就要輪流利用分配到的執(zhí)行時(shí)間來(lái)完成工作。為了方便管理這些任務(wù),嵌入式操作系統(tǒng)會(huì)分別以一個(gè)執(zhí)行單位來(lái)看待一項(xiàng)工作或一個(gè)程序,這個(gè)執(zhí)行單位在不同的嵌入式操作系統(tǒng)中會(huì)有不同的名稱(chēng)與意義,但是基本的思想都是為了讓不同的程序共同分享、使用有限的硬件資源,然后讓用戶(hù)在使用系統(tǒng)時(shí),好像可以“同時(shí)”執(zhí)行多個(gè)應(yīng)用程序。Linux采用所謂“繼承”的方法來(lái)進(jìn)行資源分配。每個(gè)新的進(jìn)程都必須先從父進(jìn)程(ParentProcess)中去繼承一份系統(tǒng)資源,基本上就是子進(jìn)程(ChildProcess)分配到另外一塊獨(dú)立的內(nèi)存空間,然后從父進(jìn)程的內(nèi)存空間中把所有的數(shù)據(jù)完完全全拷貝過(guò)來(lái),再通過(guò)參數(shù)的設(shè)置決定是否與父進(jìn)程分享資源,并決定子進(jìn)程屬于重優(yōu)先權(quán)值進(jìn)程(HeavyWeightProcess)還是輕優(yōu)先權(quán)值進(jìn)程(LightWeightProcess)。輕優(yōu)先權(quán)值進(jìn)程在Linux里也稱(chēng)為線(xiàn)程。第十五頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)162.進(jìn)程的狀態(tài)不論采用何種方式,嵌入式操作系統(tǒng)必須管理多任務(wù)的執(zhí)行與切換,因?yàn)槟骋粫r(shí)刻真正被CPU執(zhí)行的任務(wù)只有一個(gè),所以當(dāng)同時(shí)存在許多不同的任務(wù)時(shí),每個(gè)任務(wù)的狀態(tài)都不相同。一個(gè)進(jìn)程在其生存期內(nèi),可處于一組不同的狀態(tài)下,稱(chēng)為進(jìn)程狀態(tài)。如圖2.2所示。操作系統(tǒng)會(huì)以一個(gè)特殊的數(shù)據(jù)結(jié)構(gòu)來(lái)代表一個(gè)進(jìn)程。這個(gè)特殊的數(shù)據(jù)結(jié)構(gòu)會(huì)記錄一些重要的數(shù)據(jù),通常被稱(chēng)為PCB(ProcessControlBlock)或TCB(TaskControlBlock)。它除了包含taskcontext(任務(wù)上下文)之外,還會(huì)記錄句柄、優(yōu)先級(jí),以及一些進(jìn)程的附屬數(shù)據(jù),這些數(shù)據(jù)提供了調(diào)度程序(Scheduler)調(diào)度時(shí)所需的全部信息。進(jìn)程狀態(tài)就保存在TCB的state字段中。內(nèi)核程序通過(guò)任務(wù)向量表對(duì)進(jìn)程進(jìn)行管理,每個(gè)進(jìn)程在向量表中占有一項(xiàng)。在Linux系統(tǒng)中,任務(wù)向量表項(xiàng)是一個(gè)task_struct任務(wù)結(jié)構(gòu)指針(在Linux中task和process互用)。任務(wù)數(shù)據(jù)結(jié)構(gòu)定義在頭文件include/linux/sched.h中。這個(gè)數(shù)據(jù)結(jié)構(gòu)也就是前面提到的TCB或PCB。當(dāng)新的進(jìn)程創(chuàng)建的時(shí)候,進(jìn)程管理模塊從系統(tǒng)內(nèi)存中分配一個(gè)新的task_struct,并增加到task向量表中。為了更容易查找,用current指針指向當(dāng)前運(yùn)行的進(jìn)程。當(dāng)一個(gè)進(jìn)程在執(zhí)行時(shí),CPU的所有寄存器中的值、進(jìn)程的狀態(tài),以及堆棧中的內(nèi)容被稱(chēng)為該進(jìn)程的上下文。當(dāng)內(nèi)核需要切換(switch)至另一個(gè)進(jìn)程時(shí),它就需要保存當(dāng)前進(jìn)程的所有狀態(tài),即保存當(dāng)前進(jìn)程的上下文,以便在再次執(zhí)行該進(jìn)程時(shí),能夠恢復(fù)到切換時(shí)的狀態(tài)并執(zhí)行下去。在Linux中,當(dāng)前進(jìn)程的上下文均保存在進(jìn)程的任務(wù)數(shù)據(jù)結(jié)構(gòu)中。第十六頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)17第十七頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)18
運(yùn)行狀態(tài)(TASK_RUNNING),當(dāng)進(jìn)程正在被CPU執(zhí)行,或已經(jīng)準(zhǔn)備就緒隨時(shí)可由調(diào)度程序執(zhí)行時(shí),稱(chēng)該進(jìn)程處于運(yùn)行狀態(tài)(running)。進(jìn)程可以在內(nèi)核態(tài)運(yùn)行,也可以在用戶(hù)態(tài)運(yùn)行。當(dāng)系統(tǒng)資源已經(jīng)可用時(shí),進(jìn)程就被喚醒而進(jìn)入準(zhǔn)備運(yùn)行狀態(tài),該狀態(tài)稱(chēng)為就緒態(tài)。這些狀態(tài)在內(nèi)核中表示方法相同,都被稱(chēng)為處于TASK_RUNNING狀態(tài)。
可中斷睡眠狀態(tài)(TASK_INTERRUPTIBLE),當(dāng)進(jìn)程處于可中斷等待狀態(tài)時(shí),系統(tǒng)不會(huì)調(diào)度該進(jìn)程執(zhí)行。當(dāng)系統(tǒng)產(chǎn)生一個(gè)中斷或者釋放了進(jìn)程正在等待的資源,或者進(jìn)程收到一個(gè)信號(hào),都可以喚醒進(jìn)程轉(zhuǎn)換到就緒狀態(tài)(運(yùn)行狀態(tài))。
不可中斷睡眠狀態(tài)(TASK_UNINTERRUPTIBLE),不可中斷睡眠狀態(tài)與可中斷睡眠狀態(tài)類(lèi)似。但處于該狀態(tài)的進(jìn)程只有被使用wake_up()函數(shù)明確喚醒時(shí),才能轉(zhuǎn)換到可運(yùn)行的就緒狀態(tài)。
暫停狀態(tài)(TASK_STOPPED),當(dāng)進(jìn)程收到信號(hào)SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時(shí)就會(huì)進(jìn)入暫停狀態(tài)??上蚱浒l(fā)送SIGCONT信號(hào)讓進(jìn)程轉(zhuǎn)換到可運(yùn)行狀態(tài),正在調(diào)試的進(jìn)程可以處在停止?fàn)顟B(tài)。
僵死狀態(tài)(TASK_ZOMBIE),當(dāng)進(jìn)程已停止運(yùn)行,但其父進(jìn)程還沒(méi)有詢(xún)問(wèn)其狀態(tài)時(shí),則稱(chēng)該進(jìn)程處于僵死狀態(tài)。只有當(dāng)進(jìn)程從“內(nèi)核運(yùn)行態(tài)”轉(zhuǎn)移到“睡眠狀態(tài)”時(shí),內(nèi)核才會(huì)進(jìn)行進(jìn)程切換操作。在內(nèi)核態(tài)下運(yùn)行的進(jìn)程不能被其他進(jìn)程搶占,而且一個(gè)進(jìn)程不能改變另一個(gè)進(jìn)程的狀態(tài)。為了避免進(jìn)程切換時(shí)造成內(nèi)核數(shù)據(jù)錯(cuò)誤,內(nèi)核在執(zhí)行臨界區(qū)代碼時(shí)會(huì)禁止一切中斷。第十八頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)193.進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建是指為創(chuàng)建的進(jìn)程定義地址空間(存儲(chǔ)器塊),并為進(jìn)程定義資源。Linux系統(tǒng)采用繼承的方式創(chuàng)建進(jìn)程。進(jìn)程管理程序在創(chuàng)建進(jìn)程時(shí)分配TCB,并對(duì)它進(jìn)行管理。TCB是進(jìn)程管理程序使用的進(jìn)程描述符。其他OS單元可以在必要的時(shí)候查詢(xún)進(jìn)程的TCB。系統(tǒng)啟動(dòng)的時(shí)候運(yùn)行在核心態(tài),這時(shí),只有一個(gè)進(jìn)程:初始化進(jìn)程。初始化進(jìn)程是一個(gè)在處理器重啟時(shí)執(zhí)行存儲(chǔ)器指令,然后調(diào)用OS的進(jìn)程。處理器隨后開(kāi)始執(zhí)行創(chuàng)建的所有進(jìn)程。像所有其他進(jìn)程一樣,初始進(jìn)程有一組用堆棧、寄存器等表示的機(jī)器狀態(tài)。當(dāng)系統(tǒng)中的其他進(jìn)程創(chuàng)建和運(yùn)行時(shí),這些信息存在初始進(jìn)程的task_struct數(shù)據(jù)結(jié)構(gòu)中。在系統(tǒng)初始化結(jié)束的時(shí)候,初始進(jìn)程啟動(dòng)一個(gè)核心線(xiàn)程(init)然后執(zhí)行空閑循環(huán),即什么也不做。也就是說(shuō),當(dāng)處理器沒(méi)有什么可以做的時(shí)候,調(diào)度程序會(huì)運(yùn)行這個(gè)空閑的進(jìn)程。這個(gè)空閑進(jìn)程的task_struct是惟一一個(gè)不是動(dòng)態(tài)分配而是在核心連接的時(shí)候靜態(tài)定義的,為了不至于混淆,叫做init_task。init核心進(jìn)程擁有進(jìn)程標(biāo)志符1,是系統(tǒng)的第一個(gè)真正的進(jìn)程。它執(zhí)行系統(tǒng)的一些初始化的設(shè)置(比如,打開(kāi)系統(tǒng)控制器,安裝根文件系統(tǒng)等),然后執(zhí)行系統(tǒng)初始化程序。根據(jù)系統(tǒng)的不同,初始化程序可能是/etc/init,/bin/init或/sbin/init其中之一。init程序使用/etc/inittab作為腳本文件創(chuàng)建系統(tǒng)中的新進(jìn)程,這些新進(jìn)程自身可能創(chuàng)建新的進(jìn)程。例如,getty進(jìn)程可能會(huì)在用戶(hù)試圖登錄的時(shí)候創(chuàng)建一個(gè)login的進(jìn)程。系統(tǒng)中的所有進(jìn)程都是init核心線(xiàn)程的后代。第十九頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)20新進(jìn)程的創(chuàng)建是通過(guò)克隆舊的進(jìn)程,或者說(shuō)克隆當(dāng)前的進(jìn)程來(lái)實(shí)現(xiàn)的。一個(gè)新的任務(wù)是通過(guò)系統(tǒng)調(diào)用創(chuàng)建的(fork或clone),克隆發(fā)生在核心的核心態(tài)。在系統(tǒng)調(diào)用的最后,產(chǎn)生一個(gè)新的進(jìn)程,等待調(diào)度程序選擇它運(yùn)行(在新進(jìn)程的創(chuàng)建未完成之前,為了防止這個(gè)還未處理完成的新建進(jìn)程被調(diào)度函數(shù)執(zhí)行,應(yīng)該將新進(jìn)程狀態(tài)置為不可中斷的等待狀態(tài))。在系統(tǒng)的物理內(nèi)存中為這個(gè)克隆進(jìn)程的堆棧(用戶(hù)和核心)分配一個(gè)或多個(gè)物理的頁(yè)用于新的task_struct數(shù)據(jù)結(jié)構(gòu)。一個(gè)進(jìn)程標(biāo)志符將會(huì)創(chuàng)建,它在系統(tǒng)的進(jìn)程標(biāo)志符組中是惟一的。新的task_struct進(jìn)入task向量表中,舊的(當(dāng)前的)進(jìn)程的task_struct的內(nèi)容拷貝到克隆的task_struct。克隆進(jìn)程的時(shí)候,Linux允許兩個(gè)進(jìn)程共享資源而不是擁有不同的拷貝,包括進(jìn)程的文件,信號(hào)處理和虛擬內(nèi)存。共享這些資源的時(shí)候,它們相應(yīng)的count字段相應(yīng)增減,這樣,Linux在兩個(gè)進(jìn)程都停止使用之前不會(huì)釋放這些資源。例如,如果克隆的進(jìn)程要共享虛擬內(nèi)存,它的task_struct會(huì)包括一個(gè)指向原來(lái)進(jìn)程的mm_struct指針,mm_struct的count域增加,表示當(dāng)前共享它的進(jìn)程。4.進(jìn)程的調(diào)度Linux進(jìn)程是搶占式的。被搶占的進(jìn)程仍然處于TASK_RUNNING狀態(tài),只是暫時(shí)沒(méi)有被CPU運(yùn)行。進(jìn)程的搶占發(fā)生在進(jìn)程處于用戶(hù)態(tài)執(zhí)行階段,在內(nèi)核態(tài)執(zhí)行時(shí)是不能被搶占的。為了能讓進(jìn)程有效地使用系統(tǒng)資源,又能使進(jìn)程有較快的響應(yīng)時(shí)間,Linux中采用基于優(yōu)先級(jí)排隊(duì)的調(diào)度策略。通常,核心會(huì)以分時(shí)(TimeSlicing)的觀念讓多任務(wù)共享CPU資源,即將CPU執(zhí)行的時(shí)間分成一段段的,每個(gè)程序會(huì)利用分配到的時(shí)間來(lái)執(zhí)行任務(wù)。每一段的執(zhí)行時(shí)間到了,就必須輪換下一個(gè)任務(wù)執(zhí)行。至于輪到哪一個(gè)任務(wù)來(lái)執(zhí)行,必須由核心的調(diào)度程序來(lái)決定。第二十頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)21在所有的進(jìn)程中,部分運(yùn)行于用戶(hù)態(tài),部分運(yùn)行于核心態(tài)。底層的硬件支持這些狀態(tài)的方式各不相同,但是通常有一個(gè)安全機(jī)制從用戶(hù)態(tài)轉(zhuǎn)入核心態(tài)并轉(zhuǎn)回來(lái)。用戶(hù)態(tài)比核心態(tài)的權(quán)限低很多。每一次進(jìn)程執(zhí)行一個(gè)系統(tǒng)調(diào)用,它都從用戶(hù)態(tài)切換到核心態(tài)并繼續(xù)執(zhí)行。這時(shí),讓核心執(zhí)行這個(gè)進(jìn)程。在Linux中,進(jìn)程不是通過(guò)互相爭(zhēng)奪成為當(dāng)前運(yùn)行的進(jìn)程,因?yàn)樗鼈儫o(wú)法停止正在運(yùn)行的其他進(jìn)程而執(zhí)行自身。每一個(gè)進(jìn)程在它必須等待一些系統(tǒng)事件的時(shí)候會(huì)放棄CPU。例如,一個(gè)進(jìn)程可能不得不等待從一個(gè)文件中讀取一個(gè)字符,這個(gè)等待發(fā)生在核心態(tài)的系統(tǒng)調(diào)用中,進(jìn)程使用了庫(kù)函數(shù)打開(kāi)并讀文件,庫(kù)函數(shù)又執(zhí)行系統(tǒng)調(diào)用從打開(kāi)的文件中讀入字節(jié)。這時(shí),等候的進(jìn)程會(huì)被掛起,另一個(gè)合適的進(jìn)程將會(huì)被選擇執(zhí)行。由于進(jìn)程經(jīng)常調(diào)用系統(tǒng)調(diào)用,所以經(jīng)常需要等待。由于即使進(jìn)程執(zhí)行到需要等待,也有可能會(huì)用去不均衡的CPU時(shí)間,所以L(fǎng)inux使用搶先式的調(diào)度。用這種方案,每一個(gè)進(jìn)程允許運(yùn)行少量一段時(shí)間,通常為200毫秒,當(dāng)這段時(shí)間過(guò)去,選擇另一個(gè)進(jìn)程運(yùn)行,原來(lái)的進(jìn)程等待一段時(shí)間直到它又重新運(yùn)行。這個(gè)時(shí)間段就叫做時(shí)間片。調(diào)度程序的任務(wù)就是選擇當(dāng)前可運(yùn)行的進(jìn)程中最值得運(yùn)行的一個(gè)進(jìn)程。一個(gè)可以運(yùn)行的進(jìn)程是一個(gè)只等待CPU的進(jìn)程。Linux使用合理而簡(jiǎn)單的基于優(yōu)先級(jí)的調(diào)度算法在系統(tǒng)當(dāng)前的進(jìn)程中進(jìn)行選擇。當(dāng)它選擇了準(zhǔn)備運(yùn)行的新進(jìn)程,就保存當(dāng)前進(jìn)程的狀態(tài)、與處理器相關(guān)的寄存器,以及其他需要保存的上下文信息到進(jìn)程的task_struct數(shù)據(jù)結(jié)構(gòu)中。然后恢復(fù)要運(yùn)行的新的進(jìn)程的狀態(tài)(又和處理器相關(guān)),把系統(tǒng)的控制交給這個(gè)進(jìn)程。第二十一頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)22為了公平地在系統(tǒng)中所有可以運(yùn)行(runnable)的進(jìn)程之間分配CPU時(shí)間,調(diào)度程序在每一個(gè)進(jìn)程的task_struct結(jié)構(gòu)中保存了以下信息(參見(jiàn)Linux核心源文件kernel/sched.c中的函數(shù)schedule())。
Policy進(jìn)程的調(diào)度策略。Linux有兩種類(lèi)型的進(jìn)程:普通和實(shí)時(shí)。實(shí)時(shí)進(jìn)程比所有其他進(jìn)程的優(yōu)先級(jí)高。如果有一個(gè)實(shí)時(shí)的進(jìn)程準(zhǔn)備運(yùn)行,那么它總是先被運(yùn)行。實(shí)時(shí)進(jìn)程有兩種策略:循環(huán)或先進(jìn)先出(roundrobinandfirstinfirstout)。在循環(huán)的調(diào)度策略下,每一個(gè)實(shí)時(shí)進(jìn)程依次運(yùn)行,而在先進(jìn)先出的策略下,每一個(gè)可以運(yùn)行的進(jìn)程按照它在調(diào)度隊(duì)列中的順序運(yùn)行,這個(gè)順序不會(huì)改變。
Priority進(jìn)程的調(diào)度優(yōu)先級(jí)。也是指它允許運(yùn)行時(shí)可以使用的時(shí)間量(jiffies)。可以通過(guò)系統(tǒng)調(diào)用或者renice命令來(lái)改變一個(gè)進(jìn)程的優(yōu)先級(jí)。
Rt_priorityLinux支持實(shí)時(shí)進(jìn)程。這些進(jìn)程比系統(tǒng)中其他非實(shí)時(shí)的進(jìn)程擁有更高的優(yōu)先級(jí)。這個(gè)域允許調(diào)度程序賦予每一個(gè)實(shí)時(shí)進(jìn)程一個(gè)相對(duì)的優(yōu)先級(jí)。實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)可以用系統(tǒng)調(diào)用來(lái)修改。
Counter這是進(jìn)程可以運(yùn)行的時(shí)間量(jiffies)。進(jìn)程啟動(dòng)的時(shí)候等于優(yōu)先級(jí)(priority)的數(shù)值,每一個(gè)時(shí)鐘周期遞減1。調(diào)度程序從核心的多個(gè)地方運(yùn)行。它可以在把當(dāng)前進(jìn)程放到等待隊(duì)列之后運(yùn)行,也可以在系統(tǒng)調(diào)用之后進(jìn)程從核心態(tài)返回用戶(hù)態(tài)之前運(yùn)行。需要運(yùn)行調(diào)度程序的另一個(gè)原因是系統(tǒng)時(shí)鐘剛好把當(dāng)前進(jìn)程的計(jì)數(shù)器(counter)置成0。第二十二頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)23每一次運(yùn)行調(diào)度程序會(huì)完成以下工作:
kernelwork運(yùn)行bottomhalfhandler并處理系統(tǒng)的調(diào)度任務(wù)隊(duì)列。
Currentpoccess在選擇另一個(gè)進(jìn)程之前處理當(dāng)前進(jìn)程。
如果當(dāng)前進(jìn)程的調(diào)度策略是循環(huán)則將它放到運(yùn)行隊(duì)列的最后。
如果任務(wù)是可中斷的而且它上次調(diào)度的時(shí)候收到過(guò)一個(gè)信號(hào),將它的狀態(tài)變?yōu)镽UNNING。
如果當(dāng)前進(jìn)程超時(shí),將它的狀態(tài)成為RUNNING。
如果當(dāng)前進(jìn)程的狀態(tài)為RUNNING則保持此狀態(tài)。
將不是RUNNING或者INTERRUPTIBLE的進(jìn)程從運(yùn)行隊(duì)列中刪除。這意味著當(dāng)調(diào)度程序查找最值得運(yùn)行的進(jìn)程時(shí)不會(huì)考慮這樣的進(jìn)程。
ProcessSelection查看運(yùn)行隊(duì)列中的進(jìn)程,查找最值得運(yùn)行的進(jìn)程。
SwapProcesses如果最值得運(yùn)行的進(jìn)程不是當(dāng)前進(jìn)程,當(dāng)前進(jìn)程必須被掛起,運(yùn)行新的進(jìn)程。一個(gè)進(jìn)程運(yùn)行時(shí)會(huì)使用系統(tǒng)的CPU、寄存器和物理內(nèi)存。每一次它調(diào)用例程都通過(guò)寄存器或者堆棧傳遞參數(shù)、保存數(shù)值等??梢?jiàn),當(dāng)調(diào)度程序運(yùn)行的時(shí)候,它是在當(dāng)前進(jìn)程的上下文中運(yùn)行。它可能處于特權(quán)模式:核心態(tài),但是它仍舊運(yùn)行在當(dāng)前進(jìn)程的上下文中。當(dāng)這個(gè)進(jìn)程需要掛起時(shí),它的所有機(jī)器狀態(tài),包括程序計(jì)數(shù)器(PC)和所有的處理器寄存器,必須存到進(jìn)程的task_struct數(shù)據(jù)結(jié)構(gòu)中。然后,加載新進(jìn)程的所有機(jī)器狀態(tài)。這種操作依賴(lài)于系統(tǒng),不同CPU的實(shí)現(xiàn)方法也不相同,不過(guò),通常都是通過(guò)一些硬件的幫助來(lái)實(shí)現(xiàn)。第二十三頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)24具體調(diào)度過(guò)程如下:schedule()函數(shù)首先掃描任務(wù)數(shù)組。通過(guò)比較每個(gè)就緒態(tài)(TASK_RUNNING)任務(wù)的運(yùn)行時(shí)間遞減計(jì)數(shù)counter的值來(lái)確定當(dāng)前哪個(gè)進(jìn)程運(yùn)行的時(shí)間最少。哪一個(gè)任務(wù)的counter值大,就表示運(yùn)行時(shí)間還不長(zhǎng),于是就選中該進(jìn)程,并使用任務(wù)切換宏函數(shù)切換到該進(jìn)程運(yùn)行。如果此時(shí)所有處于TASK_RUNNING狀態(tài)進(jìn)程的時(shí)間片都已經(jīng)用完,系統(tǒng)就會(huì)根據(jù)每個(gè)進(jìn)程的優(yōu)先權(quán)值priority,對(duì)系統(tǒng)中所有進(jìn)程(包括正在睡眠的進(jìn)程)重新計(jì)算每個(gè)任務(wù)需要運(yùn)行的時(shí)間片值counter。計(jì)算的公式是:counter
counter/2
priority然后schedule()函數(shù)重新掃描任務(wù)數(shù)組中所有處于TASK_RUNNING的狀態(tài),重復(fù)上述過(guò)程,直到選擇出一個(gè)進(jìn)程為止。最后調(diào)用switch_to()執(zhí)行實(shí)際的進(jìn)程切換操作。執(zhí)行實(shí)際進(jìn)程切換的任務(wù)由switch_to()宏定義的一段匯編代碼完成。在進(jìn)行切換之前,switch_to()首先檢查要切換到的進(jìn)程是否就是當(dāng)前進(jìn)程,如果是,則什么也不做,直接退出。否則就把內(nèi)核全局變量current置為新任務(wù)的指針,然后完成上下文的切換。第二十四頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)255.進(jìn)程的終止當(dāng)一個(gè)進(jìn)程結(jié)束了運(yùn)行或在半途終止了運(yùn)行,那么內(nèi)核就需要釋放該進(jìn)程所占用的系統(tǒng)資源。這包括進(jìn)程運(yùn)行時(shí)打開(kāi)的文件、申請(qǐng)的內(nèi)存等。當(dāng)一個(gè)用戶(hù)程序調(diào)用exit()系統(tǒng)調(diào)用時(shí),則執(zhí)行內(nèi)核函數(shù)do_exit()。該函數(shù)會(huì)首先釋放進(jìn)程代碼段和數(shù)據(jù)段占用的內(nèi)存頁(yè)面,關(guān)閉進(jìn)程打開(kāi)著的所有文件等。如果進(jìn)程有子進(jìn)程,則讓init進(jìn)程作為其所有子進(jìn)程的父進(jìn)程,然后把進(jìn)程狀態(tài)置為僵死狀態(tài)TASK_ZOMBIE,并向其原父進(jìn)程發(fā)送SIGCHLD信號(hào),通知其某個(gè)子進(jìn)程已經(jīng)終止。最后do_exit()調(diào)用調(diào)度函數(shù)去執(zhí)行其他進(jìn)程。由此可見(jiàn),在進(jìn)程被終止時(shí),它的任務(wù)數(shù)據(jù)結(jié)構(gòu)仍然保留著,因?yàn)槠涓高M(jìn)程還需要使用其中的信息。子進(jìn)程在執(zhí)行期間,父進(jìn)程通常使用wait()或waitpid()函數(shù)等待其某個(gè)子進(jìn)程終止。當(dāng)?shù)却淖舆M(jìn)程被終止并處于僵死狀態(tài)時(shí),父進(jìn)程就會(huì)把子進(jìn)程運(yùn)行所使用的時(shí)間累加到自己進(jìn)程中。最終釋放已終止子進(jìn)程任務(wù)數(shù)據(jù)結(jié)構(gòu)所占用的內(nèi)存頁(yè)面,并置空子進(jìn)程在任務(wù)數(shù)組中占用的指針項(xiàng)。第二十五頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)26內(nèi)存管理內(nèi)存管理(MemoryManagement)系統(tǒng)是操作系統(tǒng)中最為重要的部分,內(nèi)存管理程序子系統(tǒng)負(fù)責(zé)控制進(jìn)程對(duì)硬件內(nèi)存資源的訪(fǎng)問(wèn)。這是通過(guò)硬件內(nèi)存管理單元(MemoryManagementUnit,MMU)來(lái)完成的,該單元提供進(jìn)程內(nèi)存引用與計(jì)算機(jī)的物理內(nèi)存之間的映射。內(nèi)存管理程序子系統(tǒng)為每個(gè)進(jìn)程都維護(hù)一個(gè)這樣的映射關(guān)系,使得兩個(gè)進(jìn)程就可以訪(fǎng)問(wèn)同一個(gè)虛擬內(nèi)存地址,而實(shí)際使用的卻是不同的物理內(nèi)存位置。此外,內(nèi)存管理程序子系統(tǒng)支持交換,它把暫時(shí)不使用的內(nèi)存頁(yè)面移出內(nèi)存,存放到永久性存儲(chǔ)器(如硬盤(pán)存儲(chǔ)器)中,這樣,計(jì)算機(jī)就可以支持比物理內(nèi)存要多的虛擬內(nèi)存。內(nèi)存管理程序提供以下一些功能:
大地址空間——用戶(hù)程序使用的內(nèi)存數(shù)量可以超過(guò)物理上實(shí)際所有的內(nèi)存數(shù)量。
保護(hù)——進(jìn)程的內(nèi)存是私有的,不能被其他進(jìn)程所讀取和修改。而且,內(nèi)存管理程序可以防止進(jìn)程覆蓋代碼和只讀數(shù)據(jù)。
內(nèi)存映射——可以把一個(gè)文件映射到虛擬內(nèi)存區(qū)域,并把該文件當(dāng)做內(nèi)存來(lái)訪(fǎng)問(wèn)。
對(duì)物理內(nèi)存的公平訪(fǎng)問(wèn)——內(nèi)存管理程序確保所有的進(jìn)程都能公平地訪(fǎng)問(wèn)計(jì)算機(jī)的內(nèi)存資源,這樣可以確保理想的系統(tǒng)性能。
共享內(nèi)存——內(nèi)存管理程序允許進(jìn)程共享它們內(nèi)存的一部分。第二十六頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)27虛擬內(nèi)存的抽象模型:當(dāng)處理器執(zhí)行一個(gè)程序時(shí),它從內(nèi)存中讀取指令并解碼執(zhí)行。當(dāng)執(zhí)行這條指令時(shí),處理器可能會(huì)需要在內(nèi)存的某一個(gè)位置讀取或存儲(chǔ)數(shù)據(jù)。進(jìn)程不管是讀取指令還是存取數(shù)據(jù)都要訪(fǎng)問(wèn)內(nèi)存。在一個(gè)虛擬內(nèi)存系統(tǒng)中,所有程序涉及到的內(nèi)存地址均為虛擬內(nèi)存地址而不是機(jī)器的物理地址。處理器根據(jù)操作系統(tǒng)保存的一些信息將虛擬內(nèi)存地址轉(zhuǎn)換為物理地址。為了讓這種轉(zhuǎn)換更容易地進(jìn)行,虛擬內(nèi)存和物理內(nèi)存都分為大小固定的塊,叫做頁(yè)面(Page)。每一個(gè)頁(yè)面有一個(gè)惟一的頁(yè)面號(hào),叫做PFN(PageFrameNumber)。Linux在AlphaAXP系統(tǒng)上使用8K字節(jié)的頁(yè),而在Intelx86系統(tǒng)上使用4K字節(jié)的頁(yè)。在這種分頁(yè)方式下,一個(gè)虛擬內(nèi)存地址由兩部分組成:一部分是位移地址,另一部分是PFN。每當(dāng)處理器遇到一個(gè)虛擬內(nèi)存地址時(shí),都將會(huì)分離出位移地址和PFN地址。然后再將PFN地址轉(zhuǎn)換成物理地址,讀取其中的位移地址。處理器利用頁(yè)面表(PageTables)來(lái)完成上述的工作。圖2.3所示是進(jìn)程X和進(jìn)程Y的虛擬內(nèi)存示意圖。兩個(gè)進(jìn)程分別有自己的頁(yè)面表。這些頁(yè)面表用來(lái)將進(jìn)程的虛擬內(nèi)存頁(yè)映射到物理內(nèi)存頁(yè)中??梢钥闯?,進(jìn)程X的虛擬內(nèi)存頁(yè)0映射到了物理內(nèi)存頁(yè)1,進(jìn)程Y的虛擬內(nèi)存頁(yè)1映射到了物理內(nèi)存4。頁(yè)面表的每個(gè)入口一般都包括以下的內(nèi)容:有效標(biāo)志——此標(biāo)志用于標(biāo)明頁(yè)面表入口是否可以使用。物理頁(yè)面號(hào)——頁(yè)面表入口描述的物理頁(yè)面號(hào)。存取控制信息——用來(lái)描述頁(yè)面如何使用,例如,是否可寫(xiě),是否包括可執(zhí)行代碼等第二十七頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)28第二十八頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)29處理器讀取頁(yè)面表時(shí),使用虛擬內(nèi)存頁(yè)號(hào)作為頁(yè)面表的位移,例如,虛擬內(nèi)存頁(yè)5是頁(yè)面表的第6個(gè)元素。在將虛擬內(nèi)存地址轉(zhuǎn)換成物理內(nèi)存地址時(shí),處理器首先將虛擬內(nèi)存地址分解為PFN和位移值。例如,在圖2.3中,一個(gè)頁(yè)面的大小是0x2000字節(jié)(十進(jìn)制的8192),那么進(jìn)程Y的一個(gè)虛擬內(nèi)存地址0x2194將被分解成虛擬內(nèi)存頁(yè)號(hào)PFN為1和位移0x194。然后處理器使用PFN作為進(jìn)程頁(yè)面表的位移值來(lái)查找頁(yè)面表的入口。如果該入口是有效入口,處理器則從中取出物理內(nèi)存的頁(yè)面號(hào)。如果入口是無(wú)效入口,處理器則產(chǎn)生一個(gè)頁(yè)面錯(cuò)誤給操作系統(tǒng),并將控制權(quán)交給操作系統(tǒng)。假定此處是一個(gè)有效入口,則處理器取出物理頁(yè)面號(hào),并乘以物理頁(yè)面的大小以便得到此物理頁(yè)面在內(nèi)存中的地址,最后加上位移值。再看上面的例子:進(jìn)程Y的PFN為1,映射到物理內(nèi)存頁(yè)號(hào)為4,則此頁(yè)從0x8000(40x2000)開(kāi)始,再加上位移0x194,得到最終的物理地址為0x8194。第二十九頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)301.按需裝入頁(yè)面(DemandPaging)由于物理內(nèi)存要比虛擬內(nèi)存小很多,所以操作系統(tǒng)一定要十分有效地利用系統(tǒng)的物理內(nèi)存。一種節(jié)約物理內(nèi)存的方法是只將執(zhí)行程序時(shí)正在使用的虛擬內(nèi)存頁(yè)面裝入系統(tǒng)的物理頁(yè)面中。當(dāng)一個(gè)進(jìn)程試圖存取一個(gè)不在物理內(nèi)存中的虛擬內(nèi)存頁(yè)面時(shí),處理器將會(huì)產(chǎn)生一個(gè)頁(yè)面錯(cuò)誤給操作系統(tǒng)。如果發(fā)生頁(yè)面錯(cuò)誤的虛擬內(nèi)存地址為無(wú)效的地址,說(shuō)明處理器正在存取一個(gè)它不應(yīng)該存取的地址。這時(shí),有可能是應(yīng)用程序出現(xiàn)了某一方面的錯(cuò)誤,在這種情況下,操作系統(tǒng)將會(huì)中止進(jìn)程的運(yùn)行,以防止系統(tǒng)中的其他進(jìn)程受到破壞。如果發(fā)生頁(yè)面錯(cuò)誤的虛擬內(nèi)存地址為有效的地址,但此頁(yè)面當(dāng)前并不在物理內(nèi)存中,則操作系統(tǒng)必須從硬盤(pán)中將正確的頁(yè)面讀到系統(tǒng)內(nèi)存中。相對(duì)而言,由于讀取硬盤(pán)要花費(fèi)較長(zhǎng)的時(shí)間,所以處理器必須等待,直到頁(yè)面讀取完畢。如果此時(shí)還有另外的進(jìn)程等待運(yùn)行,則操作系統(tǒng)將選擇一個(gè)進(jìn)程運(yùn)行。從硬盤(pán)中讀取的頁(yè)面將被寫(xiě)入到一個(gè)空的物理內(nèi)存頁(yè)中,然后在進(jìn)程的頁(yè)面表中加入一個(gè)虛擬內(nèi)存頁(yè)面號(hào)入口,此時(shí)進(jìn)程就可以重新運(yùn)行了。Linux系統(tǒng)使用按需裝入技術(shù)(DemandPaging)將可執(zhí)行代碼裝入到進(jìn)程的虛擬內(nèi)存中。每當(dāng)一個(gè)命令執(zhí)行時(shí),包括此命令的文件將被打開(kāi)并映射到進(jìn)程的虛擬內(nèi)存中。此過(guò)程是通過(guò)修改描述進(jìn)程內(nèi)存映射的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,通常被叫做內(nèi)存映射(MemoryMapping)。但此時(shí)只有文件鏡像的第一部分被裝入系統(tǒng)的物理內(nèi)存中,而鏡像的其他部分還保留在硬盤(pán)中。當(dāng)此鏡像執(zhí)行時(shí),處理器將產(chǎn)生頁(yè)面錯(cuò)誤,Linux使用進(jìn)程的內(nèi)存映射表決定應(yīng)該把鏡像的哪一部分裝入內(nèi)存中執(zhí)行。第三十頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)312.交換(Swapping)當(dāng)一個(gè)進(jìn)程需要把一個(gè)虛擬內(nèi)存頁(yè)面裝入物理內(nèi)存而又沒(méi)有空閑時(shí),操作系統(tǒng)必須廢棄物理內(nèi)存中的一個(gè)頁(yè)面,為將要裝入的虛擬內(nèi)存頁(yè)騰出空間。如果將要扔掉的物理內(nèi)存頁(yè)一直沒(méi)有被改寫(xiě)過(guò),則操作系統(tǒng)將不保存此內(nèi)存頁(yè),而只是簡(jiǎn)單地將它扔掉。當(dāng)再次需要此內(nèi)存頁(yè)時(shí),再?gòu)奈募R像中裝入。但是,如果此頁(yè)面已經(jīng)被修改過(guò),操作系統(tǒng)就需要把頁(yè)面的內(nèi)容保存起來(lái)。這些頁(yè)面稱(chēng)為“臟頁(yè)面”(dirtypage)。當(dāng)它們從內(nèi)存中移走時(shí),將會(huì)被保存到一種叫做交換文件的特殊文件中。Linux系統(tǒng)使用一種叫做“最近最少使用”的技術(shù)(LeastRecentlyUsed,LRU)來(lái)決定把哪一個(gè)頁(yè)面從物理內(nèi)存中移出。3.共享虛擬內(nèi)存(SharedVirtualMemory)由于使用了虛擬內(nèi)存,因此使幾個(gè)進(jìn)程之間的內(nèi)存共享變得很容易。每個(gè)內(nèi)存的存取都要通過(guò)頁(yè)面表,而且每個(gè)內(nèi)存都有自己的單獨(dú)的頁(yè)面表。如果希望兩個(gè)進(jìn)程共享一個(gè)物理內(nèi)存頁(yè),只需將它們頁(yè)面表入口中的物理內(nèi)存號(hào)設(shè)置為相同的物理頁(yè)面號(hào)即可,而且共享的物理頁(yè)不必存在共享它的進(jìn)程的虛擬內(nèi)存空間的同一個(gè)地方。4.訪(fǎng)問(wèn)控制(AccessControl)頁(yè)面表中還包括了訪(fǎng)問(wèn)控制信息。當(dāng)處理器使用頁(yè)面表將進(jìn)程的虛擬地址映射到物理地址的時(shí)候,可以方便地使用存取控制信息來(lái)檢查進(jìn)程是否存取了它不該存取的信息。訪(fǎng)問(wèn)控制信息放在PTE(PageTableEntry)中,而且與具體處理器相關(guān)。第三十一頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)325.高速緩存(Caches)為了獲得最大的系統(tǒng)效用,操作系統(tǒng)一般使用高速緩存來(lái)提高系統(tǒng)性能。Linux系統(tǒng)使用了以下幾種涉及高速緩存的內(nèi)存管理方法。
BufferCache:緩沖區(qū)高速緩存,其中包含了由塊設(shè)備使用的數(shù)據(jù)緩沖區(qū)。
PageCache:頁(yè)面高速緩存,用來(lái)加速磁盤(pán)中文件鏡像和數(shù)據(jù)的存取。
SwapCache:交換文件,其中只保存那些被修改過(guò)的頁(yè)面。
HardwareCache:硬件高速緩存,通常是在處理器中,它保存著頁(yè)面表的入口。高速緩存的副作用在于Linux必須花大量時(shí)間和空間來(lái)維護(hù)這些高速緩存區(qū),如果這些高速緩存區(qū)崩潰,系統(tǒng)也會(huì)崩潰。6.頁(yè)的分配和回收(PageAllocationandDeallocation)系統(tǒng)在運(yùn)行時(shí)會(huì)經(jīng)常需要物理內(nèi)存頁(yè)。例如,當(dāng)一個(gè)文件鏡像從磁盤(pán)調(diào)入內(nèi)存時(shí),操作系統(tǒng)需要為它分配物理內(nèi)存頁(yè)。當(dāng)程序執(zhí)行完畢時(shí),操作系統(tǒng)需要釋放內(nèi)存頁(yè)。物理頁(yè)的另一個(gè)用途是存儲(chǔ)內(nèi)核所需要的數(shù)據(jù)結(jié)構(gòu),例如,頁(yè)面表。頁(yè)面的分配和撤銷(xiāo)機(jī)制,以及所涉及的數(shù)據(jù)結(jié)構(gòu)對(duì)內(nèi)存管理來(lái)說(shuō)是至關(guān)重要的。系統(tǒng)中所有的物理內(nèi)存頁(yè)都包括在mem_map數(shù)據(jù)結(jié)構(gòu)中,而mem_map是由mem_map_t結(jié)構(gòu)組成的鏈表。mem_map_t在系統(tǒng)啟動(dòng)時(shí)初始化,每個(gè)mem_map_t結(jié)構(gòu)都描述了系統(tǒng)中的一個(gè)物理頁(yè)。第三十二頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)337.內(nèi)存映射(MemoryMapping)當(dāng)執(zhí)行一個(gè)文件鏡像時(shí),可執(zhí)行鏡像的內(nèi)容必須裝到進(jìn)程的虛擬地址空間??蓤?zhí)行鏡像鏈接的共享庫(kù)也是一樣要裝入虛擬內(nèi)存空間??蓤?zhí)行文件并不是真正地裝入物理內(nèi)存空間,而只是簡(jiǎn)單地鏈接到進(jìn)程的虛擬內(nèi)存。然后,隨著應(yīng)用程序運(yùn)行時(shí)的需要,可執(zhí)行鏡像才逐漸地裝入到物理內(nèi)存中。這種將一個(gè)文件的鏡像和一個(gè)進(jìn)程的虛擬內(nèi)存地址空間連接起來(lái)的方法叫做內(nèi)存映射。數(shù)據(jù)結(jié)構(gòu)mm_struct代表每個(gè)進(jìn)程的虛擬內(nèi)存空間。它包含了正在執(zhí)行的鏡像的信息和一些指向vm_area_struct結(jié)構(gòu)的指針,如圖2.4所示。每個(gè)vm_area_struct結(jié)構(gòu)都描述了進(jìn)程的虛擬內(nèi)存的起始和結(jié)束位置、進(jìn)程的存取權(quán)限,以及與內(nèi)存有關(guān)的一系列的操作。這些操作是Linux系統(tǒng)在處理虛擬內(nèi)存時(shí)將要用到的。當(dāng)一個(gè)可執(zhí)行鏡像映射到一個(gè)進(jìn)程的虛擬內(nèi)存地址時(shí),操作系統(tǒng)將創(chuàng)建一系列的數(shù)據(jù)結(jié)構(gòu)vm_area_struct,每一個(gè)vm_area_struct代表可執(zhí)行鏡像的一部分。Linux系統(tǒng)支持多種標(biāo)準(zhǔn)虛擬內(nèi)存操作,創(chuàng)建vm_area_struct時(shí),相應(yīng)的虛擬內(nèi)存操作就會(huì)與vm_area_struct鏈接起來(lái)。第三十三頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)34第三十四頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)35文件系統(tǒng)管理Linux在設(shè)計(jì)時(shí)就考慮到支持許多不同的物理設(shè)備,甚至就一種特定類(lèi)型的設(shè)備而言,例如,硬盤(pán)驅(qū)動(dòng)器,在不同的硬件廠(chǎng)商之間也會(huì)存在許多接口上的差異。除了Linux所支持的物理設(shè)備以外,Linux還支持大量的邏輯文件系統(tǒng)。正因?yàn)樗苤С衷S多邏輯文件系統(tǒng),所以L(fǎng)inux可以輕松地與其他操作系統(tǒng)進(jìn)行互操作。Linux文件系統(tǒng)支持下列特性:
多個(gè)硬件設(shè)備——提供對(duì)許多不同的硬件設(shè)備的訪(fǎng)問(wèn)。
多個(gè)邏輯文件系統(tǒng)——支持許多不同的邏輯文件系統(tǒng)。
多個(gè)可執(zhí)行格式——支持許多不同的可執(zhí)行文件格式(例如a.out、ELF、java)。
均一性——為所有的邏輯文件系統(tǒng),以及所有的硬件設(shè)備提供一個(gè)通用接口。
性能——提供對(duì)文件的高速訪(fǎng)問(wèn)。
安全——不會(huì)丟失或毀壞數(shù)據(jù)。
保密性——限制用戶(hù)訪(fǎng)問(wèn)文件的許可權(quán)限和分配給用戶(hù)的總的文件大小。目前,Linux系統(tǒng)支持大約15個(gè)文件系統(tǒng):EXT、EXT2、XIA、MINIX、UMSDOS、MSDOS、VFAT、PROC、SMB、NCP、ISO9660、SYSV、HPFS、AFFS和UFS。毫無(wú)疑問(wèn),Linux系統(tǒng)支持的文件系統(tǒng)還會(huì)增加。一個(gè)文件系統(tǒng)中不僅包括含有數(shù)據(jù)的文件,而且還存儲(chǔ)著文件系統(tǒng)的結(jié)構(gòu)。文件系統(tǒng)中的信息必須是安全和保密的。第三十五頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)36Linux系統(tǒng)中的第一個(gè)文件系統(tǒng)是Minux,但它的文件名只能有14個(gè)字符,最大的文件長(zhǎng)度是64MB。也正因此,1992年4月引進(jìn)了第一個(gè)專(zhuān)門(mén)為L(zhǎng)inux設(shè)計(jì)的文件系統(tǒng)——ext(extendedfilesystem),但ext的功能還是有限。最后在1993年又推出了一個(gè)新的文件系統(tǒng)——EXT2。當(dāng)Linux引進(jìn)ext文件系統(tǒng)時(shí)有了一個(gè)重大的改進(jìn):真正的文件系統(tǒng)從操作系統(tǒng)和系統(tǒng)服務(wù)中分離出來(lái),在它們之間使用了一個(gè)接口層——虛擬文件系統(tǒng)VFS(VirtualFilesystem)。VFS允許Linux支持多種不同的文件系統(tǒng),每個(gè)文件系統(tǒng)都要提供給VFS一個(gè)相同的接口。這樣,所有的文件系統(tǒng)對(duì)系統(tǒng)內(nèi)核和系統(tǒng)中的程序來(lái)說(shuō)看起來(lái)都是相同的。Linux系統(tǒng)中的VFS層使得用戶(hù)可以同時(shí)在系統(tǒng)中透明地掛接很多不同的文件系統(tǒng)。在Linux系統(tǒng)中,每一個(gè)單獨(dú)的文件系統(tǒng)都是代表整個(gè)系統(tǒng)的樹(shù)狀結(jié)構(gòu)的一部分。當(dāng)掛接一個(gè)新的文件系統(tǒng)時(shí),Linux把它添加到這個(gè)樹(shù)狀的文件系統(tǒng)中。所有系統(tǒng)中的文件系統(tǒng),不管是什么類(lèi)型,都掛接到一個(gè)目錄下,并隱藏目錄中原有的內(nèi)容。這個(gè)目錄叫做掛接目錄或者掛接點(diǎn)。當(dāng)文件系統(tǒng)卸載時(shí),目錄中的原有內(nèi)容將再一次地顯示出來(lái)。磁盤(pán)在初始化時(shí)被劃分成幾個(gè)邏輯分區(qū),每一個(gè)邏輯分區(qū)可以使用一種文件系統(tǒng),例如,EXT2文件系統(tǒng)。文件系統(tǒng)把存儲(chǔ)在物理驅(qū)動(dòng)器中的文件組織成一個(gè)樹(shù)狀的目錄結(jié)構(gòu),可以存儲(chǔ)文件的設(shè)備稱(chēng)為塊設(shè)備。Linux文件系統(tǒng)把這些塊設(shè)備當(dāng)做簡(jiǎn)單的線(xiàn)形塊的集合,而不管物理磁盤(pán)的結(jié)構(gòu)如何。而將讀寫(xiě)某一個(gè)設(shè)備塊的請(qǐng)求轉(zhuǎn)換成特定的磁道、扇區(qū)和柱面是通過(guò)設(shè)備的驅(qū)動(dòng)程序?qū)崿F(xiàn)的。因此,不同的設(shè)備控制器控制的不同設(shè)備中的不同文件系統(tǒng)在Linux中都可以同樣地使用。文件系統(tǒng)甚至可以不在當(dāng)?shù)氐南到y(tǒng)中,也就是說(shuō),文件系統(tǒng)可以通過(guò)網(wǎng)絡(luò)遠(yuǎn)程連接到本地磁盤(pán)上。第三十六頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)37當(dāng)文件系統(tǒng)被作為子目錄掛裝時(shí),在該設(shè)備上的所有目錄和文件都將被視為掛裝點(diǎn)的子目錄。虛擬文件系統(tǒng)的用戶(hù)不需要考慮哪種邏輯文件系統(tǒng)實(shí)現(xiàn)了目錄樹(shù)的哪個(gè)部分,也無(wú)需考慮哪個(gè)物理設(shè)備包含這些邏輯文件系統(tǒng)。這種抽象性在選擇物理設(shè)備和邏輯文件系統(tǒng)時(shí),提供了很大的方便,而這種方便性是Linux操作系統(tǒng)成功的重要因素之一。VFS能高速度及高效率地存取系統(tǒng)中的文件,與此同時(shí)它還得確保文件和數(shù)據(jù)的正確性。這兩個(gè)目標(biāo)有時(shí)可能相互矛盾。由于VFS在每個(gè)文件系統(tǒng)掛接和使用時(shí),把文件系統(tǒng)的有關(guān)信息暫時(shí)保存在內(nèi)存中,所以當(dāng)內(nèi)存中的信息改變時(shí),例如,創(chuàng)建、寫(xiě)入和刪除目錄和文件時(shí),系統(tǒng)要保證正確地升級(jí)文件系統(tǒng)中相關(guān)的內(nèi)容。如果了解在系統(tǒng)內(nèi)核中運(yùn)行的文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),那么也就能比較容易地理解文件系統(tǒng)讀取的數(shù)據(jù)塊的情況。系統(tǒng)緩存中最重要的就是緩沖區(qū)緩存,它被集成到每個(gè)單獨(dú)的文件系統(tǒng)存取它們的塊設(shè)備所使用的方法中。每當(dāng)系統(tǒng)存取數(shù)據(jù)塊時(shí),數(shù)據(jù)塊被放入到緩沖區(qū)緩存中,并且依照它們的狀態(tài)保存到各種各樣的隊(duì)列中。緩沖區(qū)緩存中不僅保存了數(shù)據(jù)緩沖區(qū),而且還可以幫助管理與塊設(shè)備驅(qū)動(dòng)程序之間的異步接口。為了支持虛擬文件系統(tǒng),Linux使用了索引節(jié)點(diǎn)的概念。Linux使用索引節(jié)點(diǎn)來(lái)表示塊設(shè)備上的文件。索引節(jié)點(diǎn)中包含了一些操作,根據(jù)文件所駐留的邏輯系統(tǒng)和物理系統(tǒng)的不同,這些操作的實(shí)現(xiàn)方法也會(huì)有所變化。從這層意義上講,索引節(jié)點(diǎn)是虛擬的。索引節(jié)點(diǎn)接口使所有的文件在其他Linux子系統(tǒng)看起來(lái)都是一樣的。索引節(jié)點(diǎn)可以用做一個(gè)存儲(chǔ)位置,存儲(chǔ)磁盤(pán)上與某個(gè)打開(kāi)的文件相關(guān)的所有信息。索引節(jié)點(diǎn)存儲(chǔ)相關(guān)緩沖、以塊為單位的文件總長(zhǎng)度,以及文件偏移量和設(shè)備塊之間的映射。第三十七頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)381.EXT2文件系統(tǒng)EXT2文件系統(tǒng)是Linux系統(tǒng)中最為成功的文件系統(tǒng),各種Linux的系統(tǒng)發(fā)布都將EXT2文件系統(tǒng)作為操作系統(tǒng)的基礎(chǔ)。EXT2文件系統(tǒng)中的數(shù)據(jù)是以數(shù)據(jù)塊的方式存儲(chǔ)在文件中的。這些數(shù)據(jù)塊具有同樣的大小,并且其大小可以在EXT2創(chuàng)建時(shí)設(shè)定,每一個(gè)文件的長(zhǎng)度都要補(bǔ)足到塊的整數(shù)倍。EXT2通過(guò)使用索引節(jié)點(diǎn)(inode)數(shù)據(jù)結(jié)構(gòu)來(lái)描述系統(tǒng)中的每一個(gè)文件。索引節(jié)點(diǎn)描述了文件中的數(shù)據(jù)占用了哪一個(gè)數(shù)據(jù)塊,以及文件的存取權(quán)限、文件的修改時(shí)間和文件類(lèi)型等信息。EXT2文件系統(tǒng)中的每一個(gè)文件都只有一個(gè)索引節(jié)點(diǎn),而每一個(gè)索引節(jié)點(diǎn)都有一個(gè)惟一的標(biāo)志符。文件系統(tǒng)中的所有的索引節(jié)點(diǎn)都保存在索引節(jié)點(diǎn)表中。EXT2中的目錄只是一些簡(jiǎn)單的特殊文件(它們也使用索引節(jié)點(diǎn)描述),這些文件中包含指向目錄入口的索引節(jié)點(diǎn)的指針。對(duì)于一個(gè)文件系統(tǒng)來(lái)說(shuō),某一個(gè)塊設(shè)備只是一系列可以讀寫(xiě)的數(shù)據(jù)塊。文件系統(tǒng)無(wú)需關(guān)心數(shù)據(jù)塊在設(shè)備中的具體位置,因?yàn)檫@是設(shè)備驅(qū)動(dòng)程序的工作。每當(dāng)文件系統(tǒng)需要從塊設(shè)備中讀取數(shù)據(jù)時(shí),它就要求設(shè)備驅(qū)動(dòng)程序讀取整數(shù)數(shù)目的數(shù)據(jù)塊。EXT2文件系統(tǒng)將它所占用的設(shè)備的邏輯分區(qū)分成了數(shù)據(jù)塊組。每一個(gè)數(shù)據(jù)塊組都包含一些有關(guān)整個(gè)文件系統(tǒng)的信息,以及真正的文件和目錄的數(shù)據(jù)塊。在EXT2文件系統(tǒng)中索引節(jié)點(diǎn)是一切的基礎(chǔ),文件系統(tǒng)中的每一個(gè)文件和目錄都使用一個(gè)惟一的索引節(jié)點(diǎn)。每一個(gè)數(shù)據(jù)塊組中的索引節(jié)點(diǎn)都保存在索引節(jié)點(diǎn)表中。數(shù)據(jù)塊組中還有一個(gè)索引節(jié)點(diǎn)位圖,它用來(lái)記錄系統(tǒng)中已分配和未分配的索引節(jié)點(diǎn)。第三十八頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)39下面是EXT2的索引節(jié)點(diǎn)的一些主要的字段。
mode這里保存兩個(gè)信息:一個(gè)是此索引節(jié)點(diǎn)描述的是什么,另一個(gè)是用戶(hù)擁有的權(quán)限。例如,對(duì)于EXT2,一個(gè)索引節(jié)點(diǎn)可以描述文件、目錄、符號(hào)連接、塊設(shè)備、字符設(shè)備,以及FIFO結(jié)構(gòu)。
OwnerInformation這是文件或目錄所有者的用戶(hù)和組標(biāo)志符。這使得文件系統(tǒng)可以正確地授權(quán)某種存取操作。
Size文件的字節(jié)大小。
Timestamps索引節(jié)點(diǎn)建立的時(shí)間和索引節(jié)點(diǎn)最后修改的時(shí)間。
Datablocks指向存儲(chǔ)此索引節(jié)點(diǎn)描述文件的數(shù)據(jù)塊的指針。前12個(gè)指針是指向存儲(chǔ)數(shù)據(jù)的物理數(shù)據(jù)塊的指針,而后3個(gè)指針則包括不同級(jí)別的間接指針。例如,兩級(jí)指針指向一個(gè)指向其他指針塊的指針塊,這意味著小于或者等于12個(gè)數(shù)據(jù)塊的文件的存取速度要高于多于12個(gè)數(shù)據(jù)塊的文件。超級(jí)塊(Superblock)存儲(chǔ)著描述文件系統(tǒng)的大小和形狀的基本信息。文件系統(tǒng)的管理員可以使用其中的信息來(lái)使用和維護(hù)文件系統(tǒng)。一般情況下,當(dāng)文件系統(tǒng)掛接時(shí),系統(tǒng)只讀取數(shù)據(jù)塊組0中的超級(jí)塊,但每一個(gè)數(shù)據(jù)塊組中都包含一個(gè)超級(jí)塊的副本,以防系統(tǒng)崩潰時(shí)使用。第三十九頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)402.虛擬文件系統(tǒng)(VFS)如圖2.5所示為L(zhǎng)inux系統(tǒng)內(nèi)核中的VFS和實(shí)際文件系統(tǒng)之間的關(guān)系。VFS必須管理同時(shí)掛接在系統(tǒng)上的不同的文件系統(tǒng)。VFS通過(guò)使用描述整個(gè)VFS的數(shù)據(jù)結(jié)構(gòu)和描述實(shí)際掛接的文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)來(lái)管理這些不同的文件系統(tǒng)。這里易于混淆的是,VFS和EXT2文件系統(tǒng)一樣使用超級(jí)塊和索引節(jié)點(diǎn)來(lái)描述系統(tǒng)中的文件。與EXT2中的索引節(jié)點(diǎn)一樣,VFS的索引節(jié)點(diǎn)用來(lái)描述系統(tǒng)中的文件和目錄。當(dāng)一個(gè)文件系統(tǒng)初始化時(shí),它將在VFS中登記。這些過(guò)程在操作系統(tǒng)初始化時(shí)完成。實(shí)際的文件系統(tǒng)或者內(nèi)建到操作系統(tǒng)內(nèi)核中,或者作為可裝入模塊在需要時(shí)裝入。當(dāng)一個(gè)基于塊設(shè)備的文件系統(tǒng)掛接時(shí),當(dāng)然也包括根文件系統(tǒng),VFS首先要讀取它的超級(jí)塊。每一個(gè)文件系統(tǒng)的超級(jí)塊讀取程序都必須先清楚文件系統(tǒng)的結(jié)構(gòu),然后把有關(guān)的信息添加到VFS的超級(jí)塊數(shù)據(jù)結(jié)構(gòu)中。VFS中保存了系統(tǒng)中掛接的文件系統(tǒng)的鏈表,以及這些文件系統(tǒng)對(duì)應(yīng)的VFS超級(jí)塊。每一個(gè)VFS超級(jí)塊都包含一些信息和指向一些執(zhí)行特別功能的子程序的指針。例如,代表掛接的EXT2文件系統(tǒng)的VFS超級(jí)塊包含了一個(gè)指向EXT2索引節(jié)點(diǎn)讀取程序的指針。這個(gè)EXT2索引節(jié)點(diǎn)讀取程序,與其他文件系統(tǒng)索引節(jié)點(diǎn)的讀取程序一樣,把信息添加到VFS索引節(jié)點(diǎn)中的字段中。每一個(gè)VFS超級(jí)塊都包含一個(gè)指向文件系統(tǒng)中第一個(gè)VFS索引節(jié)點(diǎn)的指針。對(duì)于根文件系統(tǒng)來(lái)說(shuō),第一個(gè)VFS索引節(jié)點(diǎn)是代表根目錄(/)的索引節(jié)點(diǎn)。這種對(duì)應(yīng)關(guān)系對(duì)于EXT2文件系統(tǒng)來(lái)說(shuō)十分有效,但對(duì)于其他的文件系統(tǒng)則效果一般。第四十頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)41當(dāng)系統(tǒng)中的進(jìn)程存取目錄和文件時(shí),需要調(diào)用系統(tǒng)中的子程序來(lái)遍歷搜索系統(tǒng)中的VFS索引節(jié)點(diǎn)。例如,鍵入ls或者cat命令將導(dǎo)致VFS搜索整個(gè)文件系統(tǒng)中的VFS索引節(jié)點(diǎn)。因?yàn)橄到y(tǒng)中的每一個(gè)文件和目錄都由一個(gè)索引節(jié)點(diǎn)來(lái)表示,那么有些索引節(jié)點(diǎn)將經(jīng)常會(huì)被重復(fù)地搜索。這些索引節(jié)點(diǎn)將保存在索引節(jié)點(diǎn)緩存中,這樣將加快以后的存取速度。如果要找的索引節(jié)點(diǎn)不在索引節(jié)點(diǎn)緩存中,那么進(jìn)程將調(diào)用一個(gè)特殊的系統(tǒng)程序來(lái)讀取相應(yīng)的索引節(jié)點(diǎn)。讀取索引節(jié)點(diǎn)后,此索引節(jié)點(diǎn)將放在索引節(jié)點(diǎn)緩存中。最少用到的索引節(jié)點(diǎn)將被交換出索引節(jié)點(diǎn)緩存。第四十一頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)42設(shè)備管理操作系統(tǒng)的一個(gè)功能就是將用戶(hù)和系統(tǒng)的硬件特性隔離。例如,虛擬文件系統(tǒng)(VFS)使得系統(tǒng)上掛接的文件系統(tǒng)具有相同的接口,使用戶(hù)不必關(guān)心底層的硬件設(shè)備。計(jì)算機(jī)系統(tǒng)中的物理設(shè)備都有自己的硬件控制器。例如,鍵盤(pán)、鼠標(biāo)和串行口是由SuperIO芯片控制的;IDE硬盤(pán)是由IDE控制器控制的,等等。每一個(gè)硬件控制器都有自己的控制及狀態(tài)寄存器(CSR),而且隨設(shè)備的不同而不同。CSR用來(lái)啟動(dòng)和停止設(shè)備、初始化設(shè)備和診斷設(shè)備錯(cuò)誤。設(shè)備驅(qū)動(dòng)程序一般集成在操作系統(tǒng)內(nèi)核,這樣,不同的應(yīng)用程序就可以共享這些代碼。設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理或操作硬件控制器的軟件,從本質(zhì)上講,它們是內(nèi)核中具有高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層硬件處理例程。設(shè)備驅(qū)動(dòng)程序的一個(gè)基本特點(diǎn)就是對(duì)設(shè)備的抽象處理。系統(tǒng)中的所有硬件設(shè)備看起來(lái)都與一般的文件一樣,它們可以使用處理文件的標(biāo)準(zhǔn)系統(tǒng)調(diào)用來(lái)打開(kāi)、關(guān)閉和讀寫(xiě)。系統(tǒng)中的每一個(gè)設(shè)備都由一個(gè)設(shè)備文件來(lái)代表,例如,主IDE硬盤(pán)的設(shè)備文件是/dev/hda。對(duì)于塊設(shè)備和字符設(shè)備來(lái)說(shuō),這些設(shè)備文件可以使用mknod命令創(chuàng)建。新建的設(shè)備文件使用主設(shè)備號(hào)和從設(shè)備號(hào)來(lái)描述此設(shè)備。網(wǎng)絡(luò)設(shè)備的設(shè)備文件是當(dāng)系統(tǒng)查找到網(wǎng)絡(luò)設(shè)備并初始化網(wǎng)絡(luò)控制器之后才建立的。一個(gè)設(shè)備驅(qū)動(dòng)程序控制的所有設(shè)備有一個(gè)相同的主設(shè)備號(hào),通過(guò)不同的從設(shè)備號(hào)來(lái)區(qū)分設(shè)備和它們的控制器。例如,主IDE硬盤(pán)的每一個(gè)分區(qū)都有一個(gè)不同的從設(shè)備號(hào),這樣,主IDE硬盤(pán)的第二個(gè)分區(qū)的設(shè)備文件是/dev/hda2。Linux系統(tǒng)使用主設(shè)備號(hào)和系統(tǒng)中的一些表來(lái)將系統(tǒng)調(diào)用中使用的設(shè)備文件映射到設(shè)備驅(qū)動(dòng)程序中。第四十二頁(yè),共六十一頁(yè),編輯于2023年,星期日第2章嵌入式LINUX操作系統(tǒng)43Linux系統(tǒng)支持三種類(lèi)型的硬件設(shè)備:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。其中與文件子系統(tǒng)相關(guān)的兩種類(lèi)型是字符設(shè)備和塊設(shè)備。字符設(shè)備是直接讀取的,不必使用緩沖區(qū),但是必須以串行的順序依次訪(fǎng)問(wèn)。例如,系統(tǒng)的串行口/dev/cua0和/dev/cua1。塊設(shè)備每次只能讀取一定大小的塊的倍數(shù),通常一塊是512字節(jié)或者1024字節(jié)。塊設(shè)備通過(guò)緩沖區(qū)讀寫(xiě),并且可以隨機(jī)地讀寫(xiě)。塊設(shè)備可以通過(guò)它們的設(shè)備文件存取,但通常是通過(guò)文件系統(tǒng)存取。只有塊設(shè)備支持掛接的文件系統(tǒng)。網(wǎng)絡(luò)設(shè)備是通過(guò)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育球員合同范例
- 《電商平臺(tái)商業(yè)模式》課件
- 商鋪水電安裝合同范本
- 高級(jí)評(píng)茶員練習(xí)復(fù)習(xí)試題
- 入學(xué)申請(qǐng)書(shū)模板范文格式
- 干部教師信息素養(yǎng)提升測(cè)試客觀題復(fù)習(xí)測(cè)試有答案
- 吊車(chē)指揮人員理論測(cè)試復(fù)習(xí)測(cè)試附答案
- 農(nóng)村建筑工程承包合同書(shū)
- 團(tuán)體演出合同范本
- 員工轉(zhuǎn)合伙合同范本
- 教科版科學(xué)四年級(jí)下冊(cè)教師用書(shū)
- 娛樂(lè)主播如何轉(zhuǎn)型做帶貨主播
- 四川省德陽(yáng)市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)及行政區(qū)劃代碼
- 青島版三年級(jí)數(shù)學(xué)下冊(cè)全套單元測(cè)試卷
- (參考)食品加工操作流程圖
- 2023高中物理步步高大一輪 第十章 第1講 磁場(chǎng)及其對(duì)電流的作用
- 空分設(shè)備安全培訓(xùn)課件
- Adobe-Illustrator-(Ai)基礎(chǔ)教程
- 沒(méi)頭腦和不高興-竇桂梅.精選優(yōu)秀PPT課件
- 鋼棧橋計(jì)算書(shū)(excel版)
- 租賃合同審批表
評(píng)論
0/150
提交評(píng)論