嵌入式系統(tǒng)第六章嵌入式Linux操作系統(tǒng)課件_第1頁
嵌入式系統(tǒng)第六章嵌入式Linux操作系統(tǒng)課件_第2頁
嵌入式系統(tǒng)第六章嵌入式Linux操作系統(tǒng)課件_第3頁
嵌入式系統(tǒng)第六章嵌入式Linux操作系統(tǒng)課件_第4頁
嵌入式系統(tǒng)第六章嵌入式Linux操作系統(tǒng)課件_第5頁
已閱讀5頁,還剩82頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 嵌入式Linux操作系統(tǒng)5.1 與Linux相關(guān)術(shù)語GNUGUN項目(GNU Project)開始于1984年,主要由自由軟件基金(Free Software FoundationFSF)資助的一個項目,目標是開發(fā)一個自由的、UNIX類型的操作系統(tǒng),稱為GNU系統(tǒng)。GNU是“GNUs Not UNIX”的首字母的遞歸縮寫。GPL所有的GNU軟件和派生工作均遵循GNU通用公共許可證,即GPL。5.1 與Linux相關(guān)術(shù)語GNU LGPL(Library General Public License程序庫公共許可證)允許用戶在自己的應(yīng)用程序中使用程序庫,即使不公開自己的源代碼。用戶必須能夠

2、獲得在應(yīng)用程序中使用的程序庫的源代碼,并且允許用戶對這些程序庫進行修改。遵循LGPL的一種方法是,隨應(yīng)用程序一起發(fā)布目標代碼以及可以將這些目標程序和受LGPL保護的程序庫鏈接起來的makefile文件。遵循LGPL的另一種比較好的方法是使用動態(tài)鏈接。FSF :Free Software Foundation 自由軟件基金會5.2 嵌入式Linux操作系統(tǒng)5.2.1 Linux介紹 技術(shù)上說Linux是一個內(nèi)核?!皟?nèi)核”指的是一個提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。一個內(nèi)核不是一套完成的操作系統(tǒng),還需要加載庫文件、應(yīng)用程序等,才可以形成完整的操作系統(tǒng)。一套基于Linux內(nèi)

3、核的完整操作系統(tǒng)叫做Linux操作系統(tǒng)。 Linux操作系統(tǒng)具備結(jié)構(gòu)清晰、功能簡介等特征,逐漸成為一個穩(wěn)定可靠、功能完善的操作系統(tǒng)。作為一個操作系統(tǒng),Linux幾乎滿足當今Unix操作系統(tǒng)的所有要求。 Linux具有的特點 1、完全免費2、開放型3、支持多用戶訪問和多任務(wù)編程 4、良好的用戶界面5、支持多種文件系統(tǒng) 6、采用虛擬內(nèi)存管理技術(shù)7、設(shè)備獨立性8、豐富的網(wǎng)絡(luò)功能9、可靠的系統(tǒng)安全10、良好的可移植性完整的Linux架構(gòu)圖 作為一個完成的操作系統(tǒng),Linux具有穩(wěn)定而強大的功能,想要訪問任何非自己的存儲器空間的進程只能通過系統(tǒng)調(diào)用來達成。一般進程是處于用戶模式底下,而運行系統(tǒng)調(diào)用時會被

4、切換成內(nèi)核模式,所有的特殊指令只能在內(nèi)核模式運行,此措施讓內(nèi)核可以完美管理系統(tǒng)內(nèi)部與外部設(shè)備,并且拒絕無權(quán)限的進程提出的請求。因此理論上任何應(yīng)用程序運行時的錯誤,都不可能讓系統(tǒng)崩潰。 5.2.2 Linux作為嵌入式操作系統(tǒng)的優(yōu)勢1、支持多種硬件平臺 2、占有較少的硬件資源3、高可定制性 4、具有實時處理能力 5、具備強大的網(wǎng)絡(luò)功能 Linux作為嵌入式操作系統(tǒng)也存在著不足,主要表現(xiàn)在集成開發(fā)環(huán)境有待改善。 5.2.3 進程管理進程的基本概念 進程就是運行中的程序。一個運行著的程序,可能有多個進程。 對于進程來說,可以看成是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次可以并發(fā)執(zhí)行的運行活動,是

5、處于活動狀態(tài)的計算機程序。 進程的屬性 進程的定義:一個進程是一個程序的一次執(zhí)行的過程;程序是靜態(tài)的,它是一些保存在磁盤上的可執(zhí)行的代碼和數(shù)據(jù)集合;進程是一個動態(tài)的概念,它是Linux系統(tǒng)的基本的調(diào)度單位。一個進程由如下元素組成: 程序讀取的上下文,它表示程序讀取執(zhí)行的狀態(tài)。 程序當前執(zhí)行的目錄。 程序服務(wù)的文件和目錄。 程序訪問的權(quán)限。 內(nèi)存和其他分配給進程的系統(tǒng)資源。Linux進程中最知名的屬性就是它的進程號(Process Idenity Number,PID)和它的父進程號(Parent Process ID,PPID)。PID、PPID都是非零正整數(shù)。一個PID唯一地標識一個進程。一

6、個進程創(chuàng)建新進程稱為創(chuàng)建了子進程(Child Process)。相反地,創(chuàng)建子進程的進程稱為父進程。所有進程追溯其祖先最終都會落到進程號為1的進程身上,這個進程叫做init進程,是內(nèi)核自舉后第一個啟動的進程。init進程扮演終結(jié)父進程的角色。因為init進程永遠不會被終止,所以系統(tǒng)總是可以確信它的存在,并在必要的時候以它為參照。 Linux下進程的結(jié)構(gòu) 代碼段是存放了程序代碼的數(shù)據(jù),假如機器中有數(shù)個進程運行相同的一個程序,那么它們就可以使用同一個代碼段。而數(shù)據(jù)段則存放程序的全局變量、常數(shù)及動態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間。堆棧段存放的就是子程序的返回地址、子程序的參數(shù)及程序的局部變量。堆棧段包含在進程控

7、制塊PCB(Process Control Block)中。PCB處于進程核心堆棧的底部,不需要額外分配空間。 進程狀態(tài)進程在生存周期中的各種狀態(tài)及狀態(tài)的轉(zhuǎn)換 。Linux系統(tǒng)的進程狀態(tài)模型的各種狀態(tài):用戶狀態(tài):進程在用戶狀態(tài)下運行的狀態(tài)。內(nèi)核狀態(tài):進程在內(nèi)核狀態(tài)下運行的狀態(tài)。內(nèi)存中就緒:進程沒有執(zhí)行,但處于就緒狀態(tài),只要內(nèi)核調(diào)度它,就可以執(zhí)行。內(nèi)存中睡眠:進程正在睡眠并且進程存儲在內(nèi)存中,沒有被交換到SWAP設(shè)備。就緒且換出:進程處于就緒狀態(tài),但是必須把它換入內(nèi)存,內(nèi)核才能再次調(diào)度它運行。睡眠且換出:進程正在睡眠,且被換出內(nèi)存。被搶先:進程從內(nèi)核狀態(tài)返回用戶狀態(tài)時,內(nèi)核搶先于它做了上下文切換

8、,調(diào)度了另一個進程。原先這個進程就處于被搶先狀態(tài)。創(chuàng)建狀態(tài):進程剛被創(chuàng)建。該進程存在,但既不是就緒狀態(tài),也不是睡眠狀態(tài)。這個狀態(tài)是除了進程0以外的所有進程的最初狀態(tài)。僵死狀態(tài)(zombie):進程調(diào)用exit結(jié)束,進程不再存在,但在進程表項中仍有記錄,該記錄可由父進程收集。進程的創(chuàng)建與結(jié)束 在Linux系統(tǒng)中,通常使用fork( )系統(tǒng)調(diào)用用來復制一個現(xiàn)有進程,從而創(chuàng)建一個全新的進程。被復制的進程被稱為父進程,新產(chǎn)生的進程被稱為子進程。 為了方便用戶處理父進程與子進程之間的一些事物,Linux允許父進程在創(chuàng)建了進程之后,通過調(diào)用wait( )先進入等待狀態(tài),以使子進程先運行,然后再決定自己的進

9、一步行為,這成為父進程的阻塞方式。 進程的結(jié)束可以使用exit( )系統(tǒng)調(diào)用,無論在執(zhí)行到什么位置,只要執(zhí)行到exit系統(tǒng)調(diào)用,進程會停止所有操作并將其占用的資源釋放掉。 進程的創(chuàng)建與結(jié)束有一個更簡單的執(zhí)行其他程序的函數(shù)system,參數(shù)string傳遞給一個命令解釋器(一般為sh)執(zhí)行,即string被解釋為一條命令,由sh執(zhí)行該命令。除了system之外,系統(tǒng)調(diào)用exec來執(zhí)行一個可執(zhí)行文件,來代替當前進程的執(zhí)行映像。系統(tǒng)調(diào)用exit的功能是終止發(fā)出調(diào)用的進程。 父進程和子進程的關(guān)系是管理和被管理的關(guān)系,當父進程終止時,子進程也隨之而終止。但子進程終止時,父進程并不一定終止。進程的組成 在

10、Linux中,進程是以進程號PID(Process ID)作為標示。任何對進程進行的操作都要給與其相應(yīng)的PID號。每個進程都屬于一個用戶,進程要配備其所屬的用戶編號UID。此外,每個進程都屬于多個用戶組,所以進程還要配備其歸屬的用戶組編號GID的數(shù)組。 進程運行的環(huán)境成為進程上下文。Linux中進程的上下文由進程控制塊PCB(Process Control Block)、正文段、數(shù)據(jù)段以及用戶堆棧組成。其中,正文段存放該進程的可執(zhí)行代碼,數(shù)據(jù)段存放進程中靜態(tài)產(chǎn)生的數(shù)據(jù)結(jié)構(gòu),而PCB包括進程的編號、狀態(tài)、優(yōu)先級以及正文段和數(shù)據(jù)段中數(shù)據(jù)分布的大概情況。一個稱作進程表(Process Table)的

11、鏈表結(jié)構(gòu)將系統(tǒng)中所有的PCB塊聯(lián)系起來 。啟動一個進程有兩個主要途徑:手工啟動和調(diào)度啟動,后者是事先進行設(shè)置,根據(jù)用戶要求自行啟動。由用戶輸入命令,直接啟動一個進程便是手工啟動進程。但手工啟動進程又可以分為很多種,根據(jù)啟動的進程類型不同、性質(zhì)不同,實際結(jié)果也不一樣。(1)前臺啟動前臺啟動是手工啟動一個進程的最常用的方式。用戶鍵入一個命令“df”,就已經(jīng)啟動了一個進程,而且是一個前臺的進程。 (2)后臺啟動直接從后臺手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且用戶也不急著需要結(jié)果。 進程的狀態(tài)和調(diào)度 一般來說,所有進程都要經(jīng)歷三種狀態(tài),即運行態(tài)、就緒態(tài)和阻塞態(tài) 在Linux系統(tǒng)中將上

12、述三種狀態(tài)進行重新組織,得到了Linux進程的幾個狀態(tài): 進程的調(diào)度為了讓Linux來管理系統(tǒng)中的進程,每個進程用一個task_struct數(shù)據(jù)結(jié)構(gòu)來表示(任務(wù)與進程在Linux中可以混用)。數(shù)組task包含指向系統(tǒng)中所有task_struct結(jié)構(gòu)的指針。這意味著系統(tǒng)中的最大進程數(shù)目受task數(shù)組大小的限制,缺省值一般為512。創(chuàng)建新進程時,Linux將從系統(tǒng)內(nèi)存中分配一個task_struct結(jié)構(gòu)并將其加入task數(shù)組。當前運行進程的結(jié)構(gòu)用current指針來指示。 Linux還支持實時進程。這些進程必須對外部時間作出快速反應(yīng)(這就是“實時”的意思),系統(tǒng)將區(qū)分對待這些進程和其他進程。雖然t

13、ask_struct數(shù)據(jù)結(jié)構(gòu)龐大而復雜,但它可以分成一些功能組成部分:State 進程在執(zhí)行過程中會根據(jù)環(huán)境來改變state。SchedulingInformation 調(diào)度器需要這些信息以便判定系統(tǒng)中哪個進程最迫切需要運行。 Identifiers 系統(tǒng)中每個進程都有進程標志。進程標志并不是task數(shù)組的索引,它僅僅是個數(shù)字。Inter-ProcessCommunication Linux支持經(jīng)典的Unix IPC機制。Links Linux系統(tǒng)中所有進程都是相互聯(lián)系的。TimesandTimers 核心需要記錄進程的創(chuàng)建時間以及在其生命期中消耗的CPU時間。Filesystem 進程可以自

14、由地打開或關(guān)閉文件,進程的task_struct結(jié)構(gòu)中包含一個指向每個打開文件描敘符的指針以及指向兩個VFSinode的指針。Virtualmemory 多數(shù)進程都有一些虛擬內(nèi)存(核心線程和后臺進程沒有),Linux核心必須跟蹤虛擬內(nèi)存與系統(tǒng)物理內(nèi)存的映射關(guān)系。 ProcessorSpecificContext 進程可以認為是系統(tǒng)當前狀態(tài)的總和。Linux使用用戶和組標志符來檢查對系統(tǒng)中文件和可執(zhí)行映象的訪問權(quán)限。Linux系統(tǒng)中所有的文件都有所有者和允許的權(quán)限,這些權(quán)限描敘了系統(tǒng)使用者對文件或者目錄的使用權(quán)?;镜臋?quán)限是讀、寫和可執(zhí)行,這些權(quán)限被分配給三類用戶:文件的所有者,屬于相同組的進程

