Linux 2.6 核心的嵌入式系統應用

來源:互聯網
上載者:User

Linux 2.6 核心的嵌入式系統應用

 

摘 要:在分析Linux2.6核心新特性的基礎上,在S3C2410開發板上移植了2.6核心和新的檔案系統,並成功地對H.264編解碼多媒體系統提供了支援。
關鍵詞:Linux 核心 嵌入式系統 S3C2410
隨著多媒體技術與通訊技術相結合的資訊技術的快速發展和互連網的廣泛應用,PC 時代也過渡到了後PC時代。在數字資訊技術和網路技術高速發展的後PC時代,嵌入式技術越來越與人們的生活緊密結合。
作業系統為使用者使用電腦及其外部裝置提供最基本的介面程式,管理電腦上的資源。隨著應用領域的擴大,為了適應不同的應用場合,考慮到系統的靈活性、延展性以及可裁剪性,一種以應用為中心、以電腦技術為基礎、軟硬體可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗要求嚴格的專用電腦系統 ——嵌入式作業系統隨之延生。
Linux 作業系統是一種效能優良、源碼公開且被廣泛應用的免費作業系統,由於其體積小、可裁減、運行速度高、良好的網路效能等優點,可以作為嵌入式作業系統。隨著 2.6核心的發布,Linux向現有主流的RTOS供應商在嵌入式系統市場提出了巨大挑戰,例如VxWorks和WinCE,具有許多新特性,將成為更優秀的嵌入式作業系統。
Linux的低成本和開放性,為其在嵌入式系統領域的應用營造了肥沃的土壤。本文著重介紹Linux 2.6核心的新特性及其嵌入式應用中的優勢,並將其移植到嵌入式平台中,成功支援H.264編解碼多媒體系統。
1 Linux 2.6核心針對嵌入式開發顯著特點
即時可靠性是嵌入式應用較為普遍的要求,儘管Linux 2.6 並不是一個真正的即時作業系統,但其改進的特效能夠滿足響應需求。Linux 2.6 已經在核心主體中加入了提高中斷效能和調度回應時間的改進,其中有三個最顯著的改進:採用可搶佔核心、更加有效調度演算法以及同步性的提高[4]。在企業伺服器以及嵌入式系統應用領域,Linux 2.6 都是一個巨大的進步。在嵌入式領域,Linux 2.6 除了提高其即時效能,系統的移植更加方便,同時添加了新的體繫結構和處理器類型——包括對沒有硬體控制記憶體管理方案的 MMU-less系統的支援,可以支援大容量記憶體模型、微控制器,同時還改善了I/O子系統,增添更多的多媒體應用功能[4]。
1.1 可搶佔核心
在先前的核心版本中(包括2.4核心)不允許搶佔以核心態啟動並執行任務(包括通過系統調用進入核心模式的使用者任務),只能等待它們自己主動釋放CPU。這樣必然導致一些重要任務延時以等待系統調用結束。
一個核心任務可以被搶佔,為的是讓重要的使用者應用程式可以繼續運行。這樣做最主要的優勢是極大地增強系統的使用者互動性。
2.6核心並不是真正的RTOS(Real Time Operation System),其在核心代碼中插入了搶佔點,允許發送器中止當前進程而調用更高優先順序的進程,通過對搶佔點的測試避免不合理的系統調用延時。2.6核心在一定程度上是可搶佔的,比2.4核心具備更好的響應性。但也不是所有的核心程式碼片段都可以被搶佔,可以鎖定核心代碼的關鍵區段,確保CPU的資料結構和狀態始終受到保護而不被搶佔。
軟體需要滿足最終時間限制與虛擬記憶體請求頁面調度之間是相互矛盾的。慢速的頁錯誤處理將會破壞系統的即時響應性,而2.6核心可以編譯無虛擬記憶體系統避免這個問題,這是解決問題的關鍵,但要求軟體設計者有足夠的記憶體來保證任務的執行。
1.2 有效發送器
2.6版本的 Linux核心使用了由 Ingo Molnar開發的新的調度器演算法,稱為O(1)演算法,1所示。它在高負載情況下執行得極其出色,並且當有很多處理器並行時也可以很好地擴充[2]。過去的發送器需要尋找整個ready task隊列,並且計算它們的重要性以決定下一步調用的task,需要的時間隨task數量而改變。O(1)演算法則不再每次掃描所有的任務,當task就緒時被放入一個活動隊列中,發送器每次從中調度適合的task,因而每次調度都是一個固定的時間。任務運行時分配一個時間片,當時間片結束,該任務將放棄處理器並根據其優先順序轉到到期隊列中。活動隊列中任務全部調度結束後,兩個隊列指標互換,到期隊列成為當前隊列,發送器繼續以簡單的演算法調度當前隊列中的任務。這在多處理器的情況更能提高SMP的效率,平衡處理器的負載,避免進程在處理器間的跳躍。
圖1 O(1)調度演算法
1.3 同步原型與共用記憶體
多進程應用程式需要共用記憶體和外設資源,為避免競爭採用了互斥的方法保證資源在同一時刻只被一個任務訪問。Linux核心用一個系統調用來決定一個線程阻塞或是繼續執行來實現互斥,線上程繼續執行時,這個費時的系統調用就沒有必要了。 Linux2.6所支援的Fast User-Space Mutexes 可以從使用者空間檢測是不是需要阻塞線程,只在需要時執行系統調用終止線程。它同樣採用調度優先順序來確定將要執行的進程[4]。多處理器嵌入式系統各處理器之間需要共用記憶體,對稱式多處理技術對記憶體訪問採用同等優先順序,在很大程度上限制了系統的可量測性和處理效率。Linux2.6 則提供了新的管理方法——NUMA(Non Uniform Memory Access)。NUMA根據處理器和記憶體的拓撲布局,在發生記憶體競爭時,給予不同處理器不同層級許可權以解決記憶體搶佔瓶頸,提高輸送量。
1.4 POSIX線程及NPTL
新的執行緒模式基於一個1:1的執行緒模式(一個核心線程對應一個使用者線程),包括核心對新的 NPTL(Native POSIX Threading Library)的支援,這是對以前核心線程方法的明顯改進。2.6核心同時還提供POSIX signals和POSIX high-resolution timers。POSIX signals不會丟失,並且可以攜帶線程間或處理器間的通訊資訊。嵌入式系統要求系統按時間表執行任務,POSIX timer可以提供1kHz的觸發器使這一切變得簡單,從而可以有效地控制進度。
1.5 微控制器的支援
Linux2.6核心加入了多種微控制器的支援。無MMU的處理器以前只能利用一些改進的分支版本,如uClinux,而2.6核心已經將其整合進了新的核心中,開始支援多種流行的無MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300。Linux在無MMU控制器上仍舊支援多任務處理,但沒有記憶體保護功能。同時也加入了許多流行的控制器的支援,如S3C2410等。
1.6 面嚮應用
嵌入式應用有使用者定製的特點,硬體設計都針對特定應用開發,這給系統帶來對非標準化設計支援的問題(如IRQ的管理)。為了更好地實現,可以採用組件化的作業系統。Linux2.6採用的子系統架構將功能模組化,可以定製而對其他部分影響最小。同時Linux2.6提供了多種新技術的支援以實現各種應用開發,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,對多媒體資訊處理更加方便;對USB2.0的支援,提供更高速的傳輸,增加藍芽無線介面、音頻資料連結和面向連結的資料轉送L2CAP,滿足短距離的無線串連的需要;而且在2.6核心中還可以配置成無輸入和顯示的純粹無使用者介面系統。
2 應用研究
在S3C2410開發板上移植嵌入式Linux 2.6.11.7核心系統,應用於構建H.264多媒體系統。
2.1 建立交叉編譯環境
在RedHat9的主機上進行核心移植開發,首先需要建立交叉編譯環境。由於2.6核心中採用了一些新的特性和指令,需要採用較新的工具集,採用 binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads-2.2.5 來建立交叉編譯工具鏈,建立之後將工具鏈路徑加入系統路徑$PATH中。
2.2 核心修改
Linux 2.6.11.7核心加入了對S3C2410晶片的支援,不再需要任何補丁檔案。修改核心源碼中Makefile的交叉編譯選項ARCH=arm, CROSS_COMPILE=arm-linux-。針對硬體設定,需要在arch/arm/mach-s3c2410/devs.c或者 smdk2410.c中添加FLASH的分區資訊s3c_nand_info,如表1。
表1 NAND FLASH分區表
分區名 起始地址 大 小
Vivi  0x00000000  0x00020000
Param  0x00020000  0x00010000
Kernel  0x00030000  0x001c0000
Root  0x00200000  0x00200000
Usr  0x00400000  0x03c00000
然後在s3c_device_nand中增加.dev= {.platform_data= &s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中的__initdata部分增加&s3c_device_nand,使核心在啟動時初始化NAND FLASH資訊。
2.3 核心編譯載入
對核心進行適當的配置是一個量體裁衣的過程。由於2.6核心會根據本地系統配置進行初始設定,可以匯入核心源碼預設s3c2410的設定檔,方便載入核心基本配置,然後再選擇所需選項。對MTD配置選擇支援MTD裝置驅動以及NAND FLASH驅動;選擇支援要用到的各類檔案系統(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及網路裝置和協議,本系統載入了網路晶片CS8900以及USB支援;在H.264多媒體系統中還需要載入Frame buffer以支援LCD顯示功能。使用交叉編譯工具編譯核心源碼後, 會在arch/arm/boot/下產生名為zImage的核心映像,在Boot loader的命令提示模式下使用下載命令完成核心載入到開發板的存放裝置FLASH中。編譯過程(相對以前版本的編譯過程,2.6核心編譯有所簡化):
make mrproper
make menuconfig(字元介面,或者用make xconfig圖形介面,但需要Qt庫的支援,而make gconfig則需要GTK庫的支援)
make
make bzImage
2.4 檔案系統
Linux採用檔案系統組織系統中的檔案和裝置,為裝置和使用者程式提供統一介面。Linux 支援多種檔案系統,本系統使用CRAMFS格式的唯讀根檔案系統,而將FLASH中的USER區使用支援可讀寫的YA FFS檔案系統格式,方便添加自己的應用程式。
在根檔案系統中,為保護系統的基本設定不被更改,採用CRAMFS格式。採用DEVFS來實現基本裝置的建立掛載,同時使用BusyBox也是一個縮小根檔案系統的辦法,提供了系統的基本指令;還需要建立一些必備的目錄,添加所需設定檔,如fstab、inittab等;還有一個重要的工作就是添加系統應用必備的動態函數庫。使用產生工具mkcramfs 將整個根檔案目錄裡的內容製作成映像檔案。
mkcramfs rootfs rootfs.ramfs
YAFFS檔案系統格式的支援需要將驅動加入到核心代碼樹下fs/yaffs/,修改核心設定檔,就可以在核心編譯中載入對該檔案系統的支援。使用 mkyaffs工具將NAND FLASH分區格式化為YAFFS分區,將mkyaffsimage產生的應用程式鏡像燒寫進YAFFS分區,在啟動時通過寫入fstab自動載入 YAFFS分區即可。
2.5 網路裝置驅動
系統中採用CS8900A的10M網路晶片,它使用S3C2410的 nGCS3和IRQ_EINT9,相應修改linux/arch/arm/mach-s3c2410/irq.c,並在mach-smdk2410.c的 smdk2410_iodesc[]中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},核心源碼中加入晶片的驅動程式drivers/net/arm/cs8900.h和cs8900.c,並且配置網路裝置驅動的 Makefile和Kconfig檔案,加入CS8900A的配置選項,這樣可以在核心編譯時間載入網路裝置的驅動。
在Linux2.6應用的同時,也要看到其與以前版本核心比較存在的一些問題。在核心的編譯時間、核心鏡像大小、核心佔用RAM空間大小、系統啟動時間相對Linux2.4而言都存在不同程度的不足,但在硬體條件日益進步的現今可以接受,而且一部分也是由於功能加強必然帶來的。雖然Linux並非一個真正的即時作業系統,但 2.6核心的改進能夠滿足大部分的應用需求,所以Linux2.6核心將會在嵌入式系統領域大展身手。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.