国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
嵌入式linux系統(tǒng)開發(fā)概述
嵌入式linux系統(tǒng)開發(fā)概述
基于linux的嵌入式系統(tǒng)開發(fā)是一個很大的課題,涵蓋了從硬件到軟件設(shè)計的多個領(lǐng)域,由于linux的開源特性,導(dǎo)致開發(fā)中可以使用的軟件和工具多不勝數(shù),從最底層與系統(tǒng)硬件直接打交道的引導(dǎo)裝載程序(bootloader),到linux操作系統(tǒng)的分發(fā)版(distribution),再到上層的圖形用戶界面(GUI)乃至應(yīng)用程序(application),可供選擇的軟件實在是太多了,這對開發(fā)者來說是一種恩賜。但由于標準的不統(tǒng)一,對于剛剛步入這個領(lǐng)域的初學(xué)者來說,很難在短時間內(nèi)全部了解和掌握它們。本文論述了嵌入式linux開發(fā)的基本模式和概念,給出了一些常用的軟件和工具,旨在帶領(lǐng)他們更快的走入這個奇妙的世界。
 
1   引導(dǎo)裝載程序(bootloader)
引導(dǎo)裝載程序通常是在任何硬件上執(zhí)行的第一段代碼,它的主要任務(wù)視裝載設(shè)備的不同而不同。在臺式機和筆記本這樣的常規(guī)系統(tǒng)中,經(jīng)常存在多個操作系統(tǒng)并存的情況,因此bootloader的主要作用就是選擇系統(tǒng)使用何種操作系統(tǒng)來引導(dǎo)。常用的引導(dǎo)程序有LILO或GRUB,通常將它們裝入硬盤的主引導(dǎo)記錄(Master Boot Record)中,或者裝入linux 駐留的磁盤的第一個扇區(qū)。
    在嵌入式系統(tǒng)中,情況有些不同。首先,嵌入式設(shè)備通常需要經(jīng)常地移
動,考慮到在移動過程中的震動,一般不會采用機械式結(jié)構(gòu)設(shè)計的硬盤為存
儲設(shè)備;而且從成本控制上說,硬盤的價格比較高,除非是需要大容量存儲
的場合,硬盤不適合作為嵌入式設(shè)備的存儲介質(zhì)。目前采用得比較多的是閃
存設(shè)備,閃存設(shè)備是與存儲設(shè)備功能類似的特殊芯片,而且它們能持久存儲
信息----即在重新引導(dǎo)時不會擦除其內(nèi)容Flash、Disk on Chip和Compact
Flash卡就是使用得比較多的這類設(shè)備。另外,由于一般嵌入式設(shè)備上只會有
一個操作系統(tǒng),所以bootloader的主要功能有所變化,不再是用來選擇操作
系統(tǒng),而是為了更快地在存儲介質(zhì)上下載linux內(nèi)核和文件系統(tǒng)(filesystem
包含了圖形用戶界面等應(yīng)用程序,將在后面介紹)。這是因為我們一般通過芯
片的JTAG口來實現(xiàn)引導(dǎo)程序的裝載,JTAG口的速度比較慢,對于只有十幾K大
小的bootloader來說,裝載的時間不會很長,可是針對一個功能完善的嵌入
式設(shè)備,比如PDA,它的軟件系統(tǒng)包括了linux內(nèi)核和以上的各種應(yīng)用,加在
一起最少都會有十幾兆,如果都通過JTAG來下載的話,恐怕幾個小時都是不
夠用的。而且通常內(nèi)核和應(yīng)用需要多次的修改和調(diào)試才得到最終的成熟的版
本,如此頻繁的下載要都通過JTAG來實現(xiàn),顯然是不現(xiàn)實的。因此,為了解
決這個問題,通常的做法是在bootloader中實現(xiàn)網(wǎng)卡或USB的驅(qū)動,通過網(wǎng)絡(luò)
或USB接口來實現(xiàn)軟件的下載功能。
目前流行的并可免費使用的linux引導(dǎo)裝載程序有Blob、U-boot、Redboot和Bootldr,它們可以廣泛地應(yīng)用在X86、ARM、PPC和MIPS等平臺上,對于基于ARM核設(shè)計的PXA255芯片,當(dāng)然也是適合的。
前面提到bootloader可以通過芯片的JTAG口下載到閃存上的,PXA255采用的就是這種方式。這種方式需要專用軟件。專用軟件可以直接與目標機(在嵌入式開發(fā)中,嵌入式設(shè)備通常被稱為目標)上的閃存設(shè)備進行交互并將引導(dǎo)裝載程序安裝在閃存的給定位置中。這個軟件使用目標系統(tǒng)上的 JTAG 端口,JTAG是用于執(zhí)行外部輸入(通常來自主機,及用作開發(fā)的PC機系統(tǒng))的指令的接口。JFlash-linux 是一種用于直接寫閃存的流行工具。它支持為數(shù)眾多的閃存芯片;它在主機上執(zhí)行并通過使用主機的并行端口與目標系統(tǒng)的JTAG接口訪問目標的閃存芯片。當(dāng)然,這意味著需要有專門的用來連接目標機JTAG口和主機并行接口的通訊線。主機和目標機的連接方式見圖1.1所示。
1.1目標機JTAG和主機并行端口的連接
Jflash-linuxlinuxwindows版本中都可使用,可以在命令行中用以下命令啟動它:
#Jflash-linux <bootloader>
還有某些種類的嵌入式芯片具有微小的引導(dǎo)代碼----根據(jù)幾個字節(jié)的指令----它將初始化一些 DRAM設(shè)置并啟用目標上的一個串行(或者 USB,或者以太網(wǎng))端口與主機程序通信。然后,主機程序或裝入程序可以使用這個連接將引導(dǎo)裝載程序傳送到目標上,并將它寫入閃存。
引導(dǎo)程序已裝載并給予其控制后,這個引導(dǎo)裝載程序執(zhí)行下列各類功能:
初始化CPU速度
初始化內(nèi)存,包括啟用內(nèi)存庫、初始化內(nèi)存配置寄存器等
初始化串行端口(如果在目標上有的話)
啟用指令/數(shù)據(jù)高速緩存
設(shè)置堆棧指針
設(shè)置參數(shù)區(qū)域并構(gòu)造參數(shù)結(jié)構(gòu)和標記(這是重要的一步,因為內(nèi)核在標
識根設(shè)備、頁面大小、內(nèi)存大小以及更多內(nèi)容時要使用引導(dǎo)參數(shù))
執(zhí)行 POST(加電自檢)來標識存在的設(shè)備并報告任何問題
為電源管理提供掛起/恢復(fù)支持
跳轉(zhuǎn)到內(nèi)核的開始
    可以看出,bootloader初始化了一個芯片的最小系統(tǒng),這是它另一個主要功能----檢查基本硬件系統(tǒng)的設(shè)計是否正確。
 
