|
重慶有什么好的嵌入式培訓(xùn)機(jī)構(gòu)_嵌入式Linux文件系統(tǒng)的構(gòu)建,
嵌入式產(chǎn)品已經(jīng)滲透到人們生活的方方面面,特別是在數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展的今天,手持信息產(chǎn)品正拓展著一片越來(lái)越大的市場(chǎng),PDA、手機(jī)、掌上電腦、信息家電等各式手持產(chǎn)品已擁有了龐大的用戶群。手持信息產(chǎn)品所運(yùn)用的最關(guān)鍵的核心技術(shù)就是嵌入式操作系統(tǒng)。人們對(duì)嵌入式產(chǎn)品的需求也不再僅僅是功能單一的電子詞典類產(chǎn)品,嵌入式操作系統(tǒng)逐步成為嵌入式產(chǎn)品的核心。而其中,Linux以其開(kāi)源的內(nèi)核和免費(fèi)的應(yīng)用程序、能夠自由地移植和開(kāi)發(fā)的優(yōu)勢(shì),更迎合嵌入式市場(chǎng)。嵌入式Linux的開(kāi)發(fā)大致可分為三個(gè)層次:引導(dǎo)裝載內(nèi)核、構(gòu)造文件系統(tǒng)和圖形用戶界面。作為操作系統(tǒng)重要組成部分的文件系統(tǒng),決定了操作系統(tǒng)本身的信息和用戶的數(shù)據(jù)在存儲(chǔ)設(shè)備上的組織形式。對(duì)嵌入式文件系統(tǒng)的研究、設(shè)計(jì)和開(kāi)發(fā)也逐漸成為嵌入式系 統(tǒng)研究領(lǐng)域的一個(gè)方向。
嵌入式Linux 文件系統(tǒng)
文件系統(tǒng)是指在一個(gè)物理設(shè)備上的任何文件組織和目錄,它構(gòu)成了Linux系統(tǒng)上所有數(shù)據(jù)的基礎(chǔ),Linux程序、庫(kù)、系統(tǒng)文件和用戶 文件都駐留其中,因此,它是系統(tǒng)中龐大復(fù)雜且又是最為基本和重要的資源。值得提出的是,Linux系統(tǒng)中的文件不僅包括普通的 文件和目錄,每個(gè)和設(shè)備相關(guān)的實(shí)際實(shí)體也都被映射為一個(gè)文件,例如磁盤、打印機(jī)、終端等等。這樣的設(shè)備文件又稱為特殊文件 。所以,Linux下的文件是操作系統(tǒng)服務(wù)和設(shè)備的簡(jiǎn)單而又統(tǒng)一的接口,從某種意義上可以說(shuō),Linux里的一切事物都是文件。
在Linux中,文件系統(tǒng)的結(jié)構(gòu)是基于樹狀的,根在頂部,各個(gè)目錄和文件從樹根向下分支。目錄樹的最頂端被稱為根目錄(/)。在后面介紹的所構(gòu)造文件系統(tǒng)結(jié)構(gòu)圖(圖1)即顯示了樹狀的文件系統(tǒng)。Linux操作系統(tǒng)由一些目錄和許多文件組成,例如,圖中的/bi n目錄包含二進(jìn)制文件的可執(zhí)行程序,/sbin目錄用于存儲(chǔ)管理系統(tǒng)的二進(jìn)制文件,/etc目錄包含絕大部分的Linux系統(tǒng)配置文件 ,/lib目錄存儲(chǔ)程序運(yùn)行時(shí)使用的共享庫(kù),/dev目錄包含稱為設(shè)備文件的特殊文件,/proc目錄實(shí)際上是一個(gè)虛擬文件系統(tǒng),/tmp目錄用于存儲(chǔ)程序運(yùn)行時(shí)生成的臨時(shí)文件,/home目錄是用戶起始目錄的基礎(chǔ)目錄,/var目錄保存要隨時(shí)改變大小的文件,/usr目錄及其子目錄對(duì)Linux系統(tǒng)的操作非常重要,它保存著系統(tǒng)上的一些最重要的程序以及包含你安裝的大型軟件包。
由于Linux是一個(gè)多任務(wù)、多用戶的操作系統(tǒng),因此它里面的文件還都被賦予了一定的權(quán)限,權(quán)限決定誰(shuí)能讀、寫或執(zhí)行一個(gè)文件,以及這個(gè)文件的類型和如何執(zhí)行。例如下面的文件列表:
-rw-r-r-- 1 root root 1756 Sep 9 2005 inittab
其表示:這個(gè)名為inittab的文件是普通文件,所有者有讀寫的權(quán)限,所在組和其他人都只有讀的權(quán)限,它的連接數(shù)為1,所有者及 文件所屬的組都是root,文件中字節(jié)數(shù)為1756,文件創(chuàng)建日期是2005年9月9日。我們可以通過(guò)對(duì)文件屬性的設(shè)置,來(lái)滿足文件在不同用戶組、不同用戶操作下的不同狀態(tài)。
由于嵌入式設(shè)備的一些特殊性,使得嵌入式文件系統(tǒng)除了滿足一般文件系統(tǒng)的基本要求外,還有一些自身的特性:
文件系統(tǒng)面對(duì)的存儲(chǔ)介質(zhì)特殊;
文件系統(tǒng)有快速恢復(fù)的特殊要求;
物理文件系統(tǒng)的多樣性和動(dòng)態(tài)可裝配性;
需要文件系統(tǒng)具有跨操作平臺(tái)的安全性;
文件系統(tǒng)要能滿足整個(gè)系統(tǒng)的實(shí)時(shí)性要求。
嵌入式文件系統(tǒng)有安全性和均衡負(fù)載這樣的要求,而日志型文件系統(tǒng)可以很好地解決安全性的問(wèn)題。經(jīng)過(guò)幾年來(lái)的發(fā)展。日志型的嵌入式文件系統(tǒng)已成為嵌入式文件系統(tǒng)的主流。1999年。Axis
Communications AB發(fā)布了JFFS(JournalingFlash File System)的 第一個(gè)版本。這是一個(gè)專門為嵌入式系統(tǒng)的Flash設(shè)備而設(shè)計(jì)的文件系統(tǒng),同時(shí)它也是一個(gè)日志型的文件系統(tǒng)。JFFS2是JFFS的第二 個(gè)版本,于2001年發(fā)布,并得到了Red Hat的支持,成為Red Hat嵌入式操作系統(tǒng)eCos的文件系統(tǒng)。Flash存儲(chǔ)容量的有限性決定了J FFS是一個(gè)小尺寸的文件系統(tǒng)。因而在文件系統(tǒng)的內(nèi)部設(shè)計(jì)上采用了許多簡(jiǎn)化處理。同時(shí),它們結(jié)合了Flash設(shè)備的讀寫特性和嵌入式文件系統(tǒng)的防斷電特性,使得JFFS成為適合于嵌入式系統(tǒng)上針對(duì)Flash設(shè)備的文件系統(tǒng)的理想選擇。
嵌入式Linux 文件系統(tǒng)的設(shè)計(jì)
● 實(shí)驗(yàn)主機(jī)和目標(biāo)平臺(tái)的連接
實(shí)驗(yàn)主機(jī)和目標(biāo)平臺(tái)的連接有兩種方法。一種是以太網(wǎng)連接,這種連接方式可以進(jìn)行內(nèi)核文件、根文件系統(tǒng)映像文件的下載。另一 種是串口連接,這樣的連接方式可以供調(diào)試之用。對(duì)于以太網(wǎng)連接,作者使用一根普通網(wǎng)線,將實(shí)驗(yàn)主機(jī)和目標(biāo)平臺(tái)都連接在Hub 上。這樣做既簡(jiǎn)單,也不妨礙實(shí)驗(yàn)主機(jī)與外部網(wǎng)絡(luò)的通訊。對(duì)于串口連接,用一根串口線連接目標(biāo)平臺(tái)的Ful Function UART(FFUA RT)串口和實(shí)驗(yàn)主機(jī)的串口。主要是在調(diào)試階段使用這種連接方式,在目標(biāo)平臺(tái)的標(biāo)準(zhǔn)輸入還未被驅(qū)動(dòng)的情況下。用實(shí)驗(yàn)主機(jī)的標(biāo)準(zhǔn)輸入控制目標(biāo)平臺(tái),向目標(biāo)平臺(tái)發(fā)控制命令。
● 構(gòu)建文件系統(tǒng)
首先建立一個(gè)文件系統(tǒng)的工作空間。創(chuàng)建目錄/bome/work,我們所構(gòu)造的文件系統(tǒng)就在work這個(gè)目錄中。建立基本目錄,如:bin,dev,etc,lib,mnt,proc,sbin,tmp,usr,vat,tools具體結(jié)構(gòu)圖見(jiàn)圖1(圖中所顯示的文件都是目錄文件)。其中,tools是便于開(kāi)發(fā)而創(chuàng)建的目錄。因?yàn)檎麄(gè)系統(tǒng)要求盡量小,所以應(yīng)只包含一些必須的二進(jìn)制程序。而開(kāi)發(fā)過(guò)程中需要用到的命令就放在 tools中,將PATH 包含tools即可。/etc目錄下只包含了一些啟動(dòng)過(guò)程的配置文件,/lib目錄下的modules于目錄包含了可動(dòng)態(tài)加載到核心的各種模塊。另外,目錄var下還應(yīng)創(chuàng)建兩個(gè)子目錄log和run,負(fù)責(zé)記錄系統(tǒng)的日志和運(yùn)行狀態(tài)。整個(gè)文件系統(tǒng)中除了tmp 和var目錄放在SDRAM內(nèi)以外,其他所有目錄都放在Flash中,因?yàn)閠rap和var中的內(nèi)容需要經(jīng)常寫入,所以放在可讀寫的RAM里。
插圖1: 構(gòu)建文件系統(tǒng)的樹狀結(jié)構(gòu)
當(dāng)在目標(biāo)平臺(tái)實(shí)現(xiàn)了一個(gè)嵌入式Linux之后,為了很好地管理操作系統(tǒng)和用戶的數(shù)據(jù)文件,引入了文件系統(tǒng)。物理文件系統(tǒng)是JFFS2 ,考慮到擴(kuò)充物理文件系統(tǒng)的要求,保留了Linux的VFS層次?紤]到存儲(chǔ)設(shè)備擴(kuò)充的要求,在Linux內(nèi)核中加入了對(duì)MTD設(shè)備的支持。根據(jù)上面的敘述,可給出整個(gè)文件系統(tǒng)的體系結(jié)構(gòu)圖,見(jiàn)圖2所示。[!--empirenews.page--]
插圖2: 文件系統(tǒng)體系結(jié)構(gòu)
構(gòu)建文件系統(tǒng)最基本的要求就是系統(tǒng)能夠在此基礎(chǔ)上啟動(dòng)運(yùn)行起來(lái),所以,/sbin下的init程序必不可少。init程序是引導(dǎo)過(guò)程完成后內(nèi)核運(yùn)行的第一個(gè)程序,它能啟動(dòng)全部其他程序。只要init完成運(yùn)行全部必要的程序,系統(tǒng)就開(kāi)始建立并開(kāi)始運(yùn)行。當(dāng)程序開(kāi)始啟動(dòng)時(shí),init讀取一個(gè)配置文件inittab,這個(gè)文件位于/etc下,它確定了init在啟動(dòng)和關(guān)機(jī)時(shí)的工作特性。在我們開(kāi)發(fā)的這個(gè)嵌入式系統(tǒng)中,所有的文件內(nèi)容只需保留與開(kāi)發(fā)要求有關(guān)的必須部分。
這個(gè)系統(tǒng)運(yùn)行單用戶模式啟動(dòng):?jiǎn)?dòng)后立即運(yùn)行rc.sysinit腳本,進(jìn)行系統(tǒng)初始化動(dòng)作。rc.sysinit腳本也進(jìn)行了精簡(jiǎn),只保留了以讀寫的方式重新加載(mount)根文件系統(tǒng)的操作(內(nèi)核啟動(dòng)時(shí)只以只讀的方式加載了根文件系統(tǒng)),具體rc.sysinit腳本中的內(nèi)容 如下:
# Remount the root filesystem read-write
# mount -n -o remount.rw / mount -o remount.rw -n/dev/mtdblock2/mount -a優(yōu)質(zhì)嵌入式簡(jiǎn)歷, 嵌入式電器能后裝嗎, 嵌入式與qt, 嵌入式音響瓦數(shù), 嵌入式軟件與通信, 吉博嵌入式馬桶視頻, 嵌入式殺毒u盤, 嵌入式培訓(xùn)學(xué)什么, 嵌入式和上位機(jī)區(qū)別, 嵌入式開(kāi)發(fā)占內(nèi)存嗎, 嵌入式大一職業(yè)規(guī)劃, keil5嵌入式, 鋁合金嵌入式地毯, 社會(huì)工作中的嵌入式, 嵌入式寄存器, 通信工程嵌入式考研, 嵌入式系統(tǒng)方向未來(lái), 嵌入式系統(tǒng)常見(jiàn)實(shí)例, 嵌入式音樂(lè)功放機(jī), 嵌入式計(jì)時(shí)器秒表,
為了開(kāi)發(fā)過(guò)程用戶與系統(tǒng)能進(jìn)行交互,啟動(dòng)了/bin/bash這個(gè)命令解釋器。用戶在鍵盤上輸入某些命令,bash將讀取輸入加以解析然后執(zhí)行該程序。/tools中的telnetd和/sbin中的pppd分別是遠(yuǎn)程登陸和串口通訊的后臺(tái)程序,加入它們也是為了方便開(kāi)發(fā)。
另外,為了盡量精簡(jiǎn)內(nèi)核,程序都以動(dòng)態(tài)鏈接庫(kù)文件的方式編譯,即當(dāng)程序運(yùn)行到所需庫(kù)文件時(shí)才動(dòng)態(tài)加載。所以保證庫(kù)文件的完整性就顯得相當(dāng)重要。為確保運(yùn)行各種程序都能在/lib目錄中找到合適的庫(kù)文件,就干脆對(duì)/lib中的庫(kù)文件不作任何刪減,而完整的/lib目錄(含子目錄及全部庫(kù)文件)也不過(guò)2MB 大小。
● 配置文件系統(tǒng)用戶
這一步驟的實(shí)現(xiàn),體現(xiàn)了該嵌入式操作系統(tǒng)的一大特色---安全性。為了防止系統(tǒng)中的文件被誤改或被惡意破壞,我們?cè)O(shè)置組和用戶,讓只有隸屬于特定組的特定用戶才能對(duì)特定的程序進(jìn)行合法操作。/etc目錄中沒(méi)有列入管理組的group文件和管理用戶的pass wd文件,所以在設(shè)置文件或目錄的所有權(quán)時(shí),全部用id號(hào)來(lái)代替組名和用戶名。用chown命令來(lái)改變文件的所有權(quán),如chown 0.0 i nittab(前一個(gè)“0”代表屬組,后一個(gè)“0”代表用戶),修改后的inittab文件的詳細(xì)信息為:-rw-r-r-- 1 0 0 237 Jul 26 l0:30 inittab
將系統(tǒng)中所有的文件和目錄按照其具體類型和要求,為其設(shè)定特定的組和用戶對(duì)它的所有權(quán)。例如,/etc中的module.conf配置文件的所有權(quán)是module組和module用戶。那么只有組和用戶同為module的程序(比如/lib/modules/中的程序)才有權(quán)查看module.c onf文件,其他非root用戶的程序都打不開(kāi)這個(gè)文件。這樣,除了root用戶,其他不具有操作權(quán)限的用戶就不可能對(duì)那些特殊文件, 如有關(guān)網(wǎng)絡(luò)、安全等重要信息進(jìn)行執(zhí)行和修改。而擁有root用戶權(quán)限的文件只有init和bash兩個(gè)。init用于完成系統(tǒng)的初始化過(guò)程,并不涉及對(duì)其他文件和程序的操作;bash是開(kāi)發(fā)過(guò)程中用戶與系統(tǒng)交互的需要,便于對(duì)文件系統(tǒng)進(jìn)行修改,開(kāi)發(fā)完成后的實(shí)際系統(tǒng)并不需要bash,可刪除。這樣,各個(gè)文件和程序均在自己所屬的組和用戶中運(yùn)行,不會(huì)互相干擾。使得整個(gè)系統(tǒng)有條不紊,不會(huì)發(fā)生程序越權(quán)誤操作的現(xiàn)象。保證了操作系統(tǒng)本身的安全性,也讓試圖竊取或破壞數(shù)據(jù)的攻擊者無(wú)機(jī)可乘。
根據(jù)需要,在基本文件系統(tǒng)上添加應(yīng)用程序基本文件系統(tǒng)完成后,再根據(jù)開(kāi)發(fā)的實(shí)際要求,在上面再構(gòu)筑一些應(yīng)用和服務(wù)。例如,對(duì)于所需求的網(wǎng)絡(luò)功能,我們?cè)?bin 中加入netstat、ping,在/sbin中加入ifconfig、route、xinetd等網(wǎng)絡(luò)程序:為了將一些服務(wù)以模塊的方式加載,以緩解內(nèi)核的負(fù)擔(dān) ,我們?cè)?sbin中加入了insmod、lsmod、modprobe、depmod、rmmod等有關(guān)操作模塊的命令。還有,為了搭建開(kāi)發(fā)過(guò)程的交叉編譯的環(huán)境,需要用到串口通訊,所以在/sbin中加入pppd的命令,在/etc中加入PPP目錄及其配置文件等等。
到此,一個(gè)滿足系統(tǒng)需求的嵌入式Linux文件系統(tǒng)就基本構(gòu)造完成。為了系統(tǒng)能在特定的嵌入式硬件設(shè)備上運(yùn)行,系統(tǒng)中所有的二進(jìn)制文件都必須是經(jīng)過(guò)特定的嵌入式開(kāi)發(fā)編譯工具編譯,將編譯好的文件系統(tǒng)燒至嵌入式系統(tǒng)的開(kāi)發(fā)板中,調(diào)通串口,就可以進(jìn)行調(diào)試和進(jìn)一步的開(kāi)發(fā)了。
嵌入式Linux 文件系統(tǒng)的進(jìn)一步開(kāi)發(fā)
按照上一部份給出的文件系統(tǒng)體系結(jié)構(gòu),文件系統(tǒng)的實(shí)現(xiàn)主要在VFS層、物理文件系統(tǒng)層和MTD層。在Linux 2.4以后的版本中,JFFS2已經(jīng)作為一種標(biāo)準(zhǔn)的文件系統(tǒng)被支持,所以使得Linux的VFS支持JFFS2并不是一件難事,在源代碼中也不用做修改。下面給出在MTD層,Linux的源代碼做的一些修改。另外,敘述JFFS2物理文件系統(tǒng)映像文件的生成。
支持MTD設(shè)備
對(duì)MTD設(shè)備的支持要經(jīng)過(guò)配置內(nèi)核、編寫設(shè)備驅(qū)動(dòng)程序和建立MTD設(shè)備這幾個(gè)步驟。
第一步,配置內(nèi)核參數(shù),選中Memory Technology Devices(MTD)support,下面的子項(xiàng)中至少要選擇MTD partitioning support、Direct char device access to MTD devices和Caching block device access to MTD devices這三項(xiàng)。其他的有關(guān)NFTL,CFI的支持根據(jù)需要選取。
第二步,編寫針對(duì)目標(biāo)平臺(tái)Flash設(shè)備的MTD驅(qū)動(dòng)程序,主要實(shí)現(xiàn)創(chuàng)建MTD分區(qū)和刪除MTD分區(qū)的函數(shù)。創(chuàng)建分區(qū)的流程見(jiàn)圖3所示。刪除分區(qū)的函數(shù)比較簡(jiǎn)單,如果存在MTD分區(qū),就調(diào)用del_mtd_partitions(struct mtd info*)刪除分區(qū),并且刪除為MTD設(shè)備創(chuàng)建的映射表。
插圖3: 創(chuàng)建MTD分區(qū)
第三步,將修改過(guò)的MTD驅(qū)動(dòng)文件作為內(nèi)核文件的補(bǔ)丁,并給內(nèi)核文件打上這個(gè)補(bǔ)丁,最后,編譯生成內(nèi)核文件。
第四步,使用mknod命令建立MTD設(shè)備。
JFFS2映象文件的生成
首先,需要內(nèi)核支持JFFS2,因此在配置內(nèi)核參數(shù)時(shí),選中File Systems下的Journaling Flash File System v2(JFFS2)support。假設(shè)從一個(gè)RAMDISK的文件系統(tǒng)中得到建立根文件系統(tǒng)所需的全部文件和系統(tǒng)所有的設(shè)備等信息。制作步驟如下:[!--empirenews.page--]
第一步,在開(kāi)發(fā)主機(jī)上將這個(gè)Ramdisk以loop的方式掛接到某個(gè)臨時(shí)目錄下。在這個(gè)目錄下就出現(xiàn)了一些文件系統(tǒng)的基本文件和信息,可以做增刪以達(dá)到定制的目的。
第二步,修改/etc/rc.d/rc.sysinit文件,使得文件系統(tǒng)在remount時(shí)不會(huì)出現(xiàn)只讀的情況。具體修改如下:
Mount -n -o remount.rw//加入這一行
Mount -n -t proc/proc rw//在這一行中加入-n
第三步,使用mkfs.jffs2生成JFFFS2的映像文件。具體的命令格式如下:
Mkfs.jffs2 -d<文件系統(tǒng)所在目錄>-o<映像文件名>
這時(shí),就得到了一個(gè)JFFS2的映像文件,將它下載到目標(biāo)平臺(tái)。最后就是如何掛載它,使它成為一個(gè)根文件系統(tǒng)了。在調(diào)試階段和最終系統(tǒng)成型之后,掛載的方式有所不同,而具體的掛載方法在前面已敘述,這里不再重復(fù)說(shuō)明。
結(jié)語(yǔ)
我們構(gòu)造了一個(gè)嵌入式版本的Linux文件系統(tǒng),它使得內(nèi)核在系統(tǒng)盡量精簡(jiǎn)的情況下能夠運(yùn)行起來(lái),并滿足產(chǎn)品和系統(tǒng)各方面的要求。其中,為文件系統(tǒng)配置用戶和屬組以達(dá)到一定的安全性更是系統(tǒng)的一大特色。另外,在這個(gè)嵌入式文件系統(tǒng)中,引入了VFS的支持,雖然犧牲了一些空間,但是大大方便了今后各種物理文件系統(tǒng)的動(dòng)態(tài)加載。Linux的文件系統(tǒng)事實(shí)上非常的龐大,構(gòu)造一個(gè)嵌入式的Linux文件系統(tǒng)是一個(gè)很復(fù)雜的過(guò)程。如何讓文件系統(tǒng)在保證安全的前提下精簡(jiǎn)得更緊湊、運(yùn)行得更有效率,是需要深入探索的一個(gè)課題。 |
|