Windows 程序员 mysql php java 开源 Firefox linux wordpress 微软 apache nginx Android Ubuntu google centos shell 云计算 Python 编程

基於ARM的嵌入式linux系統設計

Abstract: This paper simply introduces the character and basic architecture about processor of ARM, and emphasizes the key technologies of embedded Linux based on ARM, including bootloader、linux kernel、file system、user application. For design each part of linux system, the paper gives a clearly analysis, summarizing the character embed linux system and the advantage of embed linux system among all embed system OS.
 
Key words:  ARM   linux   bootloader   kernel   file system
 
1、引言
隨著科技的發展,嵌入式系統已經是無處不在,嵌入式系統在包括工業自動化、國防、運輸和航天領域、消費電子等領域得到了非常廣泛的應用。例如神州飛船和長征火箭中肯定有很多嵌入式系統,導彈的制導系統也是嵌入式系統,高檔汽車中也有多達幾十個嵌入式系統。基於ARM的嵌入式系統更是發展迅猛,ARM在嵌入式處理器中處於領先地位,在各個行業都有著良好的應用。基於ARM的嵌入式linux系統近年也得到了巨大的發展,linux系統已經成為三大主流OS之一,是最有發展前景的嵌入式OS。 一個嵌入式 Linux 系統從軟件的角度看通常可以分為四個層次:引導加載程序、 Linux 內核、 文件系統、 用戶應用程序。
 
2、ARM 介紹
ARM(Advanced RISC Machines),既可以認為是一個公司的名字,也可以認為是對一類微處理器的通稱,還可以認為是一種技術的名字。1991年ARM公司成立於英國劍橋,主要出售芯片設計技術的授權。目前,采用ARM技術知識產權(ip)核的微處理器,即我們通常所說的ARM微處理器,已遍及工業控制、消費類電子產品、通信系統、網絡系統、無線系統等各類產品市場,基於ARM技術的微處理器應用約占據了32位RISC微處理器75%以上的市場份額,ARM技術正在逐步滲入到我們生活的各個方面。
采用RISC架構的ARM微處理器一般具有如下特點,體積小、低功耗、低成本、高性能;支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件;大量使用寄存器,指令執行速度更快;大多數數據操作都在寄存器中完成;尋址方式靈活簡單,執行效率高;指令長度固定。
普通ARM處理器內核結構如圖一所示:
                   圖1、ARM普通處理器內核結構圖
 
3、嵌入式linux系統
嵌入式Linux(Embedded Linux)是指對Linux經過裁剪小型化後,可固化在存儲器或單片機中,應用於特定嵌入式場合的專用Linux操作系統。嵌入式Linux的開發和研究已經成為目前操作系統領域的一個熱點。Linux 操作系統是一種性能優良、層次結構且內核完全開放、強大的網絡支持功能、具備一整套工具鏈、具有廣泛的硬件支持特性、源碼公開且被廣泛應用的免費操作系統,由於其體積小、可裁減、運行速度高、良好的網絡性能等優點,可以作為嵌入式操作系統。隨著2.6內核的發布,Linux向現有主流的RTOS提供商在嵌入式系統市場提出了巨大挑戰,例如VxWorks和WinCE,具有許多新特性,將成為更優秀的嵌入式操作系統。嵌入式Linux 的Boot Loader、內核的啟動參數、內核映像和根文件系統映像的固態存儲設備的典型空間分配結構圖如圖2:
圖2 固態存儲設備的典型空間分配結構
3.1、bootloader技術
    簡單地說,Boot Loader 就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。 通常,Boot Loader 是嚴重地依賴於硬件而實現的,特別是在嵌入式世界。Boot Loader 的操作模式 (Operation Mode)
大多數 Boot Loader 都包含兩種不同的操作模式:"啟動加載"模式和"下載"模式,這種區別僅對於開發人員才有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統,而並不存在所謂的啟動加載模式與下載工作模式的區別。
從操作系統的角度看,Boot Loader 的總目標就是正確地調用內核來執行。另外,由於 Boot Loader 的實現依賴於 CPU 的體系結構,因此大多數 Boot Loader 都分為 stage1 和 stage2 兩大部分。依賴於 CPU 體系結構的代碼,比如設備初始化代碼等,通常都放在 stage1 中,而且通常都用匯編語言來實現,以達到短小精悍的目的。而 stage2 則通常用C語言來實現,這樣可以實現給復雜的功能,而且代碼會具有更好的可讀性和可移植性。Boot Loader 的 stage1 通常包括以下步驟(以執行的先後順序):硬件設備初始化,為加載 Boot Loader 的 stage2 準備 RAM 空間,拷貝 Boot Loader 的 stage2 到 RAM 空間中,設置好堆棧,跳轉到 stage2 的 C 入口點。 Boot Loader 的 stage2 通常包括以下步驟(以執行的先後順序):初始化本階段要使用到的硬件設備, 檢測系統內存映射(memory map),將 kernel 映像和根文件系統映像從 flash 上讀到 RAM 空間中,為內核設置啟動參數,調用內核。
基本的硬件初始化包括:屏蔽所有的中斷。為中斷提供服務通常是 OS 設備驅動程序的責任,因此在 Boot Loader 的執行全過程中可以不必響應任何中斷。中斷屏蔽可以通過寫 CPU 的中斷屏蔽寄存器或狀態寄存器(比如 ARM 的 CPSR 寄存器)來完成。設置 CPU 的速度和時鐘頻率。RAM 初始化。包括正確地設置系統的內存控制器的功能寄存器以及各內存庫控制寄存器等。初始化 LED。典型地,通過 GPIO 來驅動 LED,其目的是表明系統的狀態是 OK 還是 Error。如果板子上沒有 LED,那麽也可以通過初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息來完成這一點。 關閉 CPU 內部指令/數據 cache。
為加載 stage2 準備 RAM 空間主要是分配1M大小空間給OS,再調用內核,最後把控制權交給OS。
 