15、以及系統(tǒng)中所有進程。每類用戶具有不同的權(quán)限,例如一個文件允許其擁有者讀寫,但是同組的只能讀而其他進程不允許訪問。 task_struct結(jié)構(gòu)中有四對進程和組標志符: uid,gid 表示運行進程的用戶標志符和組標志符。 effectiveuidandgid 有些程序可以在執(zhí)行過程中將執(zhí)行進程的uid和gid改成其程序自身的uid和gid(保存在描敘可執(zhí)行映象的VFSinode屬性中)。這些程序被稱為setuid程序,常在嚴格控制對某些服務(wù)的訪問時使用,特別是那些為別的進程而運行的進程,例如網(wǎng)絡(luò)后臺進程。有效uid和gid是那些setuid執(zhí)行過程在執(zhí)行時變化出的uid和gid。當進程試圖訪問特

16、權(quán)數(shù)據(jù)或代碼時,核心將檢查進程的有效gid和uid。 filesystemuidandgid 它們和有效uid和gid相似但用來檢驗進程的文件系統(tǒng)訪問權(quán)限。如運行在用戶模式下的NFS服務(wù)器存取文件時,NFS文件系統(tǒng)將使用這些標志符。此例中只有文件系統(tǒng)uid和gid發(fā)生了改變(而非有效uid和gid)。這樣可以避免惡意用戶向NFS服務(wù)器發(fā)送KILL信號。 saveduidandgid POSIX標準中要求實現(xiàn)這兩個標志符,它們被那些通過系統(tǒng)調(diào)用改變進程uid和gid的程序使用。當進程的原始uid和gid變化時,它們被用來保存真正的uid和gid。進程調(diào)度機制的設(shè)計,還對系統(tǒng)復雜性有著極大的影響,

17、常常會由于實現(xiàn)的復雜程度而在功能和性能方面做出必要的權(quán)衡和讓步。另外,進度調(diào)度的機制還要考慮到“公正性”,讓系統(tǒng)所有進程都有機會向前推進,盡管其進度各有不同,并最終受到CPU速度和負載的影響。更重要的是,還要防止死鎖的發(fā)生,以及防止對CPU能力的不合理使用,也就是說要防止CPU尚有能力且有進程等執(zhí)行,卻由于某種原因而長時間得不到執(zhí)行的情況。一旦這些情況發(fā)生,調(diào)度機制還能識別與化解。調(diào)度器必須選擇最迫切需要運行而且可以執(zhí)行的進程來執(zhí)行??蛇\行進程是一個只等待CPU資源的進程。Linux使用基于優(yōu)先級的簡單調(diào)度算法來選擇下一個運行進程。當選定新進程后,系統(tǒng)必須將當前進程的狀態(tài),處理器中的寄存器以及

18、上下文狀態(tài)保存到task_struct結(jié)構(gòu)中。同時它將重新設(shè)置新進程的狀態(tài)并將系統(tǒng)控制權(quán)交給此進程。為了將CPU時間合理的分配給系統(tǒng)中每個可執(zhí)行進程,調(diào)度管理器必須將這些時間信息也保存在task_struct中。 在每個進程的task_struct結(jié)構(gòu)中有以下四項:policy、priority、counter、rt_priority。這四項是選擇進程的依據(jù)。其中,policy是進程的調(diào)度策略,用來區(qū)分實時進程和普通進程,實時進程優(yōu)先于普通進程運行;priority是進程(包括實時和普通)的靜態(tài)優(yōu)先級;counter是進程剩余的時間片,它的起始值就是priority的值;由于counter在后

19、面計算一個處于可運行狀態(tài)的進程值得運行的程度goodness時起重要作用,因此,counter也可以看作是進程的動態(tài)優(yōu)先級。rt_priority是實時進程特有的,用于實時進程間的選擇。 進程調(diào)度的核心在幾個位置調(diào)用調(diào)度管理器。如當前進程被放入等待隊列后運行或者系統(tǒng)調(diào)用結(jié)束時,以及從系統(tǒng)模式返回用戶模式時。此時系統(tǒng)時鐘將當前進程的counter值設(shè)為0以驅(qū)動調(diào)度管理器。每次調(diào)度管理器運行時將進行下列操作: kernelwork 調(diào)度管理器運行底層處理程序并處理調(diào)度任務(wù)隊列。 Currentprocess 當選定其他進程運行之前必須對當前進程進行一些處理。 如果當前進程的調(diào)度策略是時間片輪轉(zhuǎn),則

20、它被放回到運行隊列。如果任務(wù)可中斷且從上次被調(diào)度后接收到了一個信號,則它的狀態(tài)變?yōu)檫\行態(tài)。如果當前進程的狀態(tài)是Running,則狀態(tài)保持不變。那些既不處于Running狀態(tài)又不是可中斷的進程將會從運行隊列中刪除。這意味著調(diào)度管理器選擇運行進程時不會將這些進程考慮在內(nèi)。 調(diào)度器在運行隊列中選擇一個最迫切需要運行的進程。如果運行隊列中存在實時進程(那些具有實時調(diào)度策略的進程),則它們比普通進程更多的優(yōu)先級權(quán)值。 在存在多個相同優(yōu)先級進程的平衡系統(tǒng)中,每個進程被依次執(zhí)行,這就是RoundRobin策略。然而由于進程經(jīng)常需要等待某些資源,所以它們的運行順序也常發(fā)變化。如果系統(tǒng)選擇其他進程運行,則必須被

