嵌入式Linux (三)

姓名:楊喬 ? 學(xué)號(hào):19020100280 ?? 學(xué)院:電子工程學(xué)院

轉(zhuǎn)自:

https://max.book118.com/html/2021/0122/6011000144003053.shtm

【嵌牛導(dǎo)讀】嵌入式一般指嵌入式系統(tǒng)。嵌入式系統(tǒng)由硬件和軟件組成。是能夠獨(dú)立進(jìn)行運(yùn)作的器件。Linux,全稱GNU/Linux,是一種免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),其內(nèi)核由林納斯·本納第克特·托瓦茲于1991年10月5日首次發(fā)布,它主要受到Minix和Unix思想的啟發(fā),是一個(gè)基于POSIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。

【嵌牛鼻子】存儲(chǔ)

【嵌牛提問】什么是存儲(chǔ)?

【嵌牛正文】

嵌入式Linux開發(fā)的一大挑戰(zhàn)性源自大多數(shù)嵌入式系統(tǒng)的物理資源非常有限。雖然你的臺(tái)式電腦會(huì)擁有酷睿2雙核處理器和500 GB大小的硬盤,但很難找到擁有如此巨大硬盤容量的嵌入式系統(tǒng)。多數(shù)情況下,硬盤通常被更小和更便宜的非易失性存儲(chǔ)設(shè)備所取代。硬盤不僅笨重,包含旋轉(zhuǎn)部件,對(duì)物理震動(dòng)敏感,并且要求提供多種供電電壓,因此并不適合用在許多嵌入式系統(tǒng)中。

2.3.1 閃存

幾乎所有人都對(duì)消費(fèi)電子設(shè)備,比如數(shù)碼相機(jī)和PDA(這兩者都是很好的嵌入式系統(tǒng)的例子)中廣泛使用的Compact Flash卡和SD卡很熟悉。這些基于閃存技術(shù)的模塊可以看做是固態(tài)硬盤,它們能夠在很小的空間內(nèi)存儲(chǔ)許多兆甚至幾吉字節(jié)的數(shù)據(jù)。它們內(nèi)部沒有活動(dòng)的部件,相對(duì)堅(jiān)固,只需一種供電電壓。

生產(chǎn)閃存的廠家有好幾家。閃存的類型多種多樣,電氣規(guī)格、物理封裝形式以及容量各有不同。只擁有小到4MB或8MB非易失性存儲(chǔ)容量的嵌入式系統(tǒng)并不罕見。嵌入式Linux系統(tǒng)對(duì)存儲(chǔ)容量的典型需求是16MB~256MB。越來越多的嵌入式Linux系統(tǒng)擁有數(shù)吉字節(jié)的非易失性存儲(chǔ)空間。

閃存可以在軟件的控制下寫入和擦除數(shù)據(jù)。采用旋轉(zhuǎn)硬盤驅(qū)動(dòng)器技術(shù)的普通硬盤仍然是最快的可寫入存儲(chǔ)媒介。雖然和普通硬盤相比,閃存的寫入和擦除仍然相當(dāng)慢,但與以前相比,其寫入和擦除速度已經(jīng)有了顯著提高。了解硬盤驅(qū)動(dòng)器和閃存技術(shù)的根本區(qū)別才能正確地使用相應(yīng)技術(shù)。

閃存的存儲(chǔ)空間被分割成相對(duì)較大的可擦除單元,稱為擦除塊(erase block)。閃存的一個(gè)顯著特征就是閃存中的數(shù)據(jù)寫入和擦除的方式。在典型的NOR型[7]閃存芯片中,數(shù)據(jù)可以在軟件的控制下,使用直接向某個(gè)存儲(chǔ)單元地址寫入的簡單方法將其從二進(jìn)制1改為二進(jìn)制0。然而,要將數(shù)據(jù)從0改回1,則要擦除整個(gè)擦除塊,在擦除時(shí)需要向閃存芯片寫入一串特別的控制指令序列。

典型的NOR型閃存包含多個(gè)擦除塊。例如,一個(gè)4MB容量的閃存芯片可能包含64個(gè)擦除塊,每塊大小為64KB。市面上也有擦除塊大小不一致的閃存,以便靈活存放數(shù)據(jù)。這種閃存常常被稱為引導(dǎo)塊(boot block)或引導(dǎo)扇區(qū)(boot sector)閃存。通常,引導(dǎo)加載程序存儲(chǔ)在較小的塊中,內(nèi)核和其他必要的數(shù)據(jù)則存放在更大的塊中。圖2-3說明了一個(gè)典型的頂部引導(dǎo)(top boot)閃存芯片的塊大小布局。