3.2、linux系統內核
    linux系統內核的重要特點是可移植性,支持硬件平臺廣泛,在大多數的體系結構上都可以運行,可量測性,即可以運行在超級計算機上,也可以運行在很小的設備上,標準化和互用性,安全性,開發的源代碼使得代碼變得穩定,可靠性好,模塊化,運行時可以根據系統的需要加載程序,編程容易,還可以從網上找到很多學習的資料,網上linux社區也非常活躍;linux內核全部源代碼是遵守GPL軟件許可的免費軟件,這要求在發布linux軟件的時候免費開放源碼,linux有許多開放驅動程序可以使用,使得開發的時候不需要從頭寫起。
3.2.1 可搶占內核
  在先前的內核版本中(包括2.4內核)不允許搶占以核心態運行的任務(包括通過系統調用進入內核模式的用戶任務),只能等待它們自己主動釋放CPU。這樣必然導致一些重要任務延時以等待系統調用結束。一個內核任務可以被搶占,為的是讓重要的用戶應用程序可以繼續運行。這樣做最主要的優勢是極大地增強系統的用戶交互性。2.6內核並不是真正的RTOS(Real time Operation System),其在內核代碼中插入了搶占點,允許調度程序中止當前進程而調用更高優先級的進程,通過對搶占點的測試避免不合理的系統調用延時。2.6內核在一定程度上是可搶占的,比2.4內核具備更好的響應性。但也不是所有的內核代碼段都可以被搶占,可以鎖定內核代碼的關鍵部分,確保CPU的數據結構和狀態始終受到保護而不被搶占。
  軟件需要滿足最終時間限制與虛擬內存請求頁面調度之間是相互矛盾的。慢速的頁錯誤處理將會破壞系統的實時響應性,而2.6內核可以編譯無虛擬內存系統避免這個問題,這是解決問題的關鍵,但要求軟件設計者有足夠的內存來保證任務的執行。
3.2.2 有效的調度程序
  2.6版本的 Linux內核使用了由 Ingo Molnar開發的新的調度器算法,稱為O(1)算法,如圖1所示。它在高負載情況下執行得極其出色,並且當有很多處理器並行時也可以很好地擴展[2]。過去的調度程序需要查找整個ready task隊列,並且計算它們的重要性以決定下一步調用的task,需要的時間隨task數量而改變。O(1)算法則不再每次掃描所有的任務,當task就緒時被放入一個活動隊列中,調度程序每次從中調度適合的task,因而每次調度都是一個固定的時間。任務運行時分配一個時間片,當時間片結束,該任務將放棄處理器並根據其優先級轉到過期隊列中。活動隊列中任務全部調度結束後,兩個隊列指針互換,過期隊列成為當前隊列,調度程序繼續以簡單的算法調度當前隊列中的任務。這在多處理器的情況更能提高SMP的效率,平衡處理器的負載,避免進程在處理器間的跳躍。
3.2.3 同步原型與共享內存
  多進程應用程序需要共享內存和外設資源,為避免競爭采用了互斥的方法保證資源在同一時刻只被一個任務訪問。Linux內核用一個系統調用來決定一個線程阻塞或是繼續執行來實現互斥,在線程繼續執行時,這個費時的系統調用就沒有必要了。Linux2.6所支持的Fast User-Space Mutexes 可以從用戶空間檢測是不是需要阻塞線程,只在需要時執行系統調用終止線程。它同樣采用調度優先級來確定將要執行的進程[4]。 多處理器嵌入式系統各處理器之間需要共享內存,對稱多處理技術對內存訪問采用同等優先級,在很大程度上限制了系統的可量測性和處理效率。Linux2.6則提供了新的管理方法——NUMA(Non Uniform Memory Access)。NUMA根據處理器和內存的拓撲布局,在發生內存競爭時,給予不同處理器不同級別權限以解決內存搶占瓶頸,提高吞吐量。