21、掛起當前進程且開始執(zhí)行新進程。進程執(zhí)行時將使用寄存器、物理內(nèi)存以及CPU。每次調(diào)用子程序時,它將參數(shù)放在寄存器中并把返回地址放置在堆棧中,所以調(diào)度管理器總是運行在當前進程的上下文。 進程的切換發(fā)生在調(diào)度管理器運行之后。以前進程保存的上下文與當前進程加載時的上下文相同,包括進程程序計數(shù)器和寄存器內(nèi)容。如果以前或者當前進程使用了虛擬內(nèi)存,則系統(tǒng)必須更新其頁表入口,這與具體體系結(jié)構(gòu)有關(guān)。如果處理器使用了轉(zhuǎn)換旁視緩沖或者緩沖了頁表入口(如AlphaAXP),那么必須沖刷以前運行進程的頁表入口。5.2.4 存儲管理在這里所說的存儲管理一般指的是內(nèi)存管理,在計算機業(yè)界,內(nèi)存這個名詞被廣泛用來稱呼 RAM(

22、隨機存取內(nèi)存),計算機使用隨機存取內(nèi)存來儲存執(zhí)行作業(yè)所須的暫時指令以及數(shù)據(jù),以使計算機的 CPU能夠更快速讀取儲存在內(nèi)存的指令及數(shù)據(jù)。 下面介紹Linux存儲器管理幾個基本概念 :存儲管理的任務(wù) 存儲管理是Linux中負責管理內(nèi)存的模塊。存儲管理的任務(wù)有以下幾點:屏蔽各種硬件的內(nèi)存結(jié)構(gòu),并向上層返回同意的訪問界面。Linux支持各種各樣的硬件體系結(jié)構(gòu)。對每種硬件結(jié)構(gòu),其內(nèi)存的組織形式各不相同。然而,對于用戶的應(yīng)用程序來說,總是希望提供一個同意的界面以供調(diào)用。這樣,存儲模塊就自然要擔負這個屏蔽和轉(zhuǎn)化的任務(wù)。解決進程狀態(tài)下內(nèi)存不足的問題,按需調(diào)頁。隨著硬件的發(fā)展,內(nèi)存的增大,軟件業(yè)相應(yīng)地向著大規(guī)模

23、方向發(fā)展。在一個多進程系統(tǒng)中,所有進程所占用的內(nèi)存總和往往會超過物理內(nèi)存容量。這樣就需要存儲管理實現(xiàn)能夠利用副存儲器(比如硬盤)進行輔助存儲的功能。存儲管理機制甚至還能夠處理單個進程所占用內(nèi)存超過主存大小的情況。阻止進程肆意訪問其他進程的地址空間和內(nèi)核地址空間。由于并發(fā)執(zhí)行的進程所在的地址空間都不能沖突,而進程太多,物理內(nèi)存空間根本不夠,故需要模擬出一個更大的虛擬邏輯空間提供給上層應(yīng)用程序,并通過一個可靠的機制建立起邏輯空間到物理空間的映射關(guān)系。為進程中通信所需要的共享內(nèi)存提供必要的基礎(chǔ)。對于上層用戶來講,共享內(nèi)存和普通內(nèi)存是兩種概念;然而對于存儲管理系統(tǒng)來講,這兩者卻都是內(nèi)存中的一部分,所有

24、內(nèi)存空間的任一部分都可被劃為共享內(nèi)存使用。因此,實現(xiàn)共享內(nèi)存的任務(wù)就需要由存儲管理模塊來實現(xiàn) 虛擬內(nèi)存 虛擬內(nèi)存是現(xiàn)代操作系統(tǒng)的重要特征。對于一個多進程的操作系統(tǒng)來說,每個進程都要占據(jù)自己唯一的內(nèi)存地址空間。虛擬內(nèi)存的基本原理是將內(nèi)存中一部分近期不需要的內(nèi)容移出到外存上,從而讓出一塊內(nèi)存空間,以供其他需要的內(nèi)存使用。當要訪問到那些已經(jīng)被調(diào)出到外存的數(shù)據(jù)時,存儲管理要將內(nèi)存中一部分不常被訪問的數(shù)據(jù)調(diào)出,讓出一塊空間以供需要的數(shù)據(jù)調(diào)入內(nèi)存。頁面模式 頁面為存儲管理中調(diào)入調(diào)出的基本單位。在存儲管理中,將內(nèi)存劃分為長度相等的頁面。Linux將每個用戶進程4GB長度的虛擬內(nèi)存劃分成固定大小的頁面。其中,

25、03GB是用戶態(tài)空間,由各進程獨占;34GB是內(nèi)核態(tài)空間,由所有進程共享,但只有內(nèi)核態(tài)的進程才能訪問。按需調(diào)頁 當進程訪問到某個虛存地址,卻發(fā)現(xiàn)該地址所對應(yīng)的物理頁面已經(jīng)被換出內(nèi)存時,系統(tǒng)會自動產(chǎn)生一個硬件中斷,即缺頁中斷。在中斷產(chǎn)生后,系統(tǒng)會自動調(diào)用相應(yīng)的中斷處理程序,來將所需的頁面從外存調(diào)入,或者干脆新建一個空白頁面。這個過程就叫做按需調(diào)頁。對換 對于虛擬內(nèi)存頁面來說,總是要將其改動過的內(nèi)容寫回到外存中,才能夠?qū)⑵鋪G棄。一個被更改過的內(nèi)存頁面,但還沒有將其內(nèi)容寫到外存中,就稱之為“臟頁面”。在換入頁面時,首先考慮的肯定是將“干凈的”頁面直接丟棄,然后將外存數(shù)據(jù)寫進來,因為這樣不會破壞數(shù)據(jù)的

26、完整性。然而這是一個矛盾,內(nèi)存調(diào)用者希望盡可能少地進行外存的刷新,這個結(jié)果造成內(nèi)存中“臟頁面”不斷增加,而換入程序又希望盡可能多一些“干凈”頁面,以便使它們可以很方便地將數(shù)據(jù)調(diào)入。于是,收拾垃圾的工作就由一個被稱作“對換”(swap)的程序來完成。Linux中存儲器管理的相關(guān)概念及實現(xiàn) 伙伴算法Linux的伙伴算法把所有的空閑頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面。工作原理:如果要求要求分配一個大小為M個頁面的塊,伙伴算法會先到與要求分配的M個頁面大小最接近的空閑塊鏈表中查找,看是否有這樣的一個空閑塊。如果有,就直接分配;如果沒有,該算法就會到下一個更大的空閑塊鏈表中查找一個空閑

27、塊,如果有,就將該空閑塊分為兩等份,一份分配出去,另一份就掛入下一級的空閑塊鏈表中;如果沒有,就繼續(xù)向更大的空閑塊鏈表中查找,直到查找完所有更大的空閑塊鏈表都沒找到空閑塊為止(空閑塊鏈表最大為512個頁面),如果沒有的就放棄分配,并發(fā)出出錯信息。以上過程的逆過程就是塊的釋放過程,這也是該算法名字的來由。滿足以下條件的兩個塊稱為伙伴:(1)兩個塊的大小相同;(2)兩個塊的物理地址連續(xù)。 slab Slab是Linux操作系統(tǒng)的一種內(nèi)存分配機制。Slab中引入了對象這個概念,所謂對象就是存放一組數(shù)據(jù)結(jié)構(gòu)的內(nèi)存區(qū),其方法就是構(gòu)造或析構(gòu)函數(shù),構(gòu)造函數(shù)用于初始化數(shù)據(jù)結(jié)構(gòu)所在的內(nèi)存區(qū),而析構(gòu)函數(shù)收回相應(yīng)的