2  Linux內(nèi)核
    Linux的源代碼組織非常復(fù)雜,幸好我們不用將它們完全弄懂,現(xiàn)在我們需要的是知道各個部分的大致功能,然后再在以后開發(fā)過程中,針對不同的系統(tǒng)需求,修改內(nèi)核中特定的某個部分就可以了。下面首先來看看是linux源碼文件的組織結(jié)構(gòu):
kernel/               linux內(nèi)核(非常小)
lib/                  各種內(nèi)核需要使用的庫文件
MAINTAINERS           內(nèi)核各部分的維護者
mm/                   內(nèi)存管理單元
net/                  網(wǎng)絡(luò)系統(tǒng)
README                readme文件
REPORTING_BUGS        報告bug的指導(dǎo)
scripts/              一些腳本
security/             安全模式的實現(xiàn)                                   
sound/                聲卡支持和驅(qū)動
usr/                  工具
arch/                 硬件相關(guān)代碼
COPYING               linux拷貝條件(GNU GPL)
CREDITS               linux的主要貢獻者
crypto/               密碼庫
Documentation/        內(nèi)核文檔
drivers/              驅(qū)動程序
fs/                   文件系統(tǒng)
include/              內(nèi)核頭文件
include/asm-<arch>   硬件相關(guān)的頭文件
include/linux         內(nèi)核核心的頭文件
init                  linux初始化代碼
ipc/                  進程間通訊
Linux 社區(qū)正積極地為新硬件添加功能部件和支持、在內(nèi)核中修正錯誤并且及時地進行常規(guī)改進,也是導(dǎo)致目前內(nèi)核源代碼越來越龐大的原因。大約每 6 個月(或 6 個月不到)就有一個穩(wěn)定的 linux 樹的新發(fā)行版。不同的維護者維護針對特定體系結(jié)構(gòu)的不同內(nèi)核樹和補丁。當(dāng)為一個項目選擇了一個內(nèi)核時,您需要評估最新發(fā)行版的穩(wěn)定性如何、它是否符合項目要求和硬件平臺、從編程角度來看它的舒適程度以及其它難以確定的方面。還有一點也非常重要:找到需要應(yīng)用于基本內(nèi)核的所有補丁,以便為特定的體系結(jié)構(gòu)調(diào)整內(nèi)核。
內(nèi)核布局分為特定于體系結(jié)構(gòu)的部分和與體系結(jié)構(gòu)無關(guān)的部分。內(nèi)核中特定于體系結(jié)構(gòu)的部分首先執(zhí)行,設(shè)置硬件寄存器、配置內(nèi)存映射、執(zhí)行特定于體系結(jié)構(gòu)的初始化,然后將控制轉(zhuǎn)給內(nèi)核中與體系結(jié)構(gòu)無關(guān)的部分。系統(tǒng)的其余部分在這第二個階段期間進行初始化。內(nèi)核樹下的目錄 arch/ 由不同的子目錄組成,每個子目錄用于一個不同的體系結(jié)構(gòu)(MIPS、ARM、i386、SPARCPPC 等)。每一個這樣的子目錄都包含 kernel/ mm/ 子目錄,它們包含特定于體系結(jié)構(gòu)的代碼來完成象初始化內(nèi)存、設(shè)置 IRQ、啟用高速緩存、設(shè)置內(nèi)核頁面表等操作。一旦裝入內(nèi)核并給予其控制,就首先調(diào)用這些函數(shù),然后初始化系統(tǒng)的其余部分。
根據(jù)可用的系統(tǒng)資源和引導(dǎo)裝載程序的功能,內(nèi)核可以編譯成vmlinux、Image zImage。vmlinuxzImage之間的主要區(qū)別在于vmlinux是實際的(未壓縮的)可執(zhí)行文件,而zImage是或多或少包含相同信息的自解壓壓縮文件—--只是壓縮它以處理(通常是 Intel 強制的)640 KB 引導(dǎo)時間的限制。有關(guān)所有這些的權(quán)威性解釋,請參閱 Linux Magazine 的文章“Kernel Configuration: dealing with the unexpected。
 
