原文: http://linux.ccidnet.com/art/302/20060629/592037_1.html
摘 要:在分析linux2.6核心新特性的基礎上,在s3c2410開發板上移植了2.6核心和新的檔案系統,並成功地對h.264編譯碼多**系統提供了支援。
隨著多**技術與通訊技術相結合的資訊科技的快速發展和網際網路的廣泛應用,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,因而每次排程都是乙個固定的時間。任務執行時分配乙個時間片,當時間片結束,該任務將放 棄處理器並根據其優先順序轉到過期佇列中。活動佇列中任務全部排程結束後,兩個佇列指標互換,過期佇列成為當前佇列,排程程式繼續以簡單的演算法排程當前佇列 中的任務。這在多處理器的情況更能提高**p的效率,平衡處理器的負載,避免程序在處理器間的跳躍。
1.3 同步原型與共享記憶體
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或者 **dk2410.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=,在arch/arm/mach-s3c2410/mach-**dk2410.c中的__initdata部分 增加&s3c_device_nand,使核心在啟動時初始化nand flash資訊。
2.3 核心編譯載入
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-**dk2410.c的**dk2410_iodesc中增加 ,核心原始碼中加入晶元的驅動程式drivers/net/arm/cs8900.h和cs8900.c,並且配置網路裝置驅動的 makefile和kconfig檔案,加入cs8900a的配置選項,這樣可以在核心編譯時載入網路裝置的驅動。
在linux2.6應用的同時,也要看到其與以前版本核心比較存在的一些問題。在核心的編譯時間、核心映象大小、核心占用ram空間大小、系統 啟動時間相對linux2.4而言都存在不同程度的不足,但在硬體條件日益進步的現今可以接受,而且一部分也是由於功能加強必然帶來的。雖然linux並 非乙個真正的實時作業系統,但2.6核心的改進能夠滿足大部分的應用需求,所以linux2.6核心將會在嵌入式系統領域大展身手。
Linux 2 6核心編譯,核心公升級
本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...
嵌入式Linux核心製作
一.linux核心簡介 linux系統架構分為核心空間和使用者空間。它們之間切換條件 1.系統呼叫 2.硬體中斷。核心架構 1.系統呼叫介面 2.程序管理塊 3.記憶體管理 4.體系結構相關 4.虛擬檔案系統 5.網路棧 6.裝置驅動 二.製作linux核心 1.修改配置檔案 make config...
嵌入式Linux核心介紹
張建波 linux最早是由芬蘭的linus torvalds為在英特爾x86架構上提供乙個自由免費的類unix作業系統而開發的。準確來說,linus torvalds僅僅是完成了linux 的 核心 也就是說 linux 核心 linux作業系統。現在pc機上比較流行的redhat ubuntu等等...