28、內(nèi)存區(qū)。 實際上,Linux中對Slab分配模式有所改進,它對內(nèi)存區(qū)的處理并不需要進行初始化或回收。出于效率的考慮,Linux并不調(diào)用對象的構(gòu)造或析構(gòu)函數(shù),而是把指向這兩個函數(shù)的指針都置為空。 Linux中引入slab的豐要目的是為了減少對伙伴算法的調(diào)用次數(shù)。緩沖區(qū)就是主存中的一片區(qū)域,把這片區(qū)域劃分為多個塊,每塊就是一個Slab,每個Slab由一個或多個頁面組成,每個Slab中存放的就是對象。對于小對象,就把slab的描述結(jié)構(gòu)slab_t放在該slab中;對于大對象,則把slab結(jié)構(gòu)游離出來,集中存放。關(guān)于slab中的著色區(qū)再給予具體描述。緩沖區(qū)每個緩沖區(qū)還有一個輪轉(zhuǎn)鎖(spinlock),

29、在對鏈表進行修改時用這個輪轉(zhuǎn)鎖進行同步。緩沖區(qū)只有在一下兩個條件都成立的的時候才能分配到Slab:(1)已發(fā)出個分配新對象的請求;(2)緩沖區(qū)不包含任何空閑對象。在內(nèi)核中當初始化開銷不大的數(shù)據(jù)結(jié)構(gòu)可以合用一個通用的緩沖區(qū)。地址映射機制 顧名思義地址映射就是建立幾種存儲媒介(內(nèi)存,輔存,虛存)間的關(guān)聯(lián),完成地址間的相互轉(zhuǎn)換,它既包括磁盤文件到虛擬內(nèi)存的映射,也包括虛擬內(nèi)存到物理內(nèi)存的映射。進程的虛擬空間堆棧區(qū)位于進程虛擬空間的頂部,運行時由頂向下延伸。數(shù)據(jù)和代碼段位于虛擬空間的底部,運行時不向上延伸。中間的空洞是進程在運行時可以動態(tài)分配的空間(也叫動態(tài)內(nèi)存)。 頁故障的產(chǎn)生 (1)一是程序出現(xiàn)錯

30、誤 (2)另一種情況是,虛擬地址有效,但其所對應(yīng)的也當前不在物理內(nèi)存中,即缺頁錯誤 (3)最后一種情況是,要訪問的虛擬地址被寫保護,即保護錯誤 交換機制 當物理內(nèi)存出現(xiàn)不足時,Linux內(nèi)存管理子系統(tǒng)需要釋放部分物理內(nèi)存頁面。這一任務(wù)由內(nèi)核的交換守護進程kswapd完成,該內(nèi)核守護進程實際是一個內(nèi)核線程,它在內(nèi)核初始化時啟動,并周期地運行。它的任務(wù)就是保證系統(tǒng)中具有足夠的空閑頁面,從而使內(nèi)存管理子系統(tǒng)能夠有效運行。頁面交換策略:策略一:需要時才交換策略二:系統(tǒng)空閑時交換策略三:換出但不立即釋放策略四:把頁面換出推遲到不能再推遲為止Linux中新頁框的分配方案請求調(diào)頁(demand paging

31、):是在類UNIX操作系統(tǒng)中使用較為普遍的一種動態(tài)內(nèi)存分配技術(shù)。所謂動態(tài)內(nèi)存分配技術(shù)就是指進程運行所需要的頁框不是一開始就全部分配給進程,而是當內(nèi)核執(zhí)行進程的一個指令所需的頁面不在內(nèi)存時,再由CPU的控制單元引起一個缺頁異常,這時再由異常處理程序調(diào)入內(nèi)存。寫時拷貝(copy_on_write):把一個頁面標記為只讀,而把代表它的VMA標記為可寫。因此任何對頁面的寫操作都會造成頁面寫訪問異常,同樣會引起缺頁中斷。 緩沖區(qū)高速緩存 緩沖區(qū)高速緩存由設(shè)備標識號和塊標號索引,因此可以快速找出數(shù)據(jù)塊。緩沖區(qū)高速緩存的大小可以變化。當需要新緩沖區(qū)而現(xiàn)在又沒有可用的緩沖區(qū)時,就按需分配頁面。 刷新機制 采取

32、的解決辦法是為計算機裝備一個不需要經(jīng)過頁表就能把虛擬地址映射成物理地址的小的硬件設(shè)備,這個設(shè)備叫做TLB(翻譯后援存儲器,Translation Lookside Buffer),有時也叫做相聯(lián)存儲器(Associative Memov),它通常在MMU內(nèi)部,條目的數(shù)量較少。每一個TLB寄存器的每個條目包含一個頁面的信息:有效位、虛頁面號、修改位、保護碼和頁面所在的物理頁面號,它們和頁面表中的表項一一對應(yīng)。在Linux中刷新機制(包括TLB的刷新和緩存的刷新)主要完成以下兩項工作:(1)保證在任何時刻內(nèi)存管理硬件所看到的進程的內(nèi)核映射與內(nèi)核頁表一致。(2)如果負責內(nèi)存管理的內(nèi)核代碼對用戶進程頁

33、進行了修改,那么用戶進程在被允許繼續(xù)執(zhí)行前必須在緩存中看到正確的數(shù)據(jù)。5.2.5 文件系統(tǒng)文件系統(tǒng)是對一個存儲設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進行組織的機制,Linux文件系統(tǒng)接口為分層的體系結(jié)構(gòu),從而將用戶接口層、文件系統(tǒng)實現(xiàn)和操作存儲設(shè)備的驅(qū)動程序分隔開。Linux操作系統(tǒng)下的文件系統(tǒng)結(jié)構(gòu) 虛擬文件系統(tǒng)VFS是物理文件系統(tǒng)與服務(wù)之間的一個接口層,對用戶程序隱去各種不同文件系統(tǒng)的實現(xiàn)細節(jié),為用戶程序提供一個統(tǒng)一、抽象、虛擬的文件系統(tǒng)界面。VFS的功能包括:記錄可用的文件系統(tǒng)的類型;將設(shè)備同對應(yīng)的文件系統(tǒng)聯(lián)系起來;處理一些面向文件的通用操作。嵌入式文件系統(tǒng)存儲Linux啟動時,第一個必須掛載的是根文件系統(tǒng)

34、,若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動。啟動之后可以自動或手動掛載其他的文件系統(tǒng)。因此,一個系統(tǒng)中可以同時存在不同的文件系統(tǒng)。不同的文件系統(tǒng)類型有不同的特點,因而根據(jù)存儲設(shè)備的硬件特性、系統(tǒng)需求等有不同的應(yīng)用場合。在嵌入式Linux應(yīng)用中,主要的存儲設(shè)備為RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設(shè)備的文件系統(tǒng)類型包括:jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。嵌入式文件系統(tǒng)(1)ext2、ext3文件系統(tǒng)(2)基于FLASH的文件系統(tǒng) jffs2;yaffs;Cramfs ;Ro