3             工具鏈(Toolchain)
設(shè)置工具鏈在主機機器上創(chuàng)建一個用于編譯將在目標上運行的內(nèi)核和應(yīng)
用程序的構(gòu)建環(huán)境—--這是因為目標硬件可能沒有與主機兼容的二進制執(zhí)行級別。
工具鏈由一套用于編譯、匯編和鏈接內(nèi)核及應(yīng)用程序的組件組成。 這些組件包括:
Binutils
— 用于操作二進制文件的實用程序集合。它們包括諸如 ar、asobjdump、objcopy這樣的實用程序;
Gcc
GNU C編譯器;
Glibc
— 所有用戶應(yīng)用程序都將鏈接到的C庫。避免使用任何C庫函數(shù)的內(nèi)核和其它應(yīng)用程序可以在沒有該庫的情況下進行編譯。
    構(gòu)建工具鏈建立了一個交叉編譯器環(huán)境。本地編譯器編譯與本機同類的處理器的指令。交叉編譯器運行在某一種處理器上,卻可以編譯另一種處理器的指令。頭設(shè)置交叉編譯器工具鏈可不是一項簡單的任務(wù):它包括下載源代碼、修補補丁、配置、編譯、設(shè)置頭文件、安裝以及很多很多的操作。另外,這樣一個徹底的構(gòu)建過程對內(nèi)存和硬盤的需求是巨大的。如果沒有足夠的內(nèi)存和硬盤空間,那么在構(gòu)建階段由于相關(guān)性、配置或頭文件設(shè)置等問題會突然冒出許多問題。
    因此能夠從因特網(wǎng)上獲得已預(yù)編譯的二進制文件是一件好事(但不太好的一點是,目前它們大多數(shù)只限于基于ARM的系統(tǒng),但遲早會改變的)。一些比較流行的已預(yù)編譯的工具鏈包括那些來自CompaqFamiliar Linux )、LARTLART LinuxEmbedian(基于Debian但與它無關(guān))的工具鏈 — 所有這些工具鏈都用于基于ARM的平臺。Intel的PXA255芯片就是基于ARM設(shè)計的。
4   設(shè)備驅(qū)動程序
嵌入式系統(tǒng)通常有許多設(shè)備用于與用戶交互,象觸摸屏、小鍵盤、滾動
輪、傳感器、RS232接口、LCD等等。除了這些設(shè)備外,還有許多其它專用設(shè)
備,包括閃存、USB、GSM等。內(nèi)核通過所有這些設(shè)備各自的設(shè)備驅(qū)動程序來
控制它們,包括GUI用戶應(yīng)用程序也通過訪問這些驅(qū)動程序來訪問設(shè)備。
     開發(fā)者編寫驅(qū)動程序是應(yīng)該特別注意下面所提到的概念:編寫訪問硬
件的內(nèi)核代碼是不要給用戶強加任何策略。因為不同的用戶有不同的需求,
驅(qū)動程序應(yīng)該處理如何使硬件可用的問題,而將怎樣使用硬件的問題留給上
層應(yīng)用。因此,當(dāng)驅(qū)動程序只提供了訪問硬件的功能而沒有附加任何限制時
,這個驅(qū)動程序就比較靈活。然而,有時候我們也需要在驅(qū)動程序中實現(xiàn)一
些策略。例如,某個數(shù)字I/O驅(qū)動程序只提供了以字節(jié)為單位訪問硬件的方法
,這樣就省去了編寫額外代碼以處理單個數(shù)據(jù)位的麻煩。
 如果從另一個角度來看驅(qū)動程序,那么它可以被看作是應(yīng)用和實際設(shè)備
之間的一個軟件層。這種定位使開發(fā)者可以選擇如何展現(xiàn)設(shè)備特性:即使對于相同的設(shè)備,不同的驅(qū)動程序也可以提供不同的功能。實際的驅(qū)動程序設(shè)計應(yīng)該在許多考慮因素之間取得平衡。例如,某個驅(qū)動程序可能同時被多個進程使用,我們就應(yīng)該考慮如何處理并發(fā)的問題:可以在設(shè)備上實現(xiàn)獨立于硬件功能的內(nèi)存映射;也可以提供一個函數(shù)庫,以幫助應(yīng)用程序開發(fā)者在已有原語的基礎(chǔ)上實現(xiàn)新的策略??傊?,驅(qū)動程序的設(shè)計主要還是綜合考慮下面三方面的因素:提供給用戶盡量多的選項、編寫驅(qū)動程序占用較少的時間以及盡量保持程序簡單而不至于錯誤叢生。
本節(jié)著重討論通常幾乎在每個嵌入式環(huán)境中都會使用的一些重要設(shè)備的
設(shè)備驅(qū)動程序。
 