為了修改存儲(chǔ)在閃存陣列中的數(shù)據(jù),必須完全擦除待修改數(shù)據(jù)所在的塊。即使只修改某個(gè)塊中的一個(gè)字節(jié),都必須擦除并重新寫入整個(gè)塊[8]。相比于傳統(tǒng)硬盤的扇區(qū),閃存的塊大小相對(duì)較大。相對(duì)而言,一個(gè)典型的高性能硬盤的可寫扇區(qū)大小為512 B或1024 B。結(jié)果顯而易見:更新閃存中的數(shù)據(jù)所耗費(fèi)的寫入時(shí)間會(huì)是硬盤驅(qū)動(dòng)器的很多倍,部分原因就是每次更新數(shù)據(jù)時(shí)都有相對(duì)大量的數(shù)據(jù)需要被擦除和寫回。在最壞的情況下,一個(gè)寫周期會(huì)耗費(fèi)幾秒鐘的時(shí)間。

關(guān)于閃存,另一個(gè)需要考慮的限制是存儲(chǔ)單元的寫壽命(write lifetime)。NOR型閃存存儲(chǔ)單元的可寫入次數(shù)是有限制的,超出次數(shù)限制后寫入就會(huì)失敗。雖然這個(gè)次數(shù)的數(shù)值比較大(典型的寫入次數(shù)限制是每塊100 000次),但不難想象一個(gè)設(shè)計(jì)很差的閃存存儲(chǔ)算法(甚至是一個(gè)軟件故障)會(huì)迅速毀壞閃存設(shè)備。顯然,應(yīng)該避免配置你的系統(tǒng)日志輸出到閃存。

2.3.2 NAND型閃存

NAND型閃存使用一種相對(duì)較新的閃存技術(shù)。當(dāng)NAND型閃存投放市場(chǎng)時(shí),前一節(jié)介紹的傳統(tǒng)閃存就被稱為了NOR型閃存。它們之間的區(qū)別與閃存存儲(chǔ)單元的內(nèi)部架構(gòu)有關(guān)。NAND型閃存設(shè)備通過提供更小的塊尺寸改進(jìn)了傳統(tǒng)(NOR型)閃存的一些限制,它可以更快更有效地進(jìn)行寫操作,同時(shí)大大提高了閃存陣列的使用效率。

NOR型閃存為微處理器提供的接口方式與很多微處理器外圍設(shè)備的做法類似。也就是說,它們有并行的數(shù)據(jù)和地址總線,直接[9]連接到微處理器的數(shù)據(jù)/地址總線上。閃存陣列的每個(gè)字節(jié)或字(word)可以隨機(jī)尋址。相反,NAND型閃存設(shè)備是通過復(fù)雜的接口串行訪問的,而且這些接口因廠商而異。NAND型閃存設(shè)備的操作模式更類似于傳統(tǒng)的硬盤驅(qū)動(dòng)器加上附帶的控制器。數(shù)據(jù)是以串行突發(fā)(burst)方式訪問的,每次突發(fā)訪問的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于NAND型閃存的塊大小。相比于NOR型閃存,雖然NAND型閃存的寫入時(shí)間要少很多,但其寫壽命卻比NOR型閃存高出一個(gè)數(shù)量級(jí)。

總的來說,NOR型閃存可以被微處理器直接訪問,甚至于代碼可以直接在NOR型閃存中執(zhí)行。(然而,因?yàn)樾阅芊矫娴脑颍苌儆腥诉@樣做,除非系統(tǒng)資源極其匱乏。)實(shí)際上,很多處理器都不能像對(duì)待DRAM一樣緩存(cache)訪問閃存的指令。這進(jìn)一步降低了代碼的執(zhí)行速度。相反,NAND型閃存更適合于以文件系統(tǒng)的格式大容量存儲(chǔ)數(shù)據(jù),而不是撇開文件系統(tǒng),直接存儲(chǔ)二進(jìn)制可執(zhí)行代碼和數(shù)據(jù)。

2.3.3 閃存的用途