35、mfs (3)基于RAM的文件系統(tǒng)Ramdisk ;ramfs/tmpfs(4)網(wǎng)絡(luò)文件系統(tǒng)NFS (Network File System)文件系統(tǒng)的目錄結(jié)構(gòu)Linux的目錄結(jié)構(gòu)樹型目錄結(jié)構(gòu)dir1/-dir2/-file12|-dir3/-|-dir4|.根目錄組織/-root/:超級用戶目錄 包括桌面管理等 |-home/:用戶目錄 包括用戶信息等 |-bin/:執(zhí)行目錄可執(zhí)行文件常用命令 |-sbin/:執(zhí)行目錄不提供給用戶使用的命令 |-boot/:引導目錄引導系統(tǒng)使用的文件 |-etc/:配置目錄 系統(tǒng)配置時使用 |-dev/:設(shè)備目錄 通過它訪問外設(shè) |-mnt/:安裝目錄 管理

36、員設(shè)備臨時安裝點 |-opt/:安裝目錄 管理員軟件包放置點 |-lib/:庫目錄 命令執(zhí)行時使用 |-usr/:共享目錄 所有用戶的共享文件|-var/:數(shù)據(jù)目錄 系統(tǒng)運行時要修改數(shù)據(jù) |-tmp/:數(shù)據(jù)目錄 系統(tǒng)運行時要修改數(shù)據(jù) |-proc/:虛擬目錄 文件系統(tǒng)內(nèi)存產(chǎn)生|-lost+found/:空目錄 5.2.6 設(shè)備管理設(shè)備管理是操作系統(tǒng)諸多管理中最復雜的部分。與Unix系統(tǒng)一樣,Linux系統(tǒng)采用設(shè)備文件統(tǒng)一管理硬件設(shè)備,從而將硬件設(shè)備的特性及管理細節(jié)對用戶隱藏起來,實現(xiàn)用戶程序與設(shè)備無關(guān)性。設(shè)備分類 按設(shè)備的所屬關(guān)系可以將I/O設(shè)備分為以下兩類:(1)系統(tǒng)設(shè)備(2)用戶設(shè)備按設(shè)備

37、的信息交換的單位可將I/O設(shè)備分為以下兩類:(1)字符設(shè)備(2)塊設(shè)備按設(shè)備的共享屬性可將I/O設(shè)備分為以下三類:(1)獨占設(shè)備(2)共享設(shè)備(3)虛擬設(shè)備根據(jù)設(shè)備的用途,可以把設(shè)備分為存儲設(shè)備與輸入/輸出設(shè)備兩大類。設(shè)備管理的任務(wù) (1)選擇和分配I/O設(shè)備以便進行數(shù)據(jù)傳輸操作。(2)控制I/O設(shè)備和CPU(或內(nèi)存)之間交換數(shù)據(jù)。(3)為用戶提供一個友好的透明接口,把用戶和設(shè)備硬件特性分開,使得用戶在編制應(yīng)用程序時不必涉及具體設(shè)備,由系統(tǒng)按用戶的要求來對設(shè)備的工作進行控制。另外,這個接口還為新增加的用戶設(shè)備提供一個和系統(tǒng)核心相連接的入口,以便用戶開發(fā)新的設(shè)備管理程序。(4)提高設(shè)備和設(shè)備之間

38、、CPU和設(shè)備之間以及進程和進程之間的并行操作程度,以使操作系統(tǒng)獲得最佳效率。設(shè)備管理程序一般要提供的功能:(1)提供和進程管理系統(tǒng)的接口(2)進行設(shè)備分配(3)實現(xiàn)設(shè)備和設(shè)備、設(shè)備和CPU等之間的并行操作(4)進行緩沖管理(5)設(shè)備控制與驅(qū)動設(shè)備控制器 設(shè)備控制器是CPU與I/O設(shè)備之間的接口,它接收從CPU發(fā)來的命令并去控制I/O設(shè)備工作。 大多數(shù)設(shè)備控制器都由以下三部分組成。(1)設(shè)備控制器與處理機的接口(2)設(shè)備控制器與設(shè)備的接口(3)I/O邏輯I/O通道 設(shè)置I/O通道的目的是使一些原來由CPU處理的I/O任務(wù)轉(zhuǎn)由通道來承擔,從而把CPU從繁雜的I/O任務(wù)中解脫出來。通道有兩種基本類

39、型:選擇通道和多路通道。選擇通道又稱高速通道,在物理上它可以連接多個設(shè)備,但是這些設(shè)備不能同時工作,在某一段時間內(nèi)通道只能選擇一個設(shè)備進行工作。 多路通道又分為數(shù)組多路通道和字節(jié)多路通道。數(shù)組多路通道的基本思想是指,當某設(shè)備進行數(shù)據(jù)傳送時,通道只為該設(shè)備服務(wù);當設(shè)備在執(zhí)行尋址等控制性動作時,通道暫時斷開與這個設(shè)備的連接,掛起該設(shè)備的通道程序,去為其他設(shè)備服務(wù),即執(zhí)行其他設(shè)備的通道程序。 字節(jié)多路通道主要用于連接大量的低速設(shè)備,因此通道在傳送兩個字節(jié)之間有很多空閑時間,字節(jié)多路通道正是利用這個空閑時間為其他設(shè)備服務(wù)。 Linux的I/O控制 Linux的I/O控制方式常用的有三種:查詢等待方式、

40、中斷方式和DMA(內(nèi)存直接存取)方式。 (1)查詢等待方式查詢等待方式又稱輪詢方式(polling mode)。對于不支持中斷方式的機器只能采用這種方式來控制I/O過程,所以Linux中也配備了查詢等待方式。(2)中斷方式在硬件支持中斷的情況下,驅(qū)動程序可以使用中斷方式控制I/O過程。對I/O過程控制使用的中斷是硬件中斷,當某個設(shè)備需要服務(wù)時就向CPU發(fā)出一個中斷脈沖信號,CPU接收到信號后根據(jù)中斷請求號IRQ啟動中斷服務(wù)例程。(3)DMA方式內(nèi)存直接存取技術(shù)是指數(shù)據(jù)在內(nèi)存與I/O設(shè)備間自己接進行成塊傳輸。DMA有兩個技術(shù)特征:首先是直接傳送,其次是塊傳送。所謂直接傳送,即在內(nèi)存與I/O設(shè)備間

