Embedded Linux(嵌入式Linux) - 尋找最初的初衷- 痞客邦

文章推薦指數: 80 %
投票人數:10人

Embedded Linux的特色是大量使用自由軟體、與開放原始碼軟體(FOSS- Free & Open Source Software)資源,「任何你想要的軟體,幾乎都能在網路上找到自由 ... 尋找最初的初衷 跳到主文 迷失在LINUX的小書僮 部落格全站分類:職場甘苦 相簿 部落格 留言 名片 Jan02Thu201413:30 EmbeddedLinux(嵌入式Linux) 引言:EmbeddedLinux技術基於開放原始碼的資源,並且已經是當今最重要的嵌入式應用技術之一。

EmbeddedLinux是燒錄在目標裝置上(特定硬體)的系統,1個EmbeddedLinux系統包含Linuxkernel(核心)與rootfilesystem(檔案系統)2大部分,EmbeddedLinux系統到底由哪些組成要素構成,本文將由概念的層面進行分析。

本文:由於目前的目標裝置(特定硬體),都必須嵌入極為複雜的功能,所以「嵌入式作業系統(Embeddedsystem)」成為嵌入式系統不可或缺的要素。

由於嵌入式系統是功能導向的系統,因此必須設計、選擇或購買正確(或適合)的目標裝置,才能開始實作並嵌入「嵌入式系統」。

因此,嵌入式系統技術是以功能、與目標裝置為分類的1種技術。

例如,與PDA相關的目標裝置(即硬體)、與MP3播放器相關的目標裝置、與3G手機相關的目標裝置...等等;使用這些目標裝置所開發的特定功能系統,便是PDA的嵌入式系統、MP3音樂播放的嵌入式系統、3G手機的嵌入式系統。

EmbeddedLinux其實並不是1個作業系統,而是代表「應用Linux系統於Embeddedsystem」的名詞。

EmbeddedLinux的技術核心主軸是在研究「如何將Linux系統嵌入至嵌入式目標裝置裡」。

EmbeddedLinux是基於Linux系統的特殊應用,當然也要符合眾多標準才行。

LSB與FHS標準是重要的2大標準,跟隨標準不但可以提供系統間的相容性,也可以提供我們1個Linux系統的建構依據。

※GNU/Linux的2個標準由FSG(FreeStandardsGroup)所主持的LSB(LinuxStandardBase)專案即是在制定GNU/Linux標準。

根據LSB標準所發展的GNU/Linux系統,才能提供應用程式最小的可執行環境,並且可在依循LSB標準的Linuxdistributions上執行無誤。

例如,我們可以在符合LSB標準的RedHatLinux上發展應用程式,只要自行發展的EmbeddedLinux系統符合LSB標準所訂定的規範,應用程式就可以順利移植到EmbeddedLinux上執行。

LSB標準提供我們發展EmbeddedLinux的依據,雖然EmbeddedLinux系統是最小化的Linux,但因為EmbeddedLinux是嵌入式系統的軟體平台,所以我們不能任意精簡Linux系統,在精簡的過程中仍要保留最基本的作業系統環境,而LSB的標準正是在制定這些基本的需求。

FHS全名為FilesystemHierarchyStandard,是定義檔案與目錄標準的文件,FHS的標準,定義了目錄與檔案的擺放位置,而UNIX-like的系統則是根據這個標準,管理整個檔案結構。

因此,不管是系統廠商、Linux/UNIXdistribution發展者(developer)、應用程式作者、套件管理者、系統維護人員都應該要依照FHS的標準來管理UNIX系統的目錄與檔案。

EmbeddedLinux的特色是大量使用自由軟體、與開放原始碼軟體(FOSS-Free&OpenSourceSoftware)資源,「任何你想要的軟體,幾乎都能在網路上找到自由軟體」已經成為EmbeddedLinux技術的重要支柱。

自由軟體資源包山包海,舉凡應用程式、系統工具、網路工具、程式庫、圖形介面、小型瀏覽器、程式發展工具...等等都能找得到。

※BusyboxBusybox是重要的EmbeddedLinux工具箱,這個工具箱提供基本的UNIX指令、系統程式(daemon)與開機程序(initprocess)。

Busybox用來建造1個基本、最小化且可開機的Linux系統,由於Busybox裡的指令與工具都經過最小化處理,因此已經是目前主要應用在EmbeddedLinux實作上的開放原始碼專案了。

