Embedded Linux 技術(shù)與概念解析
使用initrd做為root filesystem裝置
將initial RAM disk當(dāng)成root filesystem來使用,是在Embedded Linux應(yīng)用上是相當(dāng)常見的技巧,如果我們想將initial RAM disk當(dāng)成存放root filesystem的裝置來使用,在開機時,只需要配合root=的kernel開機參數(shù)即可。
initramfs
Linus本人在Linux 2.6時代所提出的 initramfs ,是1種更好的 root= 做法。簡單來說,initramfs就是kernel 2.6 的 initrd,initramfs是屬于1種compressed ramfs(ram filesystem)的映像檔。
C鏈接庫
在C鏈接庫方面,除了標(biāo)準的glibc也被廣泛應(yīng)用在嵌入式系統(tǒng)領(lǐng)域外,也有一些專門針對嵌入式系統(tǒng)應(yīng)用所發(fā)展的C鏈接庫,像是uClibc以及Diet libc。但是由于現(xiàn)在的ARM9處理器計算效能都很快,平臺也多搭載大容量NAND閃存,所以許多實作都直接使用libc來實作root filesystem。
Linux驅(qū)動程序
由于嵌入式系統(tǒng)整體來看,除了軟件開發(fā)外,也包含硬件客制化,因此驅(qū)動程序在嵌入式系統(tǒng)技術(shù)領(lǐng)域中,占了舉足輕重的地位。學(xué)習(xí)驅(qū)動程序需要確實了解硬件的規(guī)格與微處理器架構(gòu),并且工程師還要能分得清楚哪些東西是接口(interfacing),也就是與硬件無關(guān)的程序(machine-independent);以及哪些是站在第一線做硬件控制的程序(machine-dependent)。各種軟件硬接口與匯流排也都要精通。
了解Linux驅(qū)動程序的架構(gòu),是進入嵌入式Linux領(lǐng)域的重點功課,因為許多針對ARM9平臺的驅(qū)動程序都是參考框架、或是針對特定開發(fā)板的實作,因此必須了解Linux驅(qū)動程序的架構(gòu),并進行修改,以符合自己的開發(fā)板與外圍規(guī)格。
Linux驅(qū)動程序,采取嚴謹?shù)姆謱邮郊軜?gòu)設(shè)計(layered architecture),利用分層的架構(gòu)設(shè)計來徹底區(qū)分generic device driver(machine independent)與machine dependent driver。
Linux驅(qū)動程序透過注冊與回呼的機制來清楚區(qū)分每1層的關(guān)系。分層架構(gòu)的實作必須在下層將自己注冊給上層,上層再回呼下層;上層的驅(qū)動程序必須提供注冊函數(shù)供下層呼叫,下層驅(qū)動程序所使用的注冊函數(shù)也將決定自己的上層架構(gòu)。
與user application如何互動,是撰寫驅(qū)動程序時所要考慮的重要一環(huán),因此撰寫驅(qū)動程序時,要提供什么功能給應(yīng)用程序引用,就必須事先定義清楚。Linux的 generic device driver層已經(jīng)幫我們把這些功能定義清楚了。Linux驅(qū)動程序如何透過I/O port或I/O memory來控制裝置,也就是與芯片組的溝通,方式是使用Linux kernel所提供的I/O函數(shù)來存取并控制實體硬件裝置。
Linux驅(qū)動程序的裝置文件
Device files是UNIX系統(tǒng)的獨特觀念,在UNIX系統(tǒng)底下我們把外部的周邊裝置均視為1個檔案,并透過此檔案與實體硬件溝通,這樣的檔案就叫做device files或special files。
Device file的major number代表1個特定的裝置,例如major number 1為”null”虛擬裝置,major number定義于kernel文件目錄Documentation/devices.txt。Minor number代表裝置上的子裝置,例如同1個硬盤上的分割區(qū)就用不同的major number來代表,但其major number相同。
我們在設(shè)計device driver時,會先透過1個“注冊”(register)的動作,將自己注冊到kernel里,注冊時,我們會指定1個major number參數(shù),以指定此驅(qū)動程序所要實作的外圍裝置。當(dāng)user開啟device file時,kernel便會根據(jù)device file的 major number找到對應(yīng)的驅(qū)動程序響應(yīng)使用者。Minor number則是device driver內(nèi)部所使用,kernel并不會處理不同的minor number。
Linux 2.6的kobject模型
Linux 2.6在驅(qū)動程序的架構(gòu)方面,加入kobject的概念。kobject以更有系統(tǒng)、組織的方式維護系統(tǒng)里的driver(集中式管理),但并非改變現(xiàn)有(kernel 2.4以來)的driver架構(gòu)。在kobject的模型下,可以看到1個platform driver觀念。所謂「platform driver」就是machine- dependent driver,當(dāng)驅(qū)動程序設(shè)計師在kernel 2.6底下實作machine-dependent driver時,就要以platform driver的架構(gòu)來實作。例如,針對我們的目標(biāo)裝置進行硬件層的驅(qū)動程序撰寫時,就要以platform driver的方式來撰寫,實作上,只是多1個注冊到platform driver層的動作而已。
Flash裝置的支持
針對嵌入式系統(tǒng)經(jīng)常使用的閃存(Flash)儲存裝置,Linux kernel支持JFFS2與NFTL 2個專門針對快閃記億體設(shè)計的檔案系統(tǒng)。JFFS2(Journaling Flash File System version 2)是專門針對 NOR 型閃存所設(shè)計的檔案系統(tǒng)。NFTL(NAND Flash Translation Layer)則是專門針對NAND型閃存設(shè)計的檔案系統(tǒng)。
結(jié)論
綜合而言,Embedded Linux是1個平臺、也是一些工具的集合、也是1個嵌入式軟件的開發(fā)環(huán)境;實作上,Embedded Linux除了會進行kernel的修改、驅(qū)動程序的移植或開發(fā)外,也會是系統(tǒng)管理與系統(tǒng)整合的再應(yīng)用,這是一門集大成的技術(shù),并不只是1個嵌入式操作系統(tǒng),也不只是1套開發(fā)工具。
評論