41、傳送一個數(shù)據(jù)庫的過程中,不需要CPU的任何中間干涉,只需要CPU在過程開始時向設(shè)備發(fā)出“傳送塊數(shù)據(jù)”的命令,然后通過中斷來得知過程是否結(jié)束和下次操作是否就緒。一個完整的DMA過程包括初始化、DMA請求、DMA響應(yīng)、DMA傳輸、DMA結(jié)束5個階段。(4) 通道方式也是一種I/O控制方式,但是這種方式是利用一個獨立于CPU以外的、專門管理I/O的處理機來控制輸入和輸出,它控制設(shè)備與內(nèi)存直接進行數(shù)據(jù)交換,有著自己的通道指令,這些通道指令由CPU啟動,并在結(jié)束時向CPU發(fā)出中斷信號。 設(shè)備驅(qū)動 設(shè)備驅(qū)動程序的處理過程:(1)將抽象要求轉(zhuǎn)換為具體要求(2)檢查I/O請求的合法性(3)讀出和檢查設(shè)備的狀態(tài)

42、(4)傳送必要的參數(shù)(5)工作方式的設(shè)置(6)啟動I/O設(shè)備Linux設(shè)備管理的設(shè)備 在Linux系統(tǒng)中,硬件設(shè)備分為兩種,即塊設(shè)備和字符設(shè)備。1)特別文件用戶是通過文件系統(tǒng)與設(shè)備接口的,所有設(shè)備都作為特別文件,從而在管理上就具有一些共性。設(shè)備驅(qū)動的分層結(jié)構(gòu) 對于一般文件(即磁盤文件),要進行空間的映射:從普通文件的邏輯空間映射到設(shè)備的邏輯空間,然后在設(shè)備驅(qū)動層做進一步映射:從設(shè)備的邏輯空間映射到物理空間(即設(shè)備的物理地址空間),進而驅(qū)動底層物理設(shè)備工作。對于設(shè)備文件,則文件的邏輯空間通常就等價于設(shè)備的邏輯空間,然后從設(shè)備的邏輯空間映射到設(shè)備的物理空間,再驅(qū)動底層的物理設(shè)備工作。2)設(shè)備驅(qū)動程

43、序和內(nèi)核之間的接口Linux系統(tǒng)和設(shè)備驅(qū)動程序之間使用標準的交互接口。無論是字符設(shè)備、塊設(shè)備還是網(wǎng)絡(luò)設(shè)備的驅(qū)動程序,當內(nèi)核請求它們提供服務(wù)時,都使用同樣的接口。 在應(yīng)用程序界面上,利用內(nèi)核提供的系統(tǒng)調(diào)用來實現(xiàn)可安裝模塊的動態(tài)安裝和拆卸。但通常情況下,用戶是利用系統(tǒng)提供的插入模塊工具和移走模塊工具來裝卸可安裝模塊。插入模塊的工作主要如下:(1)打開要安裝的模塊,把它讀到用戶空間。這種“模塊”就是經(jīng)過編譯但尚未連接的.o文件。(2)必須把模塊內(nèi)涉及對外訪問的符號(函數(shù)名或變量名)連接到內(nèi)核,即把這些符號在內(nèi)核映像中的地址填入該模塊需要訪問這些符號的指令及數(shù)據(jù)結(jié)構(gòu)中。(3)在內(nèi)核創(chuàng)建一個module

44、數(shù)據(jù)結(jié)構(gòu),并申請所需的系統(tǒng)空間。(4)最后,把用戶空間中完成了連接的模塊映像裝入內(nèi)核空間,并在內(nèi)核中“登記”本模塊的有關(guān)數(shù)據(jù)結(jié)構(gòu)(如file_operations結(jié)構(gòu)),其中有指向執(zhí)行相關(guān)操作函數(shù)的指針。 3)字符設(shè)備在Linux 系統(tǒng)中,打印機、終端等字符設(shè)備都作為字符特別文件出現(xiàn)在用戶面前。用戶對字符設(shè)備的使用就和存取普通文件一樣。在應(yīng)用程序中,使用標準的系統(tǒng)調(diào)用來打 開、關(guān)閉、讀寫字符設(shè)備。當字符設(shè)備初始化時,其設(shè)備驅(qū)動程序被添加到由device_struct結(jié)構(gòu)組成的chrdevs結(jié)構(gòu)數(shù)組中。device_struct 結(jié)構(gòu)由兩項構(gòu)成,一個是指向已登記的設(shè)備驅(qū)動程序名的指針,另一個是指

45、向file_operations結(jié)構(gòu)的指針。而file_operations結(jié) 構(gòu)的成分幾乎全是函數(shù)指針,分別指向?qū)崿F(xiàn)文件操作的入口函數(shù)。設(shè)備的主設(shè)備號用來對chrdevs數(shù)組進行索引。4)塊設(shè)備對塊設(shè)備的存取和對文件的存取方式一樣,其實現(xiàn)機制也和字符設(shè)備使用的機制相同。Linux系統(tǒng)中有一個名為blkdevs的結(jié)構(gòu)數(shù)組,它描述了一系列在系統(tǒng)中登記的塊設(shè)備。 數(shù)組blkdevs也使用設(shè)備的主設(shè)備號作為索引,其元素類型是device_struct結(jié)構(gòu)。該結(jié)構(gòu)中包括指向已登記的設(shè)備驅(qū)動程序名的指針和指向block_device_operations結(jié)構(gòu)的指針。Linux字符設(shè)備的驅(qū)動 主要通過介紹

46、字符設(shè)備scull(Simple Character Utility for Loading Localities,區(qū)域裝載的簡單字符工具)的驅(qū)動程序編寫,來學習Linux設(shè)備驅(qū)動的基本知識。scull可以為真正的設(shè)備驅(qū)動程序提供樣板。1)主設(shè)備號和次設(shè)備號2)一些重要的數(shù)據(jù)結(jié)構(gòu)3)字符設(shè)備的注冊4)scull模型的內(nèi)存使用5)open和release 6)read和write 7)對于scull設(shè)備有時需要用到scull pipe設(shè)備,scull pipe設(shè)備是針對一片內(nèi)存,實現(xiàn)了一個circular buffer(循環(huán)緩沖) 5.2.7 嵌入式Linux引導過程在嵌入式系統(tǒng)中,首先要考慮的

47、就是啟動問題,即系統(tǒng)如何告知CPU啟動位置以及啟動方法。一般來說,嵌入式系統(tǒng)會提供多種啟動方法。具備Flash ROM的系統(tǒng)具備有Flash啟動的方式,也有直接從RAM中啟動的方法。這些啟動部分的工作主要由一個被稱為bootloader的程序完成。 運行Linux的目標機在重新啟動后要經(jīng)過幾個步驟才能出現(xiàn)系統(tǒng)提示符。最初的步驟是與微處理器硬件相關(guān)的。內(nèi)核本身包含了微處理器體系結(jié)構(gòu)相關(guān)的初始化代碼,這些代碼首先被執(zhí)行。該初始化代碼為保護模式的運算配置微處理器的寄存器,然后調(diào)用微處理器體系結(jié)構(gòu)無關(guān)的稱為start_kernel的內(nèi)核開始點。此后,內(nèi)核的引導過程對于所有微處理器體系結(jié)構(gòu)都是完全相同的