※EmbeddedLinux的組成圖說:EmbeddedLinux整體架構。

EmbeddedLinux平台除了Linuxkernel(核心)外,還包含共享程式庫(sharedlibrary)。

sharedlibraries是Linuxkernel的重要支援,並且也是Linux架構裡獨立的1層。

在應用程式方面,許多現存的開放源碼專案都可以直接「移植」到ARM平台。

但這裡所指的移植是對原始碼進行跨平台編譯(crosscompile),並不是BSP(boardsupportpackage)的移植。

跨平台編譯因為開放原始碼開發工具的特性,在應用程式級別的移植工具上,可以有1套比較系統化的方法,也有相關的工具與環境可以使用,目前最熱門的跨平台編譯環境為OpenEmbedded。

開放源碼軟體採用GNUAutoconf與GNUAutomake來撰寫編譯法則(Makefile),因此實務上,要將應用程式移植到ARM平台,大部分案例只需要做跨平台編譯即可。

要了解如何將原始碼移植到ARM平台,需要學會GNUAutoconf以及GNUAutomake的使用。

※GNUAutoconfAutoconf是m4巨集的擴充套件,可以用來自動設定軟體套件的原始碼。

Autoconf會產生1個協助程式編譯的設定文稿執行檔(configurationscript),以方便編譯原始碼前進行系統檢查與設定,使用GNUAutoconf時,必須安裝GNUm4套件。

※GNUAutomakeAutomake是自動產生Makefile.in的工具,需配合Autoconf使用,以產生可以讓GNUMake自動編譯原始碼的”Makefile”檔案。

※GNUMakeGNUMake會根據“Makefile”來自動編譯程式,而編譯完成的程式為執行檔(binaryprogram)。

GNUMake的重要特點,是沒有特定程式語言限制,甚至可以應用在非程式語言編譯的環境中,例如:系統維護工作與套件安裝,因此GNUMake可以說是系統自動化的好工具。

GNUMake根據“Makefile”檔案裡所定義的規則,執行Unix命令,簡單的Makefile,可以利用編輯器手動撰寫,但較複雜且與針對不同平台的設定,則建議採用GNUAutoconf/GNUAutomake來產生“Makefile”。

當我們能夠產生使用crosstoolchain的Makefile時,就可以將套件編譯成ARM平台能夠使用的執行檔(binaryprogram)。

※ARM平台的選擇與支援嵌入式裝置的硬體選擇當然沒有所謂的標準,但若是談論到嵌入式Linux的應用,在平台的選擇上就會有一些考慮。

最重要的考慮因素,當然就是處理器對於作業系統的支援,如此一來,沒有MMU(記憶體管理單元)的ARM7平台,就不在主要的選擇範圍內。

以下列出幾個目前普遍使用的ARM9應用程式處理器(applicationprocessor):在選擇解決方案時,若是決定採用Linux做為嵌入式作業系統,首先當然就是要確定廠商是否提供完整的BSP(Boardsupportpackage)。

不過,由於Linux是由社群(community)所維護發展,因此,選擇目前Linuxkernel內有支援的平台,將會是較好的選擇,這也是為什麼有許多大廠,主動貢獻並提交BSP給kernel.org的原因。

目前在Linuxkernel(核心)社群比較活躍的ARM9廠商,或是社群主動積極協助維護的SOC平台,像是ATMEL、Samsung與TIOMAP等,這些都是kernel.org的Linuxkernel就有支援的處理器,這表示讓Linux支援這些平台的方式也很簡單,就是到kernel.org下載官方的Linuxkernel即可。

※CrossToolchain(跨平台編譯工具鏈)針對ARM9或是其它平台的開發,最重要的工具就是CrossToolchain。

CrossToolchain的製作一直是EmbeddedLinux開發者的夢靨,大多數人選擇由網路下載現成的開發工具,但經常會遇到缺乏程式庫的編譯錯誤。

完整的CrossToolchain包含1套基本的gcccrosscompiler以及其它的應用程式庫;CrossToolchain是製作基本gcccrosscompiler的工具,透過crosstool即可製作ARM9的基本toolchain。

RootFilesystem(根檔案系統)概念Rootfilesystem的建置,即是在建立1個基本的Linux系統(basesystem),讓kernel在完成開機後,進入usermode執行使用者程式。

Rootfilesystem的建置主要是以Busybox為主,並加入(移植)客製化的開放源碼(opensource)與自由軟體(freesoftware)。

因為嵌入式Linux的rootfilesystem是依照需求加入套件,與桌面環境的Linuxdistribution不同,因此都是用從頭打造的方式做起。

在建立rootfilesystem時,程式庫相依(librarydependencies)的議題是相當重要的項目。

當rootfilesystem缺少必要的library時,程式當然無法執行,甚至系統也會無法順利啟動。

分析應用程式所需的相依程式庫,觀念如下:(1)先利用CrossToolchain的objdump指令觀察ELF格式裡的「NEEDED」項目。

(2)必須再檢查這些library是否相依其它library。

1個基本且可開機的rootfilesystem,也稱做bootstraprootfilesystem,1個可用的bootstraprootfilesystem只需要包含busybox與libc即可。

傳統的EmbeddedLinux應用,大多是以NFS掛載的方式來測試目標裝置的完整rootfilesystem(fullrootfilesystem)。

以NFS進行EmbeddedLinux開發測試,主要是針對目標裝置的fullrootfilesystem做「立即(rightnow)」的系統執行測試(run-time),免除「不斷打包imagefile、開機」的惡夢。

這是1種流行很久的EmbeddedLinux系統測試與開發方式,其概念如下:(1)將target的完整rootfilesystem(例如ARM9rootfilesystem)建置後,存放於host端的某個目錄下,例如/home/rootfs。

(2)為target製作1個「NFSrootfilesystem」,也就是bootstraprootfilesystem+NFS功能,並使用NFSrootfilesystem將目標裝置開機。

(3)設定host端為NFSserver。

(4)以NFSmount方式將host端上的rootfilesystem目錄「mount」到目標裝置,即可在目標裝置上執行fullrootfilesystem裡的應用程式。

這種方式不但簡單,而且方便,需要的基礎建設如下:1.目標裝置使用的kernel必須支援NFS檔案系統。

2.製作bootstraprootfilesystem時,需要加入mount指令,並且開啟mount指令的NFS功能。

3.加入NFSfunctionality至bootstraprootfilesystem。

4.設定NFSserver。

製作完成的rootfilesystem必須做打包的動作,將整個rootfilesystem包裝成1個映像檔(imagefile)。

根據目標裝置的不同,我們可以將映像檔包裝成ROMfilesystem、CompressROMfilesystem、ext2filesystem或是compressRAMfilesystem。

※ROMfilesystemROMfilesystem(romfs)是1種唯讀(Read-Only)的檔案系統,在EmbeddedLinux裡的主要應用為製作romfs格式的檔案系統映像檔。

我們將rootfilesystem製作成romfsfilesystem的image檔。

開機後,整個filesystem僅能讀取。

要使用romfsfilesystem必須將Linuxkernel裡的CONFIG_ROMFS_FS功能選項打開。

製作ROMfs映像檔所使用的工具為genromfs。

※CompressedROMfilesystemCompressedROMfilesystem(cromfs)即是壓縮過的ROMfilesystem,其製作方式相當簡單,只要使用gzip將ROMfilesystem的映像檔壓縮即可。

※製作ext2fs映像檔製作ext2fs映像檔的方式有2種。

1種是使用dd指令產生1個空白的映像檔,接著再將此映像檔以mkfs.ext2指令格式化成ext2的格式。

製作好的空白映像檔再以loopbackmount方式掛載到1個目錄下,再將rootfilesystem整個複製到此目錄下,即可完成ext2fs映像檔的製作。

另外1種建立ext2fs映像檔的方式是使用genext2fs工具,此工具的好處是,當我們需要在rootfilesystem裡預先建立(pre-built)裝置檔時(devicefile),只需要編寫1個裝置檔表格,genext2fs工具會在打包映像檔時,自動在rootfilesystem裡建立裝置檔。

※InitialRAMdisk(initrd)RAMdisk是存在於記憶體中的虛擬磁碟,也就是將RAM拿來當成磁碟使用。

在EmbeddedLinux的應用中,我們通常會將ramdisk當成暫存目錄來使用。

例如將/dev/ram1附掛到/tmp目錄,以便能讓應用程式存放暫時性檔案。

/dev/ram?為ramdisk的devicefile。

由於整個rootfilesystem是從真正的儲存裝置讀取並載入至ramdisk,因此有1個重要的特性是對filesystem所做的任何修改,都不會影響到真正rootfilesystem的內容。

initrd全名為initializeRAMdisk,是1個特殊的RAMdisk。

bootloader會將initrd載至記憶體,Linuxkernel則可在/dev/ram0找到initrd。

initrd會在Linuxkernel開機前就載入,initrd正式的用途是用來存放開機時所需要的驅動程式(因rootfilesystem尚未mount進來)。

在EmbeddedLinux應用上,我們會利用initrd來存放整個檔案系統(rootfilesystem),也就是將rootfilesystem製作成ext2或romfs格式(或其它檔案系統)的映像檔,並在開機時由bootloader載入記憶體,initrd均位於/dev/ram0。

要使用RAMdisk與initrd,必須將Linuxkernel的CONFIG_BLK_DEV_RAM以及CONFIG_BLK_DEV_INITRD)打開。

※使用initrd做為rootfilesystem裝置將initialRAMdisk當成rootfilesystem來使用,是在EmbeddedLinux應用上是相當常見的技巧,如果我們想將initialRAMdisk當成存放rootfilesystem的裝置來使用,在開機時,只需要配合「root=」的kernel開機參數即可。

※initramfsLinus本人在Linux2.6時代所提出的"initramfs",是1種更好的"root="做法。

簡單來說,initramfs就是「kernel2.6的initrd」,initramfs是屬於1種compressedramfs(ramfilesystem)的映像檔。

※C程式庫在C程式庫方面,除了標準的glibc也被廣泛應用在嵌入式系統領域外,也有一些專門針對嵌入式系統應用所發展的C程式庫,像是uClibc以及Dietlibc。

但是由於現在的ARM9處理器計算效能都很快,平台也多搭載大容量NAND快閃記憶體(NANDFlash),所以許多實作都直接使用libc來實作rootfilesystem。

Linux驅動程式由於嵌入式系統整體來看,除了軟體開發外,也包含硬體客制化,因此驅動程式在嵌入式系統技術領域中,佔了舉足輕重的地位。

學習驅動程式需要確實瞭解硬體的規格與微處理器架構,並且工程師還要能分得清楚哪些東西是介面(interface),也就是與硬體無關的程式(machine-independent);以及哪些是站在第一線做硬體控制的程式(machine-dependent)。

各種軟體硬介面與?流排也都要精通。

了解Linux驅動程式的架構,是進入嵌入式Linux領域的重點功課,因為許多針對ARM9平台的驅動程式都是參考框架、或是針對特定開發板的實作,因此必須了解Linux驅動程式的架構,並進行修改,以符合自己的開發板與週邊規格。

Linux驅動程式,採取嚴謹的分層式架構設計(layeredarchitecture),利用分層的架構設計來徹底區分genericdevicedriver(machineindependent)與machinedependentdriver。

Linux驅動程式透過「註冊」與「回呼」的機制來清楚區分每1層的關係。

分層架構的實作必須在下層將自己註冊給上層,上層再回呼下層;上層的驅動程式必須提供註冊函數供下層呼叫,下層驅動程式所使用的註冊函數也將決定自己的上層架構。

與userapplication如何互動,是撰寫驅動程式時所要考慮的重要一環,因此撰寫驅動程式時,要提供什麼「功能」給應用程式引用,就必須事先定義清楚。

Linux的genericdevicedriver層已經幫我們把這些功能定義清楚了。

Linux驅動程式如何透過I/Oport或I/Omemory來控制裝置,也就是與晶片組的溝通,方式是使用Linuxkernel所提供的I/O函數來存取並控制實體硬體裝置。

※Linux驅動程式的裝置檔Devicefiles是UNIX系統的獨特觀念,在UNIX系統底下我們把外部的周邊裝置均視為1個檔案,並透過此檔案與實體硬體溝通,這樣的檔案就叫做devicefiles或specialfiles。

Devicefile的majornumber代表1個特定的裝置,例如majornumber1為”null”虛擬裝置,majornumber定義於kernel文件目錄Documentation/devices.txt。

Minornumber代表裝置上的子裝置,例如同1個硬碟上的分割區就用不同的minornumber來代表,但其majornumber相同。

我們在設計devicedriver時,會先透過1個“註冊”(register)的動作,將自己註冊到kernel裡,註冊時,我們會指定1個majornumber參數,以指定此驅動程式所要實作的週邊裝置。

當user開啟devicefile時,kernel便會根據devicefile的majornumber找到對應的驅動程式回應使用者。

Minornumber則是devicedriver內部所使用,kernel並不會處理不同的minornumber。

※Linux2.6的kobject模型Linux2.6在驅動程式的架構方面,加入kobject的概念。

kobject以更有系統、組織的方式維護系統裡的driver(集中式管理),但並非改變現有(kernel2.4以來)的driver架構。

在kobject的模型下,可以看到1個platformdriver觀念。

所謂「platformdriver」就是machine-dependentdriver,當驅動程式設計師在kernel2.6底下實作machine-dependentdriver時,就要以platformdriver的架構來實作。

例如,針對我們的目標裝置進行硬體層的驅動程式撰寫時,就要以platformdriver的方式來撰寫,實作上,只是多1個註冊到platformdriver層的動作而已。

※Flash(快閃記憶體)裝置的支援針對嵌入式系統經常使用的快閃記憶體(Flash)儲存裝置,Linuxkernel支援JFFS2與NFTL2個專門針對快閃記億體設計的檔案系統。

JFFS2(JournalingFlashFileSystemversion2)是專門針對NOR型快閃記憶體所設計的檔案系統。

NFTL(NANDFlashTranslationLayer)則是專門針對NAND型快閃記憶體設計的檔案系統。

結論綜合而言,EmbeddedLinux是1個平台、也是一些工具的集合、也是1個嵌入式軟體的開發環境;實作上,EmbeddedLinux除了會進行kernel的修改、驅動程式的移植或開發外,也會是系統管理與系統整合的再應用,這是一門集大成的技術,並不只是1個嵌入式作業系統,也不只是1套開發工具。

(本文為Jollen’sConsulting,Inc.技術顧問撰寫http://www.jollen.org/consulting)參考來源http://tech.digitimes.com.tw/ShowNews.aspx?zCatId=126&zNotesDocId=0000080936_B9WL69LZUF2L4FY7IZ4C5 全站熱搜 創作者介紹 ryan0988 尋找最初的初衷 ryan0988發表在痞客邦留言(0)人氣() E-mail轉寄 全站分類:進修深造個人分類:linux此分類上一篇:CrossCompile(跨平台編譯) 此分類下一篇:WHATIS__USE_GNU? 上一篇:電影:戰爭遊戲(Ender'sGame) 下一篇:WHATIS__USE_GNU? ▲top 留言列表 發表留言 熱門文章 文章分類 旅遊(1)報稅(2)寵物(1)大陸出差(2)電影心得(94)linux(25)IPCAM(7)玉石(1)安控(1)軟體(2)C語言(11)英文筆記(14)未分類文章(7) 最新文章 最新留言 文章精選 文章精選 2016一月(8) 2015十二月(3) 2015九月(1) 2015七月(1) 2015四月(4) 2015二月(4) 2014十二月(1) 2014十一月(2) 2014九月(1) 2014六月(4) 2014一月(8) 2013十二月(3) 2013十一月(2) 2013十月(3) 2013九月(2) 2013八月(3) 2013七月(2) 2013六月(5) 2013五月(1) 2013四月(7) 2013三月(9) 2013二月(5) 2013一月(17) 2012十二月(17) 2012十一月(12) 2012十月(4) 2012九月(18) 2012八月(21) 所有文章列表 文章搜尋 {{article.user_name}} {{article.timestamp*1000|date:'MMM.dd.y.hh.mm'}} {{article.title}} {{article.content}} 我要留言 回到頁首 回到主文 免費註冊 客服中心 痞客邦首頁 ©2003-2021PIXNET 關閉視窗 PIXNET Facebook Yahoo! Google MSN {{guestName}} (登出) 您尚未登入,將以訪客身份留言。

亦可以上方服務帳號登入留言 請輸入暱稱(最多顯示6個中文字元) 請輸入標題(最多顯示9個中文字元) 請輸入內容(最多140個中文字元) 請輸入左方認證碼: 看不懂,換張圖 請輸入驗證碼 送出留言



請為這篇文章評分?