




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 嵌入式Linux操作系統5.1 與Linux相關術語GNUGUN項目(GNU Project)開始于1984年,主要由自由軟件基金(Free Software FoundationFSF)資助的一個項目,目標是開發一個自由的、UNIX類型的操作系統,稱為GNU系統。GNU是“GNUs Not UNIX”的首字母的遞歸縮寫。GPL所有的GNU軟件和派生工作均遵循GNU通用公共許可證,即GPL。5.1 與Linux相關術語GNU LGPL(Library General Public License程序庫公共許可證)允許用戶在自己的應用程序中使用程序庫,即使不公開自己的源代碼。用戶必須能夠
2、獲得在應用程序中使用的程序庫的源代碼,并且允許用戶對這些程序庫進行修改。遵循LGPL的一種方法是,隨應用程序一起發布目標代碼以及可以將這些目標程序和受LGPL保護的程序庫鏈接起來的makefile文件。遵循LGPL的另一種比較好的方法是使用動態鏈接。FSF :Free Software Foundation 自由軟件基金會5.2 嵌入式Linux操作系統5.2.1 Linux介紹 技術上說Linux是一個內核。“內核”指的是一個提供硬件抽象層、磁盤及文件系統控制、多任務等功能的系統軟件。一個內核不是一套完成的操作系統,還需要加載庫文件、應用程序等,才可以形成完整的操作系統。一套基于Linux內
3、核的完整操作系統叫做Linux操作系統。 Linux操作系統具備結構清晰、功能簡介等特征,逐漸成為一個穩定可靠、功能完善的操作系統。作為一個操作系統,Linux幾乎滿足當今Unix操作系統的所有要求。 Linux具有的特點 1、完全免費2、開放型3、支持多用戶訪問和多任務編程 4、良好的用戶界面5、支持多種文件系統 6、采用虛擬內存管理技術7、設備獨立性8、豐富的網絡功能9、可靠的系統安全10、良好的可移植性完整的Linux架構圖 作為一個完成的操作系統,Linux具有穩定而強大的功能,想要訪問任何非自己的存儲器空間的進程只能通過系統調用來達成。一般進程是處于用戶模式底下,而運行系統調用時會被
4、切換成內核模式,所有的特殊指令只能在內核模式運行,此措施讓內核可以完美管理系統內部與外部設備,并且拒絕無權限的進程提出的請求。因此理論上任何應用程序運行時的錯誤,都不可能讓系統崩潰。 5.2.2 Linux作為嵌入式操作系統的優勢1、支持多種硬件平臺 2、占有較少的硬件資源3、高可定制性 4、具有實時處理能力 5、具備強大的網絡功能 Linux作為嵌入式操作系統也存在著不足,主要表現在集成開發環境有待改善。 5.2.3 進程管理進程的基本概念 進程就是運行中的程序。一個運行著的程序,可能有多個進程。 對于進程來說,可以看成是一個具有獨立功能的程序關于某個數據集合的一次可以并發執行的運行活動,是
5、處于活動狀態的計算機程序。 進程的屬性 進程的定義:一個進程是一個程序的一次執行的過程;程序是靜態的,它是一些保存在磁盤上的可執行的代碼和數據集合;進程是一個動態的概念,它是Linux系統的基本的調度單位。一個進程由如下元素組成: 程序讀取的上下文,它表示程序讀取執行的狀態。 程序當前執行的目錄。 程序服務的文件和目錄。 程序訪問的權限。 內存和其他分配給進程的系統資源。Linux進程中最知名的屬性就是它的進程號(Process Idenity Number,PID)和它的父進程號(Parent Process ID,PPID)。PID、PPID都是非零正整數。一個PID唯一地標識一個進程。一
6、個進程創建新進程稱為創建了子進程(Child Process)。相反地,創建子進程的進程稱為父進程。所有進程追溯其祖先最終都會落到進程號為1的進程身上,這個進程叫做init進程,是內核自舉后第一個啟動的進程。init進程扮演終結父進程的角色。因為init進程永遠不會被終止,所以系統總是可以確信它的存在,并在必要的時候以它為參照。 Linux下進程的結構 代碼段是存放了程序代碼的數據,假如機器中有數個進程運行相同的一個程序,那么它們就可以使用同一個代碼段。而數據段則存放程序的全局變量、常數及動態數據分配的數據空間。堆棧段存放的就是子程序的返回地址、子程序的參數及程序的局部變量。堆棧段包含在進程控
7、制塊PCB(Process Control Block)中。PCB處于進程核心堆棧的底部,不需要額外分配空間。 進程狀態進程在生存周期中的各種狀態及狀態的轉換 。Linux系統的進程狀態模型的各種狀態:用戶狀態:進程在用戶狀態下運行的狀態。內核狀態:進程在內核狀態下運行的狀態。內存中就緒:進程沒有執行,但處于就緒狀態,只要內核調度它,就可以執行。內存中睡眠:進程正在睡眠并且進程存儲在內存中,沒有被交換到SWAP設備。就緒且換出:進程處于就緒狀態,但是必須把它換入內存,內核才能再次調度它運行。睡眠且換出:進程正在睡眠,且被換出內存。被搶先:進程從內核狀態返回用戶狀態時,內核搶先于它做了上下文切換
8、,調度了另一個進程。原先這個進程就處于被搶先狀態。創建狀態:進程剛被創建。該進程存在,但既不是就緒狀態,也不是睡眠狀態。這個狀態是除了進程0以外的所有進程的最初狀態。僵死狀態(zombie):進程調用exit結束,進程不再存在,但在進程表項中仍有記錄,該記錄可由父進程收集。進程的創建與結束 在Linux系統中,通常使用fork( )系統調用用來復制一個現有進程,從而創建一個全新的進程。被復制的進程被稱為父進程,新產生的進程被稱為子進程。 為了方便用戶處理父進程與子進程之間的一些事物,Linux允許父進程在創建了進程之后,通過調用wait( )先進入等待狀態,以使子進程先運行,然后再決定自己的進
9、一步行為,這成為父進程的阻塞方式。 進程的結束可以使用exit( )系統調用,無論在執行到什么位置,只要執行到exit系統調用,進程會停止所有操作并將其占用的資源釋放掉。 進程的創建與結束有一個更簡單的執行其他程序的函數system,參數string傳遞給一個命令解釋器(一般為sh)執行,即string被解釋為一條命令,由sh執行該命令。除了system之外,系統調用exec來執行一個可執行文件,來代替當前進程的執行映像。系統調用exit的功能是終止發出調用的進程。 父進程和子進程的關系是管理和被管理的關系,當父進程終止時,子進程也隨之而終止。但子進程終止時,父進程并不一定終止。進程的組成 在
10、Linux中,進程是以進程號PID(Process ID)作為標示。任何對進程進行的操作都要給與其相應的PID號。每個進程都屬于一個用戶,進程要配備其所屬的用戶編號UID。此外,每個進程都屬于多個用戶組,所以進程還要配備其歸屬的用戶組編號GID的數組。 進程運行的環境成為進程上下文。Linux中進程的上下文由進程控制塊PCB(Process Control Block)、正文段、數據段以及用戶堆棧組成。其中,正文段存放該進程的可執行代碼,數據段存放進程中靜態產生的數據結構,而PCB包括進程的編號、狀態、優先級以及正文段和數據段中數據分布的大概情況。一個稱作進程表(Process Table)的
11、鏈表結構將系統中所有的PCB塊聯系起來 。啟動一個進程有兩個主要途徑:手工啟動和調度啟動,后者是事先進行設置,根據用戶要求自行啟動。由用戶輸入命令,直接啟動一個進程便是手工啟動進程。但手工啟動進程又可以分為很多種,根據啟動的進程類型不同、性質不同,實際結果也不一樣。(1)前臺啟動前臺啟動是手工啟動一個進程的最常用的方式。用戶鍵入一個命令“df”,就已經啟動了一個進程,而且是一個前臺的進程。 (2)后臺啟動直接從后臺手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且用戶也不急著需要結果。 進程的狀態和調度 一般來說,所有進程都要經歷三種狀態,即運行態、就緒態和阻塞態 在Linux系統中將上
12、述三種狀態進行重新組織,得到了Linux進程的幾個狀態: 進程的調度為了讓Linux來管理系統中的進程,每個進程用一個task_struct數據結構來表示(任務與進程在Linux中可以混用)。數組task包含指向系統中所有task_struct結構的指針。這意味著系統中的最大進程數目受task數組大小的限制,缺省值一般為512。創建新進程時,Linux將從系統內存中分配一個task_struct結構并將其加入task數組。當前運行進程的結構用current指針來指示。 Linux還支持實時進程。這些進程必須對外部時間作出快速反應(這就是“實時”的意思),系統將區分對待這些進程和其他進程。雖然t
13、ask_struct數據結構龐大而復雜,但它可以分成一些功能組成部分:State 進程在執行過程中會根據環境來改變state。SchedulingInformation 調度器需要這些信息以便判定系統中哪個進程最迫切需要運行。 Identifiers 系統中每個進程都有進程標志。進程標志并不是task數組的索引,它僅僅是個數字。Inter-ProcessCommunication Linux支持經典的Unix IPC機制。Links Linux系統中所有進程都是相互聯系的。TimesandTimers 核心需要記錄進程的創建時間以及在其生命期中消耗的CPU時間。Filesystem 進程可以自
14、由地打開或關閉文件,進程的task_struct結構中包含一個指向每個打開文件描敘符的指針以及指向兩個VFSinode的指針。Virtualmemory 多數進程都有一些虛擬內存(核心線程和后臺進程沒有),Linux核心必須跟蹤虛擬內存與系統物理內存的映射關系。 ProcessorSpecificContext 進程可以認為是系統當前狀態的總和。Linux使用用戶和組標志符來檢查對系統中文件和可執行映象的訪問權限。Linux系統中所有的文件都有所有者和允許的權限,這些權限描敘了系統使用者對文件或者目錄的使用權。基本的權限是讀、寫和可執行,這些權限被分配給三類用戶:文件的所有者,屬于相同組的進程
15、以及系統中所有進程。每類用戶具有不同的權限,例如一個文件允許其擁有者讀寫,但是同組的只能讀而其他進程不允許訪問。 task_struct結構中有四對進程和組標志符: uid,gid 表示運行進程的用戶標志符和組標志符。 effectiveuidandgid 有些程序可以在執行過程中將執行進程的uid和gid改成其程序自身的uid和gid(保存在描敘可執行映象的VFSinode屬性中)。這些程序被稱為setuid程序,常在嚴格控制對某些服務的訪問時使用,特別是那些為別的進程而運行的進程,例如網絡后臺進程。有效uid和gid是那些setuid執行過程在執行時變化出的uid和gid。當進程試圖訪問特
16、權數據或代碼時,核心將檢查進程的有效gid和uid。 filesystemuidandgid 它們和有效uid和gid相似但用來檢驗進程的文件系統訪問權限。如運行在用戶模式下的NFS服務器存取文件時,NFS文件系統將使用這些標志符。此例中只有文件系統uid和gid發生了改變(而非有效uid和gid)。這樣可以避免惡意用戶向NFS服務器發送KILL信號。 saveduidandgid POSIX標準中要求實現這兩個標志符,它們被那些通過系統調用改變進程uid和gid的程序使用。當進程的原始uid和gid變化時,它們被用來保存真正的uid和gid。進程調度機制的設計,還對系統復雜性有著極大的影響,
17、常常會由于實現的復雜程度而在功能和性能方面做出必要的權衡和讓步。另外,進度調度的機制還要考慮到“公正性”,讓系統所有進程都有機會向前推進,盡管其進度各有不同,并最終受到CPU速度和負載的影響。更重要的是,還要防止死鎖的發生,以及防止對CPU能力的不合理使用,也就是說要防止CPU尚有能力且有進程等執行,卻由于某種原因而長時間得不到執行的情況。一旦這些情況發生,調度機制還能識別與化解。調度器必須選擇最迫切需要運行而且可以執行的進程來執行。可運行進程是一個只等待CPU資源的進程。Linux使用基于優先級的簡單調度算法來選擇下一個運行進程。當選定新進程后,系統必須將當前進程的狀態,處理器中的寄存器以及
18、上下文狀態保存到task_struct結構中。同時它將重新設置新進程的狀態并將系統控制權交給此進程。為了將CPU時間合理的分配給系統中每個可執行進程,調度管理器必須將這些時間信息也保存在task_struct中。 在每個進程的task_struct結構中有以下四項:policy、priority、counter、rt_priority。這四項是選擇進程的依據。其中,policy是進程的調度策略,用來區分實時進程和普通進程,實時進程優先于普通進程運行;priority是進程(包括實時和普通)的靜態優先級;counter是進程剩余的時間片,它的起始值就是priority的值;由于counter在后
19、面計算一個處于可運行狀態的進程值得運行的程度goodness時起重要作用,因此,counter也可以看作是進程的動態優先級。rt_priority是實時進程特有的,用于實時進程間的選擇。 進程調度的核心在幾個位置調用調度管理器。如當前進程被放入等待隊列后運行或者系統調用結束時,以及從系統模式返回用戶模式時。此時系統時鐘將當前進程的counter值設為0以驅動調度管理器。每次調度管理器運行時將進行下列操作: kernelwork 調度管理器運行底層處理程序并處理調度任務隊列。 Currentprocess 當選定其他進程運行之前必須對當前進程進行一些處理。 如果當前進程的調度策略是時間片輪轉,則
20、它被放回到運行隊列。如果任務可中斷且從上次被調度后接收到了一個信號,則它的狀態變為運行態。如果當前進程的狀態是Running,則狀態保持不變。那些既不處于Running狀態又不是可中斷的進程將會從運行隊列中刪除。這意味著調度管理器選擇運行進程時不會將這些進程考慮在內。 調度器在運行隊列中選擇一個最迫切需要運行的進程。如果運行隊列中存在實時進程(那些具有實時調度策略的進程),則它們比普通進程更多的優先級權值。 在存在多個相同優先級進程的平衡系統中,每個進程被依次執行,這就是RoundRobin策略。然而由于進程經常需要等待某些資源,所以它們的運行順序也常發變化。如果系統選擇其他進程運行,則必須被
21、掛起當前進程且開始執行新進程。進程執行時將使用寄存器、物理內存以及CPU。每次調用子程序時,它將參數放在寄存器中并把返回地址放置在堆棧中,所以調度管理器總是運行在當前進程的上下文。 進程的切換發生在調度管理器運行之后。以前進程保存的上下文與當前進程加載時的上下文相同,包括進程程序計數器和寄存器內容。如果以前或者當前進程使用了虛擬內存,則系統必須更新其頁表入口,這與具體體系結構有關。如果處理器使用了轉換旁視緩沖或者緩沖了頁表入口(如AlphaAXP),那么必須沖刷以前運行進程的頁表入口。5.2.4 存儲管理在這里所說的存儲管理一般指的是內存管理,在計算機業界,內存這個名詞被廣泛用來稱呼 RAM(
22、隨機存取內存),計算機使用隨機存取內存來儲存執行作業所須的暫時指令以及數據,以使計算機的 CPU能夠更快速讀取儲存在內存的指令及數據。 下面介紹Linux存儲器管理幾個基本概念 :存儲管理的任務 存儲管理是Linux中負責管理內存的模塊。存儲管理的任務有以下幾點:屏蔽各種硬件的內存結構,并向上層返回同意的訪問界面。Linux支持各種各樣的硬件體系結構。對每種硬件結構,其內存的組織形式各不相同。然而,對于用戶的應用程序來說,總是希望提供一個同意的界面以供調用。這樣,存儲模塊就自然要擔負這個屏蔽和轉化的任務。解決進程狀態下內存不足的問題,按需調頁。隨著硬件的發展,內存的增大,軟件業相應地向著大規模
23、方向發展。在一個多進程系統中,所有進程所占用的內存總和往往會超過物理內存容量。這樣就需要存儲管理實現能夠利用副存儲器(比如硬盤)進行輔助存儲的功能。存儲管理機制甚至還能夠處理單個進程所占用內存超過主存大小的情況。阻止進程肆意訪問其他進程的地址空間和內核地址空間。由于并發執行的進程所在的地址空間都不能沖突,而進程太多,物理內存空間根本不夠,故需要模擬出一個更大的虛擬邏輯空間提供給上層應用程序,并通過一個可靠的機制建立起邏輯空間到物理空間的映射關系。為進程中通信所需要的共享內存提供必要的基礎。對于上層用戶來講,共享內存和普通內存是兩種概念;然而對于存儲管理系統來講,這兩者卻都是內存中的一部分,所有
24、內存空間的任一部分都可被劃為共享內存使用。因此,實現共享內存的任務就需要由存儲管理模塊來實現 虛擬內存 虛擬內存是現代操作系統的重要特征。對于一個多進程的操作系統來說,每個進程都要占據自己唯一的內存地址空間。虛擬內存的基本原理是將內存中一部分近期不需要的內容移出到外存上,從而讓出一塊內存空間,以供其他需要的內存使用。當要訪問到那些已經被調出到外存的數據時,存儲管理要將內存中一部分不常被訪問的數據調出,讓出一塊空間以供需要的數據調入內存。頁面模式 頁面為存儲管理中調入調出的基本單位。在存儲管理中,將內存劃分為長度相等的頁面。Linux將每個用戶進程4GB長度的虛擬內存劃分成固定大小的頁面。其中,
25、03GB是用戶態空間,由各進程獨占;34GB是內核態空間,由所有進程共享,但只有內核態的進程才能訪問。按需調頁 當進程訪問到某個虛存地址,卻發現該地址所對應的物理頁面已經被換出內存時,系統會自動產生一個硬件中斷,即缺頁中斷。在中斷產生后,系統會自動調用相應的中斷處理程序,來將所需的頁面從外存調入,或者干脆新建一個空白頁面。這個過程就叫做按需調頁。對換 對于虛擬內存頁面來說,總是要將其改動過的內容寫回到外存中,才能夠將其丟棄。一個被更改過的內存頁面,但還沒有將其內容寫到外存中,就稱之為“臟頁面”。在換入頁面時,首先考慮的肯定是將“干凈的”頁面直接丟棄,然后將外存數據寫進來,因為這樣不會破壞數據的
26、完整性。然而這是一個矛盾,內存調用者希望盡可能少地進行外存的刷新,這個結果造成內存中“臟頁面”不斷增加,而換入程序又希望盡可能多一些“干凈”頁面,以便使它們可以很方便地將數據調入。于是,收拾垃圾的工作就由一個被稱作“對換”(swap)的程序來完成。Linux中存儲器管理的相關概念及實現 伙伴算法Linux的伙伴算法把所有的空閑頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面。工作原理:如果要求要求分配一個大小為M個頁面的塊,伙伴算法會先到與要求分配的M個頁面大小最接近的空閑塊鏈表中查找,看是否有這樣的一個空閑塊。如果有,就直接分配;如果沒有,該算法就會到下一個更大的空閑塊鏈表中查找一個空閑
27、塊,如果有,就將該空閑塊分為兩等份,一份分配出去,另一份就掛入下一級的空閑塊鏈表中;如果沒有,就繼續向更大的空閑塊鏈表中查找,直到查找完所有更大的空閑塊鏈表都沒找到空閑塊為止(空閑塊鏈表最大為512個頁面),如果沒有的就放棄分配,并發出出錯信息。以上過程的逆過程就是塊的釋放過程,這也是該算法名字的來由。滿足以下條件的兩個塊稱為伙伴:(1)兩個塊的大小相同;(2)兩個塊的物理地址連續。 slab Slab是Linux操作系統的一種內存分配機制。Slab中引入了對象這個概念,所謂對象就是存放一組數據結構的內存區,其方法就是構造或析構函數,構造函數用于初始化數據結構所在的內存區,而析構函數收回相應的
28、內存區。 實際上,Linux中對Slab分配模式有所改進,它對內存區的處理并不需要進行初始化或回收。出于效率的考慮,Linux并不調用對象的構造或析構函數,而是把指向這兩個函數的指針都置為空。 Linux中引入slab的豐要目的是為了減少對伙伴算法的調用次數。緩沖區就是主存中的一片區域,把這片區域劃分為多個塊,每塊就是一個Slab,每個Slab由一個或多個頁面組成,每個Slab中存放的就是對象。對于小對象,就把slab的描述結構slab_t放在該slab中;對于大對象,則把slab結構游離出來,集中存放。關于slab中的著色區再給予具體描述。緩沖區每個緩沖區還有一個輪轉鎖(spinlock),
29、在對鏈表進行修改時用這個輪轉鎖進行同步。緩沖區只有在一下兩個條件都成立的的時候才能分配到Slab:(1)已發出個分配新對象的請求;(2)緩沖區不包含任何空閑對象。在內核中當初始化開銷不大的數據結構可以合用一個通用的緩沖區。地址映射機制 顧名思義地址映射就是建立幾種存儲媒介(內存,輔存,虛存)間的關聯,完成地址間的相互轉換,它既包括磁盤文件到虛擬內存的映射,也包括虛擬內存到物理內存的映射。進程的虛擬空間堆棧區位于進程虛擬空間的頂部,運行時由頂向下延伸。數據和代碼段位于虛擬空間的底部,運行時不向上延伸。中間的空洞是進程在運行時可以動態分配的空間(也叫動態內存)。 頁故障的產生 (1)一是程序出現錯
30、誤 (2)另一種情況是,虛擬地址有效,但其所對應的也當前不在物理內存中,即缺頁錯誤 (3)最后一種情況是,要訪問的虛擬地址被寫保護,即保護錯誤 交換機制 當物理內存出現不足時,Linux內存管理子系統需要釋放部分物理內存頁面。這一任務由內核的交換守護進程kswapd完成,該內核守護進程實際是一個內核線程,它在內核初始化時啟動,并周期地運行。它的任務就是保證系統中具有足夠的空閑頁面,從而使內存管理子系統能夠有效運行。頁面交換策略:策略一:需要時才交換策略二:系統空閑時交換策略三:換出但不立即釋放策略四:把頁面換出推遲到不能再推遲為止Linux中新頁框的分配方案請求調頁(demand paging
31、):是在類UNIX操作系統中使用較為普遍的一種動態內存分配技術。所謂動態內存分配技術就是指進程運行所需要的頁框不是一開始就全部分配給進程,而是當內核執行進程的一個指令所需的頁面不在內存時,再由CPU的控制單元引起一個缺頁異常,這時再由異常處理程序調入內存。寫時拷貝(copy_on_write):把一個頁面標記為只讀,而把代表它的VMA標記為可寫。因此任何對頁面的寫操作都會造成頁面寫訪問異常,同樣會引起缺頁中斷。 緩沖區高速緩存 緩沖區高速緩存由設備標識號和塊標號索引,因此可以快速找出數據塊。緩沖區高速緩存的大小可以變化。當需要新緩沖區而現在又沒有可用的緩沖區時,就按需分配頁面。 刷新機制 采取
32、的解決辦法是為計算機裝備一個不需要經過頁表就能把虛擬地址映射成物理地址的小的硬件設備,這個設備叫做TLB(翻譯后援存儲器,Translation Lookside Buffer),有時也叫做相聯存儲器(Associative Memov),它通常在MMU內部,條目的數量較少。每一個TLB寄存器的每個條目包含一個頁面的信息:有效位、虛頁面號、修改位、保護碼和頁面所在的物理頁面號,它們和頁面表中的表項一一對應。在Linux中刷新機制(包括TLB的刷新和緩存的刷新)主要完成以下兩項工作:(1)保證在任何時刻內存管理硬件所看到的進程的內核映射與內核頁表一致。(2)如果負責內存管理的內核代碼對用戶進程頁
33、進行了修改,那么用戶進程在被允許繼續執行前必須在緩存中看到正確的數據。5.2.5 文件系統文件系統是對一個存儲設備上的數據和元數據進行組織的機制,Linux文件系統接口為分層的體系結構,從而將用戶接口層、文件系統實現和操作存儲設備的驅動程序分隔開。Linux操作系統下的文件系統結構 虛擬文件系統VFS是物理文件系統與服務之間的一個接口層,對用戶程序隱去各種不同文件系統的實現細節,為用戶程序提供一個統一、抽象、虛擬的文件系統界面。VFS的功能包括:記錄可用的文件系統的類型;將設備同對應的文件系統聯系起來;處理一些面向文件的通用操作。嵌入式文件系統存儲Linux啟動時,第一個必須掛載的是根文件系統
34、,若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。啟動之后可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。不同的文件系統類型有不同的特點,因而根據存儲設備的硬件特性、系統需求等有不同的應用場合。在嵌入式Linux應用中,主要的存儲設備為RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設備的文件系統類型包括:jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。嵌入式文件系統(1)ext2、ext3文件系統(2)基于FLASH的文件系統 jffs2;yaffs;Cramfs ;Ro
35、mfs (3)基于RAM的文件系統Ramdisk ;ramfs/tmpfs(4)網絡文件系統NFS (Network File System)文件系統的目錄結構Linux的目錄結構樹型目錄結構dir1/-dir2/-file12|-dir3/-|-dir4|.根目錄組織/-root/:超級用戶目錄 包括桌面管理等 |-home/:用戶目錄 包括用戶信息等 |-bin/:執行目錄可執行文件常用命令 |-sbin/:執行目錄不提供給用戶使用的命令 |-boot/:引導目錄引導系統使用的文件 |-etc/:配置目錄 系統配置時使用 |-dev/:設備目錄 通過它訪問外設 |-mnt/:安裝目錄 管理
36、員設備臨時安裝點 |-opt/:安裝目錄 管理員軟件包放置點 |-lib/:庫目錄 命令執行時使用 |-usr/:共享目錄 所有用戶的共享文件|-var/:數據目錄 系統運行時要修改數據 |-tmp/:數據目錄 系統運行時要修改數據 |-proc/:虛擬目錄 文件系統內存產生|-lost+found/:空目錄 5.2.6 設備管理設備管理是操作系統諸多管理中最復雜的部分。與Unix系統一樣,Linux系統采用設備文件統一管理硬件設備,從而將硬件設備的特性及管理細節對用戶隱藏起來,實現用戶程序與設備無關性。設備分類 按設備的所屬關系可以將I/O設備分為以下兩類:(1)系統設備(2)用戶設備按設備
37、的信息交換的單位可將I/O設備分為以下兩類:(1)字符設備(2)塊設備按設備的共享屬性可將I/O設備分為以下三類:(1)獨占設備(2)共享設備(3)虛擬設備根據設備的用途,可以把設備分為存儲設備與輸入/輸出設備兩大類。設備管理的任務 (1)選擇和分配I/O設備以便進行數據傳輸操作。(2)控制I/O設備和CPU(或內存)之間交換數據。(3)為用戶提供一個友好的透明接口,把用戶和設備硬件特性分開,使得用戶在編制應用程序時不必涉及具體設備,由系統按用戶的要求來對設備的工作進行控制。另外,這個接口還為新增加的用戶設備提供一個和系統核心相連接的入口,以便用戶開發新的設備管理程序。(4)提高設備和設備之間
38、、CPU和設備之間以及進程和進程之間的并行操作程度,以使操作系統獲得最佳效率。設備管理程序一般要提供的功能:(1)提供和進程管理系統的接口(2)進行設備分配(3)實現設備和設備、設備和CPU等之間的并行操作(4)進行緩沖管理(5)設備控制與驅動設備控制器 設備控制器是CPU與I/O設備之間的接口,它接收從CPU發來的命令并去控制I/O設備工作。 大多數設備控制器都由以下三部分組成。(1)設備控制器與處理機的接口(2)設備控制器與設備的接口(3)I/O邏輯I/O通道 設置I/O通道的目的是使一些原來由CPU處理的I/O任務轉由通道來承擔,從而把CPU從繁雜的I/O任務中解脫出來。通道有兩種基本類
39、型:選擇通道和多路通道。選擇通道又稱高速通道,在物理上它可以連接多個設備,但是這些設備不能同時工作,在某一段時間內通道只能選擇一個設備進行工作。 多路通道又分為數組多路通道和字節多路通道。數組多路通道的基本思想是指,當某設備進行數據傳送時,通道只為該設備服務;當設備在執行尋址等控制性動作時,通道暫時斷開與這個設備的連接,掛起該設備的通道程序,去為其他設備服務,即執行其他設備的通道程序。 字節多路通道主要用于連接大量的低速設備,因此通道在傳送兩個字節之間有很多空閑時間,字節多路通道正是利用這個空閑時間為其他設備服務。 Linux的I/O控制 Linux的I/O控制方式常用的有三種:查詢等待方式、
40、中斷方式和DMA(內存直接存取)方式。 (1)查詢等待方式查詢等待方式又稱輪詢方式(polling mode)。對于不支持中斷方式的機器只能采用這種方式來控制I/O過程,所以Linux中也配備了查詢等待方式。(2)中斷方式在硬件支持中斷的情況下,驅動程序可以使用中斷方式控制I/O過程。對I/O過程控制使用的中斷是硬件中斷,當某個設備需要服務時就向CPU發出一個中斷脈沖信號,CPU接收到信號后根據中斷請求號IRQ啟動中斷服務例程。(3)DMA方式內存直接存取技術是指數據在內存與I/O設備間自己接進行成塊傳輸。DMA有兩個技術特征:首先是直接傳送,其次是塊傳送。所謂直接傳送,即在內存與I/O設備間
41、傳送一個數據庫的過程中,不需要CPU的任何中間干涉,只需要CPU在過程開始時向設備發出“傳送塊數據”的命令,然后通過中斷來得知過程是否結束和下次操作是否就緒。一個完整的DMA過程包括初始化、DMA請求、DMA響應、DMA傳輸、DMA結束5個階段。(4) 通道方式也是一種I/O控制方式,但是這種方式是利用一個獨立于CPU以外的、專門管理I/O的處理機來控制輸入和輸出,它控制設備與內存直接進行數據交換,有著自己的通道指令,這些通道指令由CPU啟動,并在結束時向CPU發出中斷信號。 設備驅動 設備驅動程序的處理過程:(1)將抽象要求轉換為具體要求(2)檢查I/O請求的合法性(3)讀出和檢查設備的狀態
42、(4)傳送必要的參數(5)工作方式的設置(6)啟動I/O設備Linux設備管理的設備 在Linux系統中,硬件設備分為兩種,即塊設備和字符設備。1)特別文件用戶是通過文件系統與設備接口的,所有設備都作為特別文件,從而在管理上就具有一些共性。設備驅動的分層結構 對于一般文件(即磁盤文件),要進行空間的映射:從普通文件的邏輯空間映射到設備的邏輯空間,然后在設備驅動層做進一步映射:從設備的邏輯空間映射到物理空間(即設備的物理地址空間),進而驅動底層物理設備工作。對于設備文件,則文件的邏輯空間通常就等價于設備的邏輯空間,然后從設備的邏輯空間映射到設備的物理空間,再驅動底層的物理設備工作。2)設備驅動程
43、序和內核之間的接口Linux系統和設備驅動程序之間使用標準的交互接口。無論是字符設備、塊設備還是網絡設備的驅動程序,當內核請求它們提供服務時,都使用同樣的接口。 在應用程序界面上,利用內核提供的系統調用來實現可安裝模塊的動態安裝和拆卸。但通常情況下,用戶是利用系統提供的插入模塊工具和移走模塊工具來裝卸可安裝模塊。插入模塊的工作主要如下:(1)打開要安裝的模塊,把它讀到用戶空間。這種“模塊”就是經過編譯但尚未連接的.o文件。(2)必須把模塊內涉及對外訪問的符號(函數名或變量名)連接到內核,即把這些符號在內核映像中的地址填入該模塊需要訪問這些符號的指令及數據結構中。(3)在內核創建一個module
44、數據結構,并申請所需的系統空間。(4)最后,把用戶空間中完成了連接的模塊映像裝入內核空間,并在內核中“登記”本模塊的有關數據結構(如file_operations結構),其中有指向執行相關操作函數的指針。 3)字符設備在Linux 系統中,打印機、終端等字符設備都作為字符特別文件出現在用戶面前。用戶對字符設備的使用就和存取普通文件一樣。在應用程序中,使用標準的系統調用來打 開、關閉、讀寫字符設備。當字符設備初始化時,其設備驅動程序被添加到由device_struct結構組成的chrdevs結構數組中。device_struct 結構由兩項構成,一個是指向已登記的設備驅動程序名的指針,另一個是指
45、向file_operations結構的指針。而file_operations結 構的成分幾乎全是函數指針,分別指向實現文件操作的入口函數。設備的主設備號用來對chrdevs數組進行索引。4)塊設備對塊設備的存取和對文件的存取方式一樣,其實現機制也和字符設備使用的機制相同。Linux系統中有一個名為blkdevs的結構數組,它描述了一系列在系統中登記的塊設備。 數組blkdevs也使用設備的主設備號作為索引,其元素類型是device_struct結構。該結構中包括指向已登記的設備驅動程序名的指針和指向block_device_operations結構的指針。Linux字符設備的驅動 主要通過介紹
46、字符設備scull(Simple Character Utility for Loading Localities,區域裝載的簡單字符工具)的驅動程序編寫,來學習Linux設備驅動的基本知識。scull可以為真正的設備驅動程序提供樣板。1)主設備號和次設備號2)一些重要的數據結構3)字符設備的注冊4)scull模型的內存使用5)open和release 6)read和write 7)對于scull設備有時需要用到scull pipe設備,scull pipe設備是針對一片內存,實現了一個circular buffer(循環緩沖) 5.2.7 嵌入式Linux引導過程在嵌入式系統中,首先要考慮的
47、就是啟動問題,即系統如何告知CPU啟動位置以及啟動方法。一般來說,嵌入式系統會提供多種啟動方法。具備Flash ROM的系統具備有Flash啟動的方式,也有直接從RAM中啟動的方法。這些啟動部分的工作主要由一個被稱為bootloader的程序完成。 運行Linux的目標機在重新啟動后要經過幾個步驟才能出現系統提示符。最初的步驟是與微處理器硬件相關的。內核本身包含了微處理器體系結構相關的初始化代碼,這些代碼首先被執行。該初始化代碼為保護模式的運算配置微處理器的寄存器,然后調用微處理器體系結構無關的稱為start_kernel的內核開始點。此后,內核的引導過程對于所有微處理器體系結構都是完全相同的
48、。 Linux的引導過程包括下列步驟: 1)處理器重新啟動之后,執行ROM啟動代碼。2)ROM啟動代碼初始化CPU、內存控制器以及片上設備,然后配置存儲映射。ROM啟動代碼隨后執行一個引導裝載程序bootloader。3)引導裝載程序將Linux內核從Flash或者TFTP服務器解壓到RAM中。然后跳到內存的第一天指令處執行。內核首先配置微處理器的寄存器,然后調用start_kernal,它是體系結構無關的開始點。4)內核初始化告訴緩存和各種硬件設備。5)內核掛裝根文件系統。6)內核執行init進程。7)正在執行的init進程裝載運行時的共享庫。8)init讀取其配置文件/etc/initta
49、b并執行執行腳本。一般而言,init執行一個啟動腳本rc.d/rcs,該腳本配置并啟動網絡和其他系統服務。9)init進入運行級別,在該級別下可以執行系統任務或開始登陸進程,最后進入用戶會話階段。 嵌入式Linux引導過程中概念簡介1)bootloader程序bootloader的作用: (1)初始化處理器。(2)初始化必備的硬件 。(3)下載系統映像。 (4)初始化操作系統并準備運行。 2)嵌入式系統內核對于使用操作系統的嵌入式系統而言,操作系統一般是以內核映像的形式下載到目標系統中。以Linux為例子,在系統開發完成之后,將整個操作系統部分做成壓縮或者沒有壓縮過的內核映像文件,與文件系統一
50、起傳送到目標系統中。通過bootloader指定地址運行Linux內核,啟動嵌入式Linux系統;然后再通過操作系統解開文件系統,運行應用程序。在內核中通常必須的部件是進程管理、進程間通信、內存管理部分,其他部件,如文件系統、驅動程序、網絡協議等,都可以配置,并以相關的方式實現。 3)根文件系統在嵌入式系統中的“硬盤”概念一般都以ramdisk的方式實現。因為Falsh這樣斷電后還能繼續保存數據的設備,其價格相對昂貴;然而系統中又無法使用像硬盤這樣的大型設備,因此,需要長久使用的文件系統數據,尤其是應用程序的可執行文件、運行庫等,運行時都放在RAM中。常用的方式就是從RAM中劃分出一塊內存虛擬
51、成“硬盤”,對它的操作與對永久存儲器操作一樣。在Linux中就存在這樣的設備,稱為ramdisk,一般使用的設備文件是/dev/ram0 。當然,根文件系統不一定使用ramdisk實現,還可以用NFS方式通過網絡安裝根文件系統。這也是在系統內核中實現的。操作系統啟動之后直接通過內核中NFS相關代碼對處于網絡上的NFS文件系統進行安裝。文件系統啟動的方式可以在內核代碼中編寫或者啟動時通過參數指定。4)重定位和下載生成了目標平臺需要的image文件之后,就可以通過相應的工具與目標板上的bootloader程序進行通信。可以使用bootloader提供的,或者通用的終端工具與目標板相連接。一般在目標
52、板上使用串口,通過主機終端工具與目標板通信。bootloader中提供下載等控制命令,完成嵌入式系統正式在目標板上運行之前對目標板的控制任務。bootloader指定image文件下載的位置。在下載結束之后,使用bootloader提供的運行命令,從指定地址開始運行嵌入式系統軟件。5)Linux內核源代碼中的匯編語言代碼用匯編語言編寫核心代碼中的部分代碼出于以下幾個方面的考慮:操作系統內核中的底層程序直接與硬件打交道,需要用到一些專用的指令,而這些指令在C語言中并無相對應的語言成分。因此,這些底層的操作需要用匯編語言來編寫。CPU中的一些對寄存器的操作也是一樣,例如要設置一個段寄存器時,也只好
53、用匯編語言來編寫。CPU中的一些特殊指定也沒有相對應的C語言成分,例如關中斷、開中斷等。此外,在同一體系系統的不同CPU芯片中,特別是新開發出來的芯片中,往往會增加一些新的指令,對這些指令的使用也得用匯編語言。用匯編語言編寫的程序,在算法和數據結構相同的條件下,常比使用高級語言編寫的效率要高。在 在某些特殊的場合,一段程序的空間效率也會顯得非常重要,這段程序的大小多出一個字節也不允許,所以一般使用匯編語言編寫。 嵌入式Linux引導過程 一個最基本的嵌入式Linux系統從軟件的角度可以分為四個層次:(1)導加載程序bootloader;(2)Linux內核;(3)文件系統;(4)用戶應用程序。嵌入式Linux引導過程(1)理器重新啟動后,首先執行啟動代碼以初始化內存控制器以及片上設備,然后配置存儲映射。(2)Bootloader把內核從Flash等固態存儲設備加載到RAM然后跳轉到內核的第一條
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雙方吵架調解協議書
- 搶救戰場傷員協議書
- 小學放假安全協議書
- 消防免責協議書范本
- 拍攝內容保密協議書
- 加工付款協議書范本
- 投錢分紅協議書范本
- 拍賣議價協議書模板
- 美國電車轉讓協議書
- 人工誤傷賠償協議書
- 2020湖南對口升學英語真題(附答案)
- GB/T 26278-2010輪胎規格替換指南
- GB 16246-1996車間空氣中硫酸二甲酯衛生標準
- 幽門螺桿菌檢測-課件
- 兒童抑郁量表CDI
- 心電監護操作評分標準
- GB∕T 37244-2018 質子交換膜燃料電池汽車用燃料 氫氣
- JJG 700 -2016氣相色譜儀檢定規程-(高清現行)
- API SPEC 5DP-2020鉆桿規范
- (完整版)有機太陽能電池課件2
- 電梯使用單位電梯使用和運行安全管理制度
評論
0/150
提交評論