4.1 幀緩沖區(qū)驅(qū)動程序(FrameBuffer)
這是最重要的驅(qū)動程序之一,因為通過這個驅(qū)動程序才能使系統(tǒng)屏幕顯
示內(nèi)容。幀緩沖區(qū)驅(qū)動程序通常有三層。最底層是基本控制臺驅(qū)動程序
drivers/char/console.c,它提供了文本控制臺常規(guī)接口的一部分。通過使
用控制臺驅(qū)動程序函數(shù),我們能將文本打印到屏幕上 — 但圖形或動畫還不
能(這樣做需要使用視頻模式功能,通常出現(xiàn)在中間層,也就是drivers
/video/fbcon.c 中)。這個第二層驅(qū)動程序提供了視頻模式中繪圖的常規(guī)接
口。
幀緩沖區(qū)是顯卡上的內(nèi)存,需要將它內(nèi)存映射到用戶空間以便可以將圖
形和文本能寫到這個內(nèi)存段上:然后這個信息將反映到屏幕上。幀緩沖區(qū)支持提高了繪圖的速度和整體性能。這也是頂層驅(qū)動程序引人注意之處:頂層是非常特定于硬件的驅(qū)動程序,它需要支持顯卡不同的硬件方面 — 象啟用/禁用顯卡控制器、深度和模式的支持以及調(diào)色板等。所有這三層都相互依賴以實現(xiàn)正確的視頻功能。與幀緩沖區(qū)相對應(yīng)的設(shè)備是/dev/fb0(主設(shè)備號29,次設(shè)備號0)。可以用下面的命令來創(chuàng)建該設(shè)備:
#mknod /dev/fb0 c 29 0
有一個簡單的比喻來理解幀緩沖驅(qū)動。假設(shè)當(dāng)前需要的顯示分辨率是640x480x16bpp(16bpp代表16位色,一般的RGB排列為565,),那么要存儲整個屏幕的像素信息所需要的內(nèi)存大小為640x480x16/8 = 600K bytes(一個像素的16位色需要兩個字節(jié)來表示)。幀緩沖驅(qū)動即在內(nèi)存中分配了上述大小的一塊區(qū)域,同時與實際屏幕上的像素一一對應(yīng)。
如果我們要改變屏幕上某個像素的顏色顯示,首先計算該顏色的16位的RGB排列,然后計算出該像素在內(nèi)存中的偏移量,最后操作fb0設(shè)備,重畫該像素。下面的代碼將屏幕上的第二排的第二個像素設(shè)置成白色:
{
int fd, pixel_addr, pixel_color, ;
 
pixel_addr = (640+1)x16/8;      /* 得到像素偏移地址 */
pixel_color = 0xffff;           /* 設(shè)置像素點顏色 */
 
fd = open(/dev/fb0”, O_RDWR); /* 打開framebuffer設(shè)備 */
if (fd >= 0)
{
    lseek(fd, pixel_addr, SEEK_SET);    /* 找到該像素 */
    write(fd, pixel_color, 2);          /* 重畫該像素 */
}
現(xiàn)在一般的linux內(nèi)核已經(jīng)包含了對幀緩沖驅(qū)動的支持,我們要作的只是在內(nèi)核配置選項中加入它:
#make menuconfig(命令行下),或xconfig(XWindow下)。
與 frame buffer device有關(guān)的選項有(用空格鍵來進行選中或去除,其余編譯選項請參考其它資料):
Code maturity level opetions
   [*] Prompt for development and/or incomplete codes/drivers
   Console drivers
   [*] Video mode selection support
   ...
   [*] Support for frame buffer devices
   ...
   [*] VESA VGA graphics console
   ...
   [*] Advance low level driver options
   ...
[Exit]
[Exit]
Do you wish to save your new kernel configuration?
[Yes]
編譯安裝內(nèi)核:
#make dep
#make bzImage

4.2 輸入設(shè)備驅(qū)動程序
    可觸摸板是用于嵌入式設(shè)備的最基本的用戶交互設(shè)備之一 — 小鍵盤、傳感器和滾動輪也包含在許多不同設(shè)備中以用于不同的用途。
    觸摸板設(shè)備的主要功能是隨時報告用戶的觸摸,并標識觸摸的坐標。這通常在每次發(fā)生觸摸時,通過生成一個中斷來實現(xiàn)。然后,這個設(shè)備驅(qū)動程序的角色是每當(dāng)出現(xiàn)中斷時就查詢觸摸屏控制器,并請求控制器發(fā)送觸摸的坐標。一旦驅(qū)動程序接收到坐標,它就將有關(guān)觸摸和任何可用數(shù)據(jù)的信號發(fā)送給用戶應(yīng)用程序,并將數(shù)據(jù)發(fā)送給應(yīng)用程序(如果可能的話)。然后用戶應(yīng)用程序根據(jù)它的需要處理數(shù)據(jù)。
    幾乎所有輸入設(shè)備 — 包括小鍵盤 — 都以類似原理工作。
    輸入設(shè)備驅(qū)動程序通常需要與上層的GUI應(yīng)用接口。比如觸摸板需要和GUI的鼠標顯示結(jié)合起來,隨著用戶觸摸位置的不同,屏幕上鼠標的圖標移動到相應(yīng)的位置。一般在GUI中有專門處理外部輸入的文件,修改這些文件,可以支持自己的輸入設(shè)備。

4.3 閃存MTD驅(qū)動程序
MTD
設(shè)備是象閃存芯片、小型閃存卡、記憶棒等之類的設(shè)備,它們在嵌入
式設(shè)備中的使用正在不斷增長。
MTD
驅(qū)動程序是在linux下專門為嵌入式環(huán)境開發(fā)的新的一類驅(qū)動程序。
相對于常規(guī)塊設(shè)備驅(qū)動程序,使用MTD驅(qū)動程序的主要優(yōu)點在于MTD驅(qū)動程序
是專門為基于閃存的設(shè)備所設(shè)計的,所以它們通常有更好的支持、更好的管
理和基于扇區(qū)的擦除和讀寫操作的更好的接口。
 
5         嵌入式設(shè)備的文件系統(tǒng)
系統(tǒng)需要一種以結(jié)構(gòu)化格式存儲和檢索信息的方法這就需要文件系統(tǒng)的參與。文件系統(tǒng)指文件存在的物理空間,linux系統(tǒng)中每個分區(qū)都是一個文件系統(tǒng),都有自己的目錄層次結(jié)構(gòu)。Linux會將這些分屬不同分區(qū)的、單獨的文件系統(tǒng)按一定的方式形成一個系統(tǒng)的總的目錄層次結(jié)構(gòu)。一個操作系統(tǒng)的運行離不開對文件的操作,因此必然要擁有并維護自己的文件系統(tǒng)。
用戶可以根據(jù)可靠性、健壯性和/或增強的功能的需求來選擇文件系統(tǒng)的類型。下一節(jié)將討論幾個可用選項及其優(yōu)缺點。
5.1 第二版擴展文件系統(tǒng)(Ext2fs
    Ext2fslinux事實上的標準文件系統(tǒng),它已經(jīng)取代了它的前任 — 擴展文件系統(tǒng)(或Extfs)。Extfs支持的文件大小最大為2GB,支持的最大文件名稱大小為255個字符 — 而且它不支持索引節(jié)點(包括數(shù)據(jù)修改時間標記)。Ext2fs做得更好;它的優(yōu)點是:
Ext2fs
支持達4TB 的內(nèi)存。
Ext2fs
文件名稱最長可以到1012個字符。
當(dāng)創(chuàng)建文件系統(tǒng)時,管理員可以選擇邏輯塊的大小(通常大小可選擇 1024、20484096字節(jié))。
Ext2fs
實現(xiàn)快速符號鏈接:不需要為此目的而分配數(shù)據(jù)塊,并且將目標名稱直接存儲在索引節(jié)點(inode)表中。這使性能有所提高,特別是在速度上。
    因為Ext2文件系統(tǒng)的穩(wěn)定性、可靠性和健壯性,所以幾乎在所有基于 linux的系統(tǒng)(包括臺式機、服務(wù)器和工作站 — 并且甚至一些嵌入式設(shè)備)上都使用Ext2文件系統(tǒng)。然而,當(dāng)在嵌入式設(shè)備中使用Ext2fs時,它有一些缺點:
Ext2fs
是為象IDE設(shè)備那樣的塊設(shè)備設(shè)計的,這些設(shè)備的邏輯塊大小是512字節(jié),1K字節(jié)等這樣的倍數(shù)。這不太適合于扇區(qū)大小因設(shè)備不同而不同的閃存設(shè)備;
Ext2
文件系統(tǒng)沒有提供對基于扇區(qū)的擦除/寫操作的良好管理。在Ext2fs中,為了在一個扇區(qū)中擦除單個字節(jié),必須將整個扇區(qū)復(fù)制到RAM,然后擦除,然后重寫入??紤]到閃存設(shè)備具有有限的擦除壽命(大約能進行100,000次擦除),在此之后就不能使用它們,所以這不是一個特別好的方法
在出現(xiàn)電源故障時,Ext2fs不是防崩潰的;
Ext2
文件系統(tǒng)不支持損耗平衡,因此縮短了扇區(qū)/閃存的壽命(損耗平衡確保將地址范圍的不同區(qū)域輪流用于寫和/或擦除操作以延長閃存設(shè)備的壽命);
Ext2fs
沒有特別完美的扇區(qū)管理,這使設(shè)計塊驅(qū)動程序十分困難。
由于這些原因,通常相對于Ext2fs,在嵌入式環(huán)境中使用MTD/JFFS2組合是更好的選擇。

5.2 Ramdisk 掛裝 Ext2fs
Ramdisk是通過將計算機的RAM用作設(shè)備來創(chuàng)建和掛裝文件系統(tǒng)的一種機制,它通常用于無盤系統(tǒng)(當(dāng)然包括微型嵌入式設(shè)備,它只包含作為永久存儲媒質(zhì)的閃存芯片)。
    通過使用Ramdisk的概念,可以在嵌入式設(shè)備中創(chuàng)建并掛裝Ext2文件系統(tǒng)(以及用于這一目的的任何文件系統(tǒng))。
    下面的操作創(chuàng)建一個簡單的基于Ext2fsRamdisk
#mke2fs -vm0 /dev/ram 4096
#mount -t ext2 /dev/ram /mnt
#cd /mnt
#cp /bin, /sbin, /etc, /dev ... files in mnt
#cd ../
#umount /mnt
#dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk
mke2fs是用于在任何設(shè)備上創(chuàng)建ext2文件系統(tǒng)的實用程序 — 它創(chuàng)建超級塊、索引節(jié)點以及索引節(jié)點表等等。
    在上面的用法中,/dev/ram 是上面構(gòu)建有4096個塊的ext2文件系統(tǒng)的設(shè)備。然后,將這個設(shè)備(/dev/ram)掛裝在名為/mnt的臨時目錄上并且復(fù)制所有必需的文件。一旦復(fù)制完這些文件,就卸裝這個文件系統(tǒng)并且設(shè)備(/dev/ram)的內(nèi)容被轉(zhuǎn)儲到一個文件(ext2ramdisk)中,它就是所需的 RamdiskExt2文件系統(tǒng))。
    上面的順序創(chuàng)建了一個4MBRamdisk,并用必需的文件實用程序來填充它。
    一些要包含在 Ramdisk 中的重要目錄是:
/bin
— 保存大多數(shù)象init、busybox、shell、文件管理實用程序等二進制文件。
/dev
— 包含用在設(shè)備中的所有設(shè)備節(jié)點
/etc
— 包含系統(tǒng)的所有配置文件
/lib
— 包含所有必需的庫,如libc、libdl

5.3 日志閃存文件系統(tǒng),版本 2JFFS2
    瑞典的Axis Communications開發(fā)了最初的JFFSRed HatDavid Woodhouse對它進行了改進。 第二個版本,JFFS2,作為用于微型嵌入式設(shè)備的原始閃存芯片的實際文件系統(tǒng)而出現(xiàn)。JFFS2文件系統(tǒng)是日志結(jié)構(gòu)化的,這意味著它基本上是一長列節(jié)點。每個節(jié)點包含有關(guān)文件的部分信息 — 可能是文件的名稱、也許是一些數(shù)據(jù)。相對于 Ext2fsJFFS2 因為有以下這些優(yōu)點而在無盤嵌入式設(shè)備中越來越受歡迎:
JFFS2
在扇區(qū)級別上執(zhí)行閃存擦除/寫/讀操作要比Ext2文件系統(tǒng)好;
JFFS2
提供了比Ext2fs更好的崩潰/掉電安全保護。當(dāng)需要更改少量數(shù)據(jù)時,Ext2文件系統(tǒng)將整個扇區(qū)復(fù)制到內(nèi)存(DRAM)中,在內(nèi)存中合并新數(shù)據(jù),并寫回整個扇區(qū)。這意味著為了更改單個字,必須對整個扇區(qū)(64KB)執(zhí)行讀/擦除/寫例程 — 這樣做的效率非常低。要是運氣差,當(dāng)正在DRAM中合并數(shù)據(jù)時,發(fā)生了電源故障或其它事故,那么將丟失整個數(shù)據(jù)集合,因為在將數(shù)據(jù)讀入DRAM后就擦除了閃存扇區(qū)。JFFS2附加文件而不是重寫整個扇區(qū),并且具有崩潰/掉電安全保護這一功能。
這可能是最重要的一點:JFFS2是專門為象閃存芯片那樣的嵌入式設(shè)備創(chuàng)建的,所以它的整個設(shè)計提供了更好的閃存管理。
    因為本文主要是寫關(guān)于閃存設(shè)備的使用,所以在嵌入式環(huán)境中使用 JFFS2的缺點很少:
當(dāng)文件系統(tǒng)已滿或接近滿時,JFFS2會大大放慢運行速度。這是因為垃圾收集的問題。
    linux下,用mkfs.jffs2命令創(chuàng)建JFFS2文件系統(tǒng)(基本上是使用JFFS2Ramdisk)。
    下面的操作創(chuàng)建 JFFS2 文件系統(tǒng)
#mkdir jffsfile
#cd jffsfile

/* copy all the /bin, /etc, /usr/bin, /sbin/ binaries and /dev entries
that are needed for the filesystem here */

/* Type the following command under jffsfile directory to create the JFFS2 Image */

#./mkfs.jffs2 -e 0x40000 -p -o ../jffs.image
上面顯示了 mkfs.jffs2 的典型用法。-e選項確定閃存的擦除扇區(qū)大?。ㄍǔJ?/span>64千字節(jié))。-p選項用來在映像的剩余空間用零填充。-o選項用于輸出文件,通常是JFFS2文件系統(tǒng)映像 — 在本例中是jffs.image。一旦創(chuàng)建了 JFFS2文件系統(tǒng),它就被裝入閃存中適當(dāng)?shù)奈恢茫ㄒ龑?dǎo)裝載程序告知內(nèi)核查找文件系統(tǒng)的地址)以便內(nèi)核能掛裝它。

5.4 tmpfs
當(dāng)linux運行于嵌入式設(shè)備上時,該設(shè)備就成為功能齊全的單元,許多守
護進程會在后臺運行并生成許多日志消息。另外,所有內(nèi)核日志記錄機制,
syslogddmesgklogd,會在/var/tmp目錄下生成許多消息。由于這
些進程產(chǎn)生了大量數(shù)據(jù),所以允許將所有這些寫操作都發(fā)生在閃存是不可取
的。由于在重新引導(dǎo)時這些消息不需要持久存儲,所以這個問題的解決方案
是使用tmpfs。
tmpfs
是基于內(nèi)存的文件系統(tǒng),它主要用于減少對系統(tǒng)的不必要的閃存
寫操作這一唯一目的。因為tmpfs駐留在RAM中,所以寫/讀/擦除的操作發(fā)
生在RAM中而不是在閃存中。因此,日志消息寫入RAM而不是閃存中,在重新
引導(dǎo)時不會保留它們。tmpfs還使用磁盤交換空間來存儲,并且當(dāng)為存儲文件
而請求頁面時,使用虛擬內(nèi)存(VM)子系統(tǒng)。
tmpfs
的優(yōu)點包括:
動態(tài)文件系統(tǒng)大小 — 文件系統(tǒng)大小可以根據(jù)被復(fù)制、創(chuàng)建或刪除的文件或
目錄的數(shù)量來縮放。使得能夠最理想地使用內(nèi)存;
速度 — 因為tmpfs駐留在RAM,所以讀和寫幾乎都是瞬時的。即使以交換的
形式存儲文件,I/O操作的速度仍非???。
tmpfs的一個缺點是當(dāng)系統(tǒng)重新引導(dǎo)時會丟失所有數(shù)據(jù)。因此,重要的數(shù)
據(jù)不能存儲在tmpfs上。
諸如Ext2fsJFFS2等大多數(shù)其它文件系統(tǒng)都駐留在底層塊設(shè)備之上,而
tmpfs與它們不同,它直接位于VM上。因而,掛裝tmpfs文件系統(tǒng)是很簡單的
事:
/* Entries in /etc/rc.d/rc.sysinit for creating/using tmpfs */
# mount -t tmpfs tmpfs /var -o size=512k
# mkdir -p /var/tmp
# mkdir -p /var/log
# ln -s /var/tmp /tmp
上面的命令將在/var上創(chuàng)建tmpfs并將tmpfs的最大大小限制為512K。同時,tmp/log/目錄成為tmpfs的一部分以便在RAM中存儲日志消息。
    如果您想將tmpfs的一個項添加到/etc/fstab,那么它看起來象這樣:
tmpfs /var tmpfs size=32m 0 0
這將在/var上掛裝一個新的tmpfs文件系統(tǒng)。
 
6        圖形用戶界面(GUI)
從用戶的觀點來看,圖形用戶界面(GUI)是系統(tǒng)的一個最至關(guān)重要的方面:用戶通過GUI與系統(tǒng)進行交互。所以GUI應(yīng)該易于使用并且非??煽俊5€需要是有內(nèi)存意識的,以便在內(nèi)存受限的、微型嵌入式設(shè)備上可以無縫執(zhí)行。所以,它應(yīng)該是輕量級的,并且能夠快速裝入。
    另一個要考慮的重要方面涉及許可證問題。一些GUI分發(fā)版具有允許免費使用的許可證,甚至在一些商業(yè)產(chǎn)品中也是如此。另一些許可證要求如果想將GUI合并入項目中則要支付版稅。
盡管嵌入式系統(tǒng)對GUI的需求越來越明顯,但目前 GUI 的實現(xiàn)方法各有不同:
1.某些大型廠商有能力自己開發(fā)滿足自身需要的GUI系統(tǒng);
2.某些廠商沒有將GUI作為一個軟件層從應(yīng)用程序中剝離,GUI的支持邏輯由應(yīng)用程序自己負責(zé);
3.采用某些比較成熟的GUI系統(tǒng),比如XFree86或者其他。
在上述手段中,第2種方法是一種臨時解決方案。利用這種手段編寫的程序,無法將顯示邏輯和數(shù)據(jù)處理邏輯劃分開來,從而導(dǎo)致程序結(jié)構(gòu)不好,不便于調(diào)試,并導(dǎo)致大量的代碼重復(fù)。GUI是一種類似于操作系統(tǒng)的基礎(chǔ)軟件,這種軟件系統(tǒng)應(yīng)該遵循一定的標準,并且應(yīng)該是開放源碼的自由軟件,從而可以讓開放商集中精力開發(fā)自己的應(yīng)用程序。目前看來,在linux之上進行(實時)嵌入式系統(tǒng)開發(fā)的廠商,一般選擇如下幾種GUI系統(tǒng):緊縮的XFree86系統(tǒng)(Tiny-X)、MiniGUI、MicroWindows(Nano-X)、OpenGUI、QT/Embedded 等,下面將對這些系統(tǒng)進行簡單介紹。
 
6.1 緊縮的XFree86系統(tǒng)(Tiny-X)
    XFree86 Project, Inc.是一家生產(chǎn)XFree86的公司,該產(chǎn)品是一個可以免費重復(fù)分發(fā)、開放源碼的X Windows系統(tǒng)。X Windows系統(tǒng)(X11)為應(yīng)用程序以圖形方式進行顯示提供了資源,并且它是UNIX和類UNIX的機器上最常用的窗口系統(tǒng)。它很小但很有效,它運行在為數(shù)眾多的硬件上,它對網(wǎng)絡(luò)透明并且有良好的文檔說明。X11為窗口管理、事件處理、同步和客戶機間通信提供強大的功能 — 并且大多數(shù)開發(fā)人員已經(jīng)熟悉了它的API。它具有對內(nèi)核幀緩沖區(qū)的內(nèi)置支持,并占用非常少的資源 — 這非常有助于內(nèi)存相對較少的設(shè)備。X服務(wù)器支持VGA和非VGA圖形卡,它對顏色深度1、2、48、1632提供支持,并對渲染提供內(nèi)置支持。
它的優(yōu)點包括:
幀緩沖區(qū)體系結(jié)構(gòu)的使用提高了性能;
占用的資源相對很小 — 大小在600K700K字節(jié)的范圍內(nèi),這使它很容易在小型設(shè)備上運行;
非常好的支持:在線有許多文檔可用,還有許多專用于XFree86開發(fā)的郵遞列表;
X API
非常適合擴展。
它的缺點包括:
比最近出現(xiàn)的嵌入式 GUI 工具性能差。
此外,當(dāng)與 GUI 中最新的開發(fā) — 象專門為嵌入式環(huán)境設(shè)計的 Nano-X QT/Embedded — 相比時,XFree86似乎需要更多的內(nèi)存。
 
6.2 Microwindows(Nano-X)
Microwindows Century Software的開放源代碼項目,設(shè)計用于帶小
型顯示單元的微型設(shè)備。它有許多針對現(xiàn)代圖形視窗環(huán)境的功能部件。象X
樣,有多種平臺支持Microwindows。
Microwindows
體系結(jié)構(gòu)是基于客戶機/服務(wù)器的并且具有分層設(shè)計。最
底層是屏幕和輸入設(shè)備驅(qū)動程序(關(guān)于鍵盤或鼠標)來與實際硬件交互。在
中間層,可移植的圖形引擎提供對線的繪制、區(qū)域的填充、多邊形、裁剪以
及顏色模型的支持。
在最上層,Microwindows支持兩種APIWin32/WinCE API實現(xiàn),稱為
Microwindows;另一種APIGDK非常相似,它稱為Nano-X。Nano-X用在linux
上。它是象XAPI,用于占用資源少的應(yīng)用程序。
Microwindows支持12、4 8bpp(每像素的位數(shù))的palletized顯示
,以及 8、162432bpp的真彩色顯示。Microwindows還支持使它速度更快的幀緩沖區(qū)。Nano-X服務(wù)器占用的資源大約在100K150K字節(jié)。
    原始Nano-X應(yīng)用程序的平均大小在30K60K。由于Nano-X是為有內(nèi)存限制的低端設(shè)備設(shè)計的,所以它不象X那樣支持很多函數(shù),因此它實際上不能作為微型XXfree86)的替代品。
    可以在Microwindows上運行FLNX,它是針對Nano-X而不是X進行修改的 FLTK(快速輕巧工具箱(Fast Light Toolkit))應(yīng)用程序開發(fā)環(huán)境的一個版本。本章將在后面描述FLTK。
Nano-X
的優(yōu)點包括:
Xlib實現(xiàn)不同,Nano-X仍在每個客戶機上同步運行,這意味著一旦發(fā)送了客戶機請求包,服務(wù)器在為另一個客戶機提供服務(wù)之前一直等待,直到整個包都到達為止。這使服務(wù)器代碼非常簡單,而運行的速度仍非???/span>;
占用很小的資源。

Nano-X
的缺點包括:
聯(lián)網(wǎng)功能部件至今沒有經(jīng)過適當(dāng)?shù)卣{(diào)整(特別是網(wǎng)絡(luò)透明性);
還沒有太多現(xiàn)成的應(yīng)用程序可用;
X相比,Nano-X雖然近來正在加速開發(fā),但仍沒有那么多文檔說明而且沒有很好的支持,但這種情形應(yīng)該會有所改變。
 
6.3 OpenGUI
OpenGUI在linux系統(tǒng)上存在已經(jīng)很長時間了。最初的名字叫FastGL,只支持 256的線性顯存模式。但目前也支持其他顯示模式。這個庫是用C++編寫的,只提供 C++ 接口。
 
6.4 Qt/Embedded
Qt/Embedded
Trolltech新開發(fā)的用于嵌入式linux的圖形用戶界面系
統(tǒng)。Trolltech最初創(chuàng)建Qt作為跨平臺的開發(fā)工具用于linux臺式機。它支持
各種有UNIX特點的系統(tǒng)以及Microsoft Windows。KDE — 最流行的linux
面環(huán)境之一,就是用Qt編寫的。
Qt/Embedded
以原始Qt為基礎(chǔ),并做了許多出色的調(diào)整以適用于嵌入式環(huán)
境。Qt Embedded通過Qt APIlinux I/O設(shè)施直接交互。那些熟悉并已適應(yīng)
了面向?qū)ο缶幊痰娜藛T將發(fā)現(xiàn)它是一個理想環(huán)境。而且,面向?qū)ο蟮捏w系結(jié)
構(gòu)使代碼結(jié)構(gòu)化、可重用并且運行快速。與其它GUI相比,QtGUI非???,并
且它沒有分層,這使得Qt/Embedded成為用于運行基于Qt的程序的最緊湊環(huán)
境。
Trolltech
還推出了Qt掌上機環(huán)境(Qt Palmtop Environment,俗稱Qpe
)。Qpe提供了一個基本桌面窗口,并且該環(huán)境為開發(fā)提供了一個易于使用的
界面。Qpe包含全套的個人信息管理(Personal Information Management (PIM)
)應(yīng)用程序、因特網(wǎng)客戶機、實用程序等等。然而,為了將Qt/EmbeddedQpe
集成到一個產(chǎn)品中,需要從Trolltech獲得商業(yè)許可證。(原始Qt自版本 2.2
以后就可以根據(jù) GPL 獲得 。)
它的優(yōu)點包括:
面向?qū)ο蟮捏w系結(jié)構(gòu)有助于更快地執(zhí)行 ;
占用很少的資源,大約800K;
抗鋸齒文本和混合視頻的象素映射
它的缺點是:
Qt/EmbeddedQpe只能在獲得商業(yè)許可證的情況下才能使用。
 
