?? 嵌入式操作系統的內核研究.txt
字號:
嵌入式操作系統的內核研究
引言:
嵌入式系統被定義為:以應用為中心,以計算機技術為基礎,軟件硬件可裁減,適應應
用系統對功能,可靠性,成本,體積,功耗等嚴格要求的專用計算機系統。隨著現代計算機
技術的飛速發展和互聯網技術的廣泛應用,嵌入式系統扮演了越來越重要的角色,被廣泛應
用于信息電器、移動計算機設備、網絡設備和工控仿真等領域。從八十年代起,國際上就有
一些IT 組織、公司,開始進行商用嵌入式系統的研發。這其中涌現了一些著名的嵌入式系
統,如windriversystem 公司的VxWorks 就是實時嵌入式操作系統的代表。但是商用產品的
造價十分昂貴,而uc/os-II 操作系統,是當前得到廣泛應用免費且公開源碼的嵌入式操作系
統。而包括這兩個系統在內的絕大多數的嵌入式操作系統都采取了高性能的微內核設計。
第一章內核概述
1.1. 內核定義
在傳統的操作系統結構中,通常把操作系統的全部或者大部分功能都作為操作系統的內
核,它們的層次主要表示為調用關系,但是現代操作系統的一個突出特點是把把更多的代碼
放到更高的層次:用戶層中去。盡最大努力把大部份操作系統成分和功能放到用戶模式去運
行,希望留下一個盡量小的內核,他們完成操作系統最基本的核心功能,這稱之為內核技術。
1.2. 內核的優點
很多系統都采用內核,一個顯著的特點就是安全性和可靠性。在安全性中有最小特權原
注:) 本文得到國家“863”項目高性能的以太網交換機核心芯片開發的資助,項目主題
為超大規模集成電路重大專項。項目編號是2002BA906A21-08。
深層次的技術競爭體現在核心芯片和操作系統上。為此,863 專家組提出了開發高性能
以太網交換機核心芯片的課題,其目標是研究和開發一款高性能的以太網交換機核心單元,
其水平處于國際前沿,為IT 高技術領域的民族品牌提供支持,對保障我國信息領域的安全
具有重要意義。
則,而操作系統內核具有很大的特權,它可以訪問所以主存;它使用固定頁面不可被換出;
它的執行不可被中斷,不可被搶占。如果使用大內核就會使得許多操作系統功能不必要的擁
有這些特點,使得安全性降低,也使得整個系統的性能下降。
1.3 內核的結構和實現
內核結構技術是把那些最本質,最基本的功能留在內核中,但這個說法本身就很模糊。
也許換個角度就更好理解了:內核與客戶/服務器模式是緊密相連的技術。每一個操作系統
功能均以單獨的服務器進程形式存在。他與客戶的應用進程都存在于內核之外。他們以發消
息的方式通過內核向服務器進程提出服務請求。服務器進程在處理服務請求后,也以發消息
的形式通過內核把結果返回客戶進程。所以內核所作的事情就是處理客戶與服務器之間的通
訊,檢查消息的合法性,并傳送他們。實現內核的關鍵是實現機制和策略分離。他就是把必
須訪問硬件和內核數據結構的實現機制放在內核之中,而把實現該功能的算法和策略留給用
戶態的服務進程。
第二章:VxWorks 內核
VxWorks 的內核被稱作 wind ,包括多任務調度(采用優先級搶占方式),任務間的
同步和進程間通信機制以及中斷處理,看門狗和內存管理機制。一個多任務環境允許實時應
用程序以一套獨立任務的方式構筑,每個任務擁有獨立的執行線程和它自己的一套系統資
源。進程間通信機制使得這些任務的行為同步、協調。
2.1 任務調度
Wind 的多任務的數目并沒有明顯的限制,總共有256 個優先級。wind 使用中斷驅動和
優先級的方式。它縮短了上下文轉換的時間開銷和中斷的時延。在 VxWorks 中,任何例程
都可以被啟動為一個單獨的任務,擁有它自己的上下文和堆棧。還有一些其它的任務機制可
以使任務掛起、繼續、刪除、延時或改變優先級。任務調度的系統調用有:建立任務
taskSpawn() ;刪除任務taskDelete() ;掛起任務taskSuspend() ;恢復任務taskResume() 等等。
2.2 信號量管理
wind 核提供信號量作為任務間同步和互斥的機制。在 wind 核中有幾種類型的信號
量,它們分別針對不同的應用需求:
● 二進制信號量:使用最快捷,最廣泛,主要用于同步或互斥。
● 互斥信號量:主要用于優先級繼承,安全刪除和回溯。
● 計數信號量:用于資源的數目較多的情況。
所有的這些信號量是快速和高效的,它們除了被應用在開發設計過程中外,還被廣泛地應用
在 VxWorks 高層應用系統中。信號量的系統調用有:建立二進制信號量:semBCreate();
建立互斥信號量:semMcreat() 等等。
2.3 任務間通信
除了信號量機制可用于任務間同步與通信,wind 核還提供了諸如消息隊列、管道、等
機制。消息隊列是較為復雜的一種通訊機制,它可以使一個任務或者中斷服務子程序向另一
個任務發送以指針方式定義的變量。本文將主要討論消息隊列機制,消息隊列的系統調用有:
創建消息隊列:msgQCreate();刪除消息隊列:msgQDelete();向消息隊列發消息:msgQSend();
向消息隊列接收消息:msgQReceive() 等等。
2.4 內存管理
在Vxworks 中是使用ANSI C 的函數malloc() 和free()動態的分配和釋放內存。但是在嵌
入實時操作系統中調用這兩個函數卻是危險的,當多次調用它們時,會把原來很大的一塊連
續內存區域逐漸分割成許多非常小而彼此不相鄰的內存塊,即內存碎片。使得程序后來連一
塊非常小的連續內存也分配不到。在下文的uc/os-II 操作系統中,我們將看到一種改進的做
法。內存管理的系統調用有:分配一個內存塊:malloc() ;釋放一個內存塊:free()等等。
第三章:uc/os-II 內核
VxWorks 是一個商用的操作系統,他的源碼并不公開,為了加深對內核的理解,我選
取了當前得到廣泛應用的免費且公開源碼的嵌入式操作系統uc/os-II 作為對照。在這兩種操
作系統的內核比較過程中學習。
uc/os-II 操作系統本身實際上就是一個內核,其提供任務調度、時間管理、任務間同步
與通信、內存管理和中斷服務等功能。他適合小型控制系統,具有執行效率高、占用空間小、
實時性能優良和可擴展性強等特點,最小內核可編譯至2k。
3.1 任務調度
uc/os-II 中最多可以支持64 個任務,分別對應優先級0~63 ,其中0 為最高優先級。調
度工作的內容可以分為兩部分:最高優先級任務的尋找和任務切換。其最高優先級任務的尋
找是通過建立就緒任務表來實現的。uc/os-II 中的每一個任務都有獨立的堆棧空間,并有一
個稱為任務控制塊TCB(task control block) 的數據結構,其中第一個成員變量就是保存的任務
堆棧指針。在進行任務調度時首先用變量 ostcbhighrdy 記錄當前最高級就緒任務的地址,然
后調用os_task_sw() 函數來進行任務切換,這個函數是硬件相關的,它的大部分代碼要用匯
編語言完成,其主要功能就是保存現場到TCB 塊中,以便以后再次運行。任務調度的系統
調用有:建立任務OSTaskCreat() ;刪除任務OSTaskDel() ;掛起任務OSTaskSuspend() ;恢
復任務OSTaskResume() ;等等。
3.2 信號量管理
在uc/os-II 中,建立信號量的函數OSSemCreate() 需要輸入一個參數cnt,如果賦值1,
就相當于二進制信號量,如果賦值n,就可作為計數信號量使用。
很多人對二進制信號量,計數信號量和互斥信號量的區別不太清楚,其實通過看uc/os-II
的源碼,就能很好的理解這種差別。在uc/os-II 中,信號量以及下文中的消息隊列的實現都
是通過一個基本的數據結構:事件控制塊(ECB)實現的。其成員OSEventType 是一個標志,
記錄了這個控制塊是用于信號量還是互斥信號量,或其它事件。另一個重要成員是
OSEventCnt ,這三種信號量的區別就主要體現在它的身上,二進制信號量和計數信號量在
實現上并沒有什么不同,他們都是通過函數OSSemCreate() 建立的,就是把參數cnt 直接付
給OSEventCnt ,在等待信號量函數中就會遞減OSEventCnt ,為0 則把當前任務打標為睡眠
狀態,隨后執行任務調度函數。
相對而言,互斥信號量就要復雜一些,因為它需要解決處理互斥時出現的優先級反轉的
問題。于是就要把沒有被占有的,略高于最高優先級任務的優先級,保留給所謂“優先級繼
承優先級”(PIP),而這個PIP 就是保存在OSEventCnt 的高8 位的,其低8 位在資源無任務
占用時為0xFF, 有資源占用時為占用它的任務的優先級。在函數等待一個互斥型信號量時,
就會提取PIP 和占用資源的任務的優先級,如果占用資源的任務的優先級比當前任務的優先
級要低(數值大),就需要提升占用資源的任務的優先級為PIP ,從而讓占用資源的任務從速
釋放資源。建立信號量:OSSemCreate() ;建立互斥信號量:OSSemMCreat() 等等。
3.3 任務間同步與通信
消息隊列是uc/os-II中的一種任務間同步與通信機制。因具體的應用有所不同,每個指
針指向的數據結構變量也有所不同。為了使用uc/os-II 的消息隊列功能,需要在OS_CFG.H
文件中,將OS_Q_EN 常數設置為1,并且通過常數OS_MAX_QS 來決定μC/OS-II支持的
最多消息隊列數。
消息隊列最根本的部分是一個環形緩沖區,在調用創建消息隊列的函數時需要賦給他兩
個參數:指向消息數組的指針和數組的大小。例如:void *MymessageQ[SIZE]. 在創建消息
隊列完畢時,這個指針數組就被初始化為一個環形的緩沖區,并且返回相應的消息隊列的句
柄。任務間同步與通信的系統調用有:創建消息隊列:OSMboxCreate() ;刪除消息隊列:
OSMboxDel() ;向消息隊列發消息:OSMboxPost() ;向消息隊列接收消息:OSMboxAccept()
等等。
3.4 內存管理
為了避免內存碎片的問題,uc/os-II 對malloc() 和free()函數做了改進,其基本思想是:
把連續的大塊內存按分區來管理。每個分區包含整數個大小相同的內存塊,這樣,每次分配
和釋放的內存塊就是固定大小的了。
首先,在OS_CFG.H 文件中有一個開關OS_MEM_QUERY_EN, 決定使用內存管理與否。
然后,使用所謂內存控制塊(MCB )的數據結構跟蹤每一個內存分區,在MCB 中的成員
OSMemFreeList 把本內存分區中所有可用的內存塊鏈接成一個單向鏈表。成員
OSMemBlkSize 和OSMemNBlks ,記錄內存分區的內存塊的大小和數量(他們的乘積當然就
是分配的內存區的大小。) MCB 的初始化工作由建立內存分區的函數OSMemCreate() 來完
成,它的返回值就是一個指向這個MCB 的指針。這樣當調用函數OSMemGet() 和OSMemPut()
分配和釋放內存時實際上就是更新由OSMemFreeList 鏈接的鏈表。分配內存就是從鏈表中
取出內存塊,釋放內存就是把內存塊還回鏈表中。內存管理的系統調用有:建立內存分區:
OSMemCreate() ;分配一個內存塊:OSMemGet() ;釋放一個內存塊:OSMemPut() 等等。
結束語:
與一般的計算機應用相比,嵌入式應用系統往往是要求具有高速處理,配置專一,結構
緊湊和堅固可靠等特點的實時系統,一個正確但遲到的結果同一個錯誤的結果沒有什么本質
不同。更重要的是:嵌入式系統是成本敏感的,能否充分利用現有資源,降低成本對項目本
身常常是決定性的。只有對嵌入式操作系統的內核有深刻的了解,對系統調用函數有充分的
研究,才能開發出穩定,高效的嵌入式系統軟件。
參考文獻:
【1.】Jean J.Labrosse(邵貝貝譯) 《嵌入式實時操作系統uc/os-II(第2 版)》
【2.】王學龍《嵌入式VxWorks 系統開發與應用》
【3.】屠祁,屠立德《操作系統基礎》
【4.】李垣陵《UC/OS 和UCLinux 比較》
作者簡介:
沈勝慶(1977-),男(漢族),湖北武漢人,武漢郵電科學研究院,碩士研究生,主要研究
方向:IP 技術和嵌入式系統軟件。導師:余少華教授,博士生導師。
注:不要稿費。通訊地址:武漢市郵科院路88 號烽火網絡有限責任公司。研發部,沈勝慶。
評價:雜志社的審稿非常快,比起其他地方動則3 個月好多了。如果收到投稿郵件就可以自
動回復發稿者就更好了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -