關于嵌入式設備上的Linux 系統(tǒng)開發(fā)
};
setup_arch 還需要對閃存存儲庫、系統(tǒng)寄存器和其它特定設備執(zhí)行內存映射。一旦完成了特定于體系結構的設置,控制就返回到初始化系統(tǒng)其余部分的 start_kernel 函數(shù)。這些附加的初始化任務包含:
設置陷阱
初始化中斷
初始化計時器
初始化控制臺
調用 mem_init ,它計算各種區(qū)域、高內存區(qū)等內的頁面數(shù)量
初始化 slab 分配器并為 VFS、緩沖區(qū)高速緩存等創(chuàng)建 slab 高速緩存
建立各種文件系統(tǒng),如 proc、ext2 和 JFFS2
創(chuàng)建 kernel_thread ,它執(zhí)行文件系統(tǒng)中的 init 命令并顯示 lign 提示符。 如果在 /bin、/sbin 或 /etc 中沒有 init 程序,那么內核將執(zhí)行文件系統(tǒng)的 /bin 中的 shell。
設備驅動程序
嵌入式系統(tǒng)通常有許多設備用于與用戶交互,象觸摸屏、小鍵盤、滾動輪、傳感器、RA232 接口、LCD 等等。除了這些設備外,還有許多其它專用設備,包括閃存、USB、GSM 等。內核通過所有這些設備各自的設備驅動程序來控制它們,包括 GUI 用戶應用程序也通過訪問這些驅動程序來訪問設備。本節(jié)著重討論通常幾乎在每個嵌入式環(huán)境中都會使用的一些重要設備的設備驅動程序。
幀緩沖區(qū)驅動程序
這是最重要的驅動程序之一,因為通過這個驅動程序才能使系統(tǒng)屏幕顯示內容。幀緩沖區(qū)驅動程序通常有三層。最底層是基本控制臺驅動程序 drivers/char/console.c,它提供了文本控制臺常規(guī)接口的一部分。通過使用控制臺驅動程序函數(shù),我們能將文本打印到屏幕上 D 但圖形或動畫還不能(這樣做需要使用視頻模式功能,通常出現(xiàn)在中間層,也就是 drivers/video/fbcon.c 中)。這個第二層驅動程序提供了視頻模式中繪圖的常規(guī)接口。
幀緩沖區(qū)是顯卡上的內存,需要將它內存映射到用戶空間以便可以將圖形和文本能寫到這個內存段上:然后這個信息將反映到屏幕上。幀緩沖區(qū)支持提高了繪圖的速度和整體性能。這也是頂層驅動程序引人注意之處:頂層是非常特定于硬件的驅動程序,它需要支持顯卡不同的硬件方面 D 象啟用/禁用顯卡控制器、深度和模式的支持以及調色板等。所有這三層都相互依賴以實現(xiàn)正確的視頻功能。與幀緩沖區(qū)有關的設備是 /dev/fb0(主設備號 29,次設備號 0)。
輸入設備驅動程序
可觸摸板是用于嵌入式設備的最基本的用戶交互設備之一 D 小鍵盤、傳感器和滾動輪也包含在許多不同設備中以用于不同的用途。
觸摸板設備的主要功能是隨時報告用戶的觸摸,并標識觸摸的坐標。這通常在每次發(fā)生觸摸時,通過生成一個中斷來實現(xiàn)。
然后,這個設備驅動程序的角色是每當出現(xiàn)中斷時就查詢觸摸屏控制器,并請求控制器發(fā)送觸摸的坐標。一旦驅動程序接收到坐標,它就將有關觸摸和任何可用數(shù)據(jù)的信號發(fā)送給用戶應用程序,并將數(shù)據(jù)發(fā)送給應用程序(如果可能的話)。然后用戶應用程序根據(jù)它的需要處理數(shù)據(jù)。
幾乎所有輸入設備 D 包括小鍵盤 D 都以類似原理工作。
閃存 MTD 驅動程序
MTD 設備是象閃存芯片、小型閃存卡、記憶棒等之類的設備,它們在嵌入式設備中的使用正在不斷增長。
MTD 驅動程序是在 Linux 下專門為嵌入式環(huán)境開發(fā)的新的一類驅動程序。相對于常規(guī)塊設備驅動程序,使用 MTD 驅動程序的主要優(yōu)點在于 MTD 驅動程序是專門為基于閃存的設備所設計的,所以它們通常有更好的支持、更好的管理和基于扇區(qū)的擦除和讀寫操作的更好的接口。Linux 下的 MTD 驅動程序接口被劃分為兩類模塊:用戶模塊和硬件模塊。
用戶模塊
這些模塊提供從用戶空間直接使用的接口:原始字符訪問、原始塊訪問、FTL(閃存轉換層,F(xiàn)lash Transition Layer D 用在閃存上的一種文件系統(tǒng))和 JFS(即日志文件系統(tǒng),Journaled File System D 在閃存上直接提供文件系統(tǒng)而不是模擬塊設備)。用于閃存的 JFS 的當前版本是 JFFS2(稍后將在本文中描述)。
硬件模塊
這些模塊提供對內存設備的物理訪問,但并不直接使用它們。通過上述的用戶模塊來訪問它們。這些模塊提供了在閃存上讀、擦除和寫操作的實際例程。
MTD 驅動程序設置
為了訪問特定的閃存設備并將文件系統(tǒng)置于其上,需要將 MTD 子系統(tǒng)編譯到內核中。這包括選擇適當?shù)?MTD 硬件和用戶模塊。當前,MTD 子系統(tǒng)支持為數(shù)眾多的閃存設備 D 并且有越來越多的驅動程序正被添加進來以用于不同的閃存芯片。
有兩個流行的用戶模塊可啟用對閃存的訪問: MTD_CHAR 和 MTD_BLOCK 。
MTD_CHAR 提供對閃存的原始字符訪問,而 MTD_BLOCK 將閃存設計為可以在上面創(chuàng)建文件系統(tǒng)的常規(guī)塊設備(象 IDE 磁盤)。與 MTD_CHAR 關聯(lián)的設備是 /dev/mtd0、mtd1、mtd2(等等),而與 MTD_BLOCK 關聯(lián)的設備是 /dev/mtdblock0、mtdblock1(等等)。由于 MTD_BLOCK 設備提供象塊設備那樣的模擬,通常更可取的是在這個模擬基礎上創(chuàng)建象 FTL 和 JFFS2 那樣的文件系統(tǒng)。
為了進行這個操作,可能需要創(chuàng)建分區(qū)表將閃存設備分拆到引導裝載程序節(jié)、內核節(jié)和文件系統(tǒng)節(jié)中。樣本分區(qū)表可能包含以下信息:
清單 5. MTD 的簡單閃存設備分區(qū)
struct mtd_partition sample_partition = {
{
/* First partition */
name : bootloader, /* Bootloader section */
size : 0x00010000, /* Size */
offset : 0, /* Offset from start of flash- location 0x0*/
mask_flags : MTD_WRITEABLE /* This partition is not writable */
},
{ /* Second partition */
name : Kernel, /* Kernel section */
size : 0x00100000, /* Size */
offset : MTDPART_OFS_APPEND, /* Append after bootloader section */
mask_flags : MTD_WRITEABLE /* This partition is not writable */
},
{ /* Third partition */
name : JFFS2, /* JFFS2 filesystem */
size : MTDPART_SIZ_FULL, /* Occupy rest of flash */
offset : MTDPART_OFS_APPEND /* Append after kernel section */
}
}
上面的分區(qū)表使用了 MTD_BLOCK 接口對閃存設備進行分區(qū)。這些分區(qū)的設備節(jié)點是:
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論