6.5 MiniGUI 簡介
MiniGUI是近幾年國人自己開發(fā)的一種面向嵌入式系統(tǒng)或者實時系統(tǒng)的圖形用戶界面支持系統(tǒng)。當(dāng)初設(shè)計的初衷是面向工業(yè)領(lǐng)域這類資源存儲比較緊張又需要快速響應(yīng)的場合。它主要運行于linux控制臺,實際可以運行在任何一種具有POSIX線程支持的POSIX兼容系統(tǒng)上。MiniGUI剛誕生時是免費的,現(xiàn)在也需要購買商業(yè)許可證。
MiniGUI的優(yōu)點包括:
小巧,包含全部功能的庫文件大小為300k左右;
運行速度快;
可根據(jù)項目需求進行定知和配置。
MiniGUI的缺點有:
控件制作比較粗糙;
需要商業(yè)許可證。
 
7       圖形化的開發(fā)工具FLTK
FLTK是一個簡單但靈活的GUI工具箱,它在linux世界中贏得越來越多的關(guān)注,它特別適用于占用資源很少的環(huán)境。它提供了您期望從GUI工具箱中獲得的大多數(shù)窗口構(gòu)件,如按鈕、對話框、文本框以及出色的“賦值器”選擇(用于輸入數(shù)值的窗口構(gòu)件)。還包括滑動器、滾動條、刻度盤和其它一些構(gòu)件。
    針對 Microwindows GUI引擎的FLTK linux版本被稱為FLNX。FLNX由兩個組件構(gòu)成:Fl_WidgetFLUIDFl_Widget由所有基本窗口構(gòu)件API組成。FLUID(快速輕巧的用戶界面設(shè)計器(Fast Light User Interface Designer, FLUID))是用來產(chǎn)生FLTK源代碼的圖形編輯器。總的來說,FLNX是能用來為嵌入式環(huán)境創(chuàng)建應(yīng)用程序的一個出色的UI構(gòu)建器。
    Fl_Widget占用的資源大約是40K48K,而FLUID(包括了每個窗口構(gòu)件)大約占用380K。這些非常小的資源占用率使Fl_WidgetFLUID在嵌入式開發(fā)世界中非常受歡迎。
優(yōu)點包括:
習(xí)慣于在象Windows這樣已建立得較好的環(huán)境中開發(fā)基于GUI的應(yīng)用程序的任何人都會非常容易地適應(yīng)FLTK環(huán)境;
它的文檔包括一本十分完整且編寫良好的手冊;
它使用LGPL進行分發(fā),所以開發(fā)人員可以靈活地發(fā)放他們應(yīng)用程序的許可證;
FLTK
是一個C++庫(PerlPython綁定也可用)。面向?qū)ο竽P偷倪x擇是一個好的選擇,因為大多數(shù)現(xiàn)代GUI環(huán)境都是面向?qū)ο蟮?;這也使將編寫的應(yīng)用程序移植到類似的API中變得更容易;
Century Software
的環(huán)境提供了幾個有用的工具,諸如ScreenToPViewML瀏覽器。

它的缺點是:
普通的FLTK可以與XWindows API一同工作,而FLNX不能。它與X的不兼容性阻礙了它在許多項目中的使用。

嵌入式linux開發(fā)正如火如荼迅速發(fā)展著。作為一個開發(fā)者,每天都會
接觸到各種新鮮的軟件的知識,必須不斷地從中學(xué)習(xí),豐富自己的知識,拓
展自己的眼界。在開發(fā)過程中,從引導(dǎo)裝載程序和分發(fā)版到文件系統(tǒng)和GUI
的每一個事物的各種選項中作出選擇。Linux上的嵌入式開發(fā)已經(jīng)達到了新的
境界,并且調(diào)整模塊以適合您的規(guī)范從未比現(xiàn)在更簡單。這已經(jīng)導(dǎo)致出現(xiàn)了
許多時新的手持和微型設(shè)備作為開放盒,這是件好事 — 因為事實是您不必
成為一個專家從這些模塊中進行選擇來調(diào)整您的設(shè)備以滿足您自己的要求和
需要。
我們希望以上對嵌入式linux領(lǐng)域的介紹性概述能激起您進行試驗的欲
望,并且希望您將體會擺弄微型設(shè)備的樂趣以滿足您的愛好。就從現(xiàn)在開始
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
嵌入式系統(tǒng)開發(fā)
Embedded Linux Primer
嵌入式linux大全
嵌入式Linux的應(yīng)用基礎(chǔ)知識介紹
高級文件系統(tǒng)實現(xiàn)者指南
嵌入式系統(tǒng)存儲器淺談
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服