有多種閃存布局和使用方法可供嵌入式系統(tǒng)的設(shè)計(jì)者選擇。在最簡單的系統(tǒng)中,資源沒有過度受限,可以將原始的二進(jìn)制數(shù)據(jù)(可能是壓縮過的)存儲(chǔ)在閃存設(shè)備中。系統(tǒng)引導(dǎo)時(shí),存儲(chǔ)在閃存中的文件系統(tǒng)鏡像被讀入Linux內(nèi)存磁盤(ramdisk)塊設(shè)備中。這個(gè)塊設(shè)備由Linux掛載為一個(gè)文件系統(tǒng),并且只能從內(nèi)存中訪問。當(dāng)閃存中的數(shù)據(jù)幾乎不需要更新時(shí),這種方式通常是很好的選擇。相比于內(nèi)存磁盤的容量,需要更新的數(shù)據(jù)量是很少的。但是,當(dāng)系統(tǒng)重啟或斷電時(shí),對(duì)內(nèi)存磁盤中文件的修改會(huì)丟失,務(wù)必牢記這一點(diǎn)。

引導(dǎo)加載程序通常存放在閃存陣列的頂部或底部。引導(dǎo)加載程序之后的存儲(chǔ)空間被分配給Linux內(nèi)核和內(nèi)存磁盤文件系統(tǒng)鏡像[10],這個(gè)鏡像中包含了根文件系統(tǒng)。一般來說,Linux內(nèi)核和ramdisk文件系統(tǒng)鏡像都被壓縮過,并由引導(dǎo)加載程序在系統(tǒng)引導(dǎo)時(shí)解壓。

可以在閃存中專門開辟一小塊區(qū)域,或者使用其他類型的非易失性存儲(chǔ)設(shè)備[11]來存放那些重啟或掉電后仍需保留的動(dòng)態(tài)數(shù)據(jù)。對(duì)于需要保存配置數(shù)據(jù)的嵌入式系統(tǒng),這種方式很常見。例如,針對(duì)消費(fèi)者市場(chǎng)的無線接入點(diǎn)設(shè)備可能采用這種方式。

2.3.4 閃存文件系統(tǒng)

剛才描述的簡單閃存布局策略有局限性,但可以通過使用閃存文件系統(tǒng)來克服。閃存文件系統(tǒng)以類似于硬盤驅(qū)動(dòng)器組織數(shù)據(jù)的方式來管理閃存設(shè)備中的數(shù)據(jù)。早期針對(duì)閃存設(shè)備的文件系統(tǒng)包含簡單的塊設(shè)備層,這個(gè)塊設(shè)備層模擬了普通硬盤驅(qū)動(dòng)器的扇區(qū)布局,扇區(qū)大小為512 B。這些簡單的模擬層允許以文件格式而不是無格式的大容量存儲(chǔ)方式來訪問數(shù)據(jù),但是它們有一些性能上的局限。

對(duì)閃存文件系統(tǒng)的一個(gè)主要改進(jìn)就是引入了耗損均衡(wear leveling)算法。如前所述,閃存塊的寫壽命是有限的。耗損均衡算法用來將寫操作均勻分布到閃存的各個(gè)物理擦除塊上,以延長閃存芯片的壽命。

閃存架構(gòu)帶來的另一個(gè)限制是系統(tǒng)掉電或意外關(guān)機(jī)后存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。閃存的塊尺寸相對(duì)較大,而寫入的文件的平均大小相對(duì)于塊尺寸通常小很多。從前面的內(nèi)容我們知道閃存塊必須一次寫入一整塊。因此,為了寫入一個(gè)8KB的小文件,必須擦除和重寫整個(gè)閃存塊,而這個(gè)塊的大小可能是64KB或128KB;在最壞的情況下,這個(gè)寫入會(huì)花費(fèi)幾秒鐘才能完成。這極大增加了系統(tǒng)掉電后丟失數(shù)據(jù)的風(fēng)險(xiǎn)。

目前比較受歡迎的一種閃存文件系統(tǒng)是JFFS2,或稱為第二代日志閃存文件系統(tǒng)(Journaling Flash File System 2)。這個(gè)文件系統(tǒng)有很多重要特性,旨在提升整體性能、延長閃存壽命并降低系統(tǒng)掉電時(shí)數(shù)據(jù)丟失的風(fēng)險(xiǎn)。最新的JFFS2文件系統(tǒng)的最重要改進(jìn)包括完善耗損均衡、壓縮和解壓縮(將更多的數(shù)據(jù)擠進(jìn)有限的閃存空間)以及對(duì)Linux硬連接(hard link)的支持。相關(guān)主題將在第9章和第10章詳細(xì)講述。在第10章中,我們會(huì)討論內(nèi)存技術(shù)設(shè)備(Memory Technology Device,MTD)子系統(tǒng)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容