48、。 Linux的引導過程包括下列步驟: 1)處理器重新啟動之后,執(zhí)行ROM啟動代碼。2)ROM啟動代碼初始化CPU、內(nèi)存控制器以及片上設(shè)備,然后配置存儲映射。ROM啟動代碼隨后執(zhí)行一個引導裝載程序bootloader。3)引導裝載程序?qū)inux內(nèi)核從Flash或者TFTP服務(wù)器解壓到RAM中。然后跳到內(nèi)存的第一天指令處執(zhí)行。內(nèi)核首先配置微處理器的寄存器,然后調(diào)用start_kernal,它是體系結(jié)構(gòu)無關(guān)的開始點。4)內(nèi)核初始化告訴緩存和各種硬件設(shè)備。5)內(nèi)核掛裝根文件系統(tǒng)。6)內(nèi)核執(zhí)行init進程。7)正在執(zhí)行的init進程裝載運行時的共享庫。8)init讀取其配置文件/etc/initta

49、b并執(zhí)行執(zhí)行腳本。一般而言,init執(zhí)行一個啟動腳本rc.d/rcs,該腳本配置并啟動網(wǎng)絡(luò)和其他系統(tǒng)服務(wù)。9)init進入運行級別,在該級別下可以執(zhí)行系統(tǒng)任務(wù)或開始登陸進程,最后進入用戶會話階段。 嵌入式Linux引導過程中概念簡介1)bootloader程序bootloader的作用: (1)初始化處理器。(2)初始化必備的硬件 。(3)下載系統(tǒng)映像。 (4)初始化操作系統(tǒng)并準備運行。 2)嵌入式系統(tǒng)內(nèi)核對于使用操作系統(tǒng)的嵌入式系統(tǒng)而言,操作系統(tǒng)一般是以內(nèi)核映像的形式下載到目標系統(tǒng)中。以Linux為例子,在系統(tǒng)開發(fā)完成之后,將整個操作系統(tǒng)部分做成壓縮或者沒有壓縮過的內(nèi)核映像文件,與文件系統(tǒng)一

50、起傳送到目標系統(tǒng)中。通過bootloader指定地址運行Linux內(nèi)核,啟動嵌入式Linux系統(tǒng);然后再通過操作系統(tǒng)解開文件系統(tǒng),運行應(yīng)用程序。在內(nèi)核中通常必須的部件是進程管理、進程間通信、內(nèi)存管理部分,其他部件,如文件系統(tǒng)、驅(qū)動程序、網(wǎng)絡(luò)協(xié)議等,都可以配置,并以相關(guān)的方式實現(xiàn)。 3)根文件系統(tǒng)在嵌入式系統(tǒng)中的“硬盤”概念一般都以ramdisk的方式實現(xiàn)。因為Falsh這樣斷電后還能繼續(xù)保存數(shù)據(jù)的設(shè)備,其價格相對昂貴;然而系統(tǒng)中又無法使用像硬盤這樣的大型設(shè)備,因此,需要長久使用的文件系統(tǒng)數(shù)據(jù),尤其是應(yīng)用程序的可執(zhí)行文件、運行庫等,運行時都放在RAM中。常用的方式就是從RAM中劃分出一塊內(nèi)存虛擬

51、成“硬盤”,對它的操作與對永久存儲器操作一樣。在Linux中就存在這樣的設(shè)備,稱為ramdisk,一般使用的設(shè)備文件是/dev/ram0 。當然,根文件系統(tǒng)不一定使用ramdisk實現(xiàn),還可以用NFS方式通過網(wǎng)絡(luò)安裝根文件系統(tǒng)。這也是在系統(tǒng)內(nèi)核中實現(xiàn)的。操作系統(tǒng)啟動之后直接通過內(nèi)核中NFS相關(guān)代碼對處于網(wǎng)絡(luò)上的NFS文件系統(tǒng)進行安裝。文件系統(tǒng)啟動的方式可以在內(nèi)核代碼中編寫或者啟動時通過參數(shù)指定。4)重定位和下載生成了目標平臺需要的image文件之后,就可以通過相應(yīng)的工具與目標板上的bootloader程序進行通信。可以使用bootloader提供的,或者通用的終端工具與目標板相連接。一般在目標

52、板上使用串口,通過主機終端工具與目標板通信。bootloader中提供下載等控制命令,完成嵌入式系統(tǒng)正式在目標板上運行之前對目標板的控制任務(wù)。bootloader指定image文件下載的位置。在下載結(jié)束之后,使用bootloader提供的運行命令,從指定地址開始運行嵌入式系統(tǒng)軟件。5)Linux內(nèi)核源代碼中的匯編語言代碼用匯編語言編寫核心代碼中的部分代碼出于以下幾個方面的考慮:操作系統(tǒng)內(nèi)核中的底層程序直接與硬件打交道,需要用到一些專用的指令,而這些指令在C語言中并無相對應(yīng)的語言成分。因此,這些底層的操作需要用匯編語言來編寫。CPU中的一些對寄存器的操作也是一樣,例如要設(shè)置一個段寄存器時,也只好

53、用匯編語言來編寫。CPU中的一些特殊指定也沒有相對應(yīng)的C語言成分,例如關(guān)中斷、開中斷等。此外,在同一體系系統(tǒng)的不同CPU芯片中,特別是新開發(fā)出來的芯片中,往往會增加一些新的指令,對這些指令的使用也得用匯編語言。用匯編語言編寫的程序,在算法和數(shù)據(jù)結(jié)構(gòu)相同的條件下,常比使用高級語言編寫的效率要高。在 在某些特殊的場合,一段程序的空間效率也會顯得非常重要,這段程序的大小多出一個字節(jié)也不允許,所以一般使用匯編語言編寫。 嵌入式Linux引導過程 一個最基本的嵌入式Linux系統(tǒng)從軟件的角度可以分為四個層次:(1)導加載程序bootloader;(2)Linux內(nèi)核;(3)文件系統(tǒng);(4)用戶應(yīng)用程序。嵌入式Linux引導過程(1)理器重新啟動后,首先執(zhí)行啟動代碼以初始化內(nèi)存控制器以及片上設(shè)備,然后配置存儲映射。(2)Bootloader把內(nèi)核從Flash等固態(tài)存儲設(shè)備加載到RAM然后跳轉(zhuǎn)到內(nèi)核的第一條

溫馨提示

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

評論

0/150

提交評論