3.2.4 POSIX線程及NPTL
  新的線程模型基於一個1:1的線程模型(一個內核線程對應一個用戶線程),包括內核對新的 NPTL(Native POSIX Threading Library)的支持,這是對以前內核線程方法的明顯改進。2.6內核同時還提供POSIX signals和POSIX high-resolution timers。POSIX signals不會丟失,並且可以攜帶線程間或處理器間的通信信息。嵌入式系統要求系統按時間表執行任務,POSIX timer可以提供1kHz的觸發器使這一切變得簡單,從而可以有效地控制進度。
3.2..5 微控制器的支持
  Linux2.6內核加入了多種微控制器的支持。無MMU的處理器以前只能利用一些改進的分支版本,如uClinux,而2.6內核已經將其整合進了新的內核中,開始支持多種流行的無MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300。Linux在無MMU控制器上仍舊支持多任務處理,但沒有內存保護功能。同時也加入了許多流行的控制器的支持,如S3C2410等。
 
3.3、linux文件系統
   Linux采用文件系統組織系統中的文件和設備,為設備和用戶程序提供統一接口,Linux 支持多種文件系統,如JFFS2、Ext2fs 、Cramfs等。
瑞典的 Axis Communications 開發了最初的 JFFS,Red Hat 的 David Woodhouse 對它進行了改進。 第二個版本,JFFS2,作為用於微型嵌入式設備的原始閃存芯片的實際文件系統而出現。JFFS2 文件系統是日誌結構化的,這意味著它基本上是一長列節點。每個節點包含有關文件的部分信息 ― 可能是文件的名稱、也許是一些數據。相對於 Ext2fs,           JFFS2 因為有以下這些 優點而在無盤嵌入式設備中越來越受歡迎:
JFFS2 在扇區級別上執行閃存擦除/寫/讀操作要比 Ext2 文件系統好。JFFS2 提供了比 Ext2fs 更好的崩潰/掉電安全保護。當需要更改少量數據時,Ext2 文件系統將整個扇區復制到內存(DRAM)中,在內存中合並新數據,並寫回整個扇區。這意味著為了更改單個字,必須對整個扇區(64 KB)執行讀/擦除/寫例程 ― 這樣做的效率非常低。要是運氣差,當正在 DRAM 中合並數據時,發生了電源故障或其它事故,那麽將丟失整個數據集合,因為在將數據讀入 DRAM 後就擦除了閃存扇區。JFFS2 附加文件而不是重寫整個扇區,並且具有崩潰/掉電安全保護這一功能。
這可能是最重要的一點:JFFS2 是專門為象閃存芯片那樣的嵌入式設備創建的,所以它的整個設計提供了更好的閃存管理。在嵌入式環境中使用 JFFS2 的 缺點很少:當文件系統已滿或接近滿時,JFFS2 會大大放慢運行速度。在實際開發過程中,文件系統大多采用JFFS2結合Cramfs,Cramfs是只讀的可以用來存放系統內核,JFFS2是可讀寫的,用來存放應用程序,這樣就減少了開發過程中的燒寫時間,讀提高開發進度非常有用。
 
3.4、應用程序
根據嵌入式系統的實際應用開發的應用程序之間差異是很大的,但是實際開發的方式、手段還是有共性的。嵌入式系統的應用程序都是采用交叉編譯的,因為目標板上的資源是非常有限的。開發的編譯工具一般都是gcc,在實際工程中可能需要對數以百計的源文件進行編譯,這顯然不能采用命令行逐個編譯,因此有效的利用make和makefile工具可以大大減少程序員的工作量,提高項目開發的效率。
make是一個解釋Makefile文件的命令工具,它可以根據Makefile文件來描述的眾多源文件之間的相互關系進行自動維護編譯,它會告訴系統采取什麽樣的方式編譯和鏈接程序。簡單地說Makefile的特殊文件是用來來告訴make需要做什麽、完成什麽任務、該怎麽做的文件。Linux程序員能寫出高效的Makefile文件,就會使得開發變得簡單許多,能縮短開發的周期,為產品占得市場先機有著非常重要的意義。開發的應用程序可以用gdb進行調試,在此不再展開。
 
四、總結
本文簡要介紹了ARM處理器,詳細論述了基於ARM的嵌入式linux系統的關鍵技術,包括引導加載程序、 Linux 內核、 文件系統、 用戶應用程序。對linux系統的各部分開發設計做了較深入清晰地分析,總結了linux系統的特點,及其在嵌入式操作系統競爭中的優勢。隨著嵌入式系統不斷發展,作為最有發展前景的ARM、linux將會逐漸擴大市場,學習好ARM及linux系統將有著廣闊的天空和美好的前景。

延伸阅读

    评论