1. 程式人生 > >扇區 物理塊 邏輯塊 flash 基礎概念

扇區 物理塊 邏輯塊 flash 基礎概念

    sector:硬體(磁碟)上的最小的操作單位,是作業系統和塊裝置(硬體、磁碟)之間傳送資料的單位

block由一個或多個sector組成,是軟體(OS、檔案系統)中最小的操作單位;作業系統的虛擬檔案系統從硬體裝置上讀取一個block,實際為從硬體裝置讀取一個或多個sector.對於檔案管理來說,每個檔案對應的多個block可能是不連續的;block最終要對映到sector上,所以block的大小一般是sector的整數倍。不同的檔案系統block可使用不同的大小,作業系統會在記憶體中開闢記憶體,存放block到所謂的block buffer中。

=======================================================================

扇區組成物理塊,物理塊對應邏輯塊,邏輯塊與檔案相對應。

扇區是硬體被操作時軟體使用的最小的操作單元,就是一個扇區一個扇區進行操作(扇區的大小在儲存裝置生產時就設計好)。

塊是上層軟體中(操作檔案時)使用的最小的操作單元,就是(操作檔案時)一個塊一個塊進行操作(塊的大小格式化時可以設定【如linux、fatfs等等】)。

如fatfs的格式化函式(即在儲存裝置上建立檔案系統)

建立檔案系統時,可以指定塊的大小。如果將來在你的檔案系統中是一些比較大的檔案的話,使用較大的塊大小將得到較好的效能。將ext2檔案系統的塊大小調整為4096byte而不是預設的1024byte,可以減少檔案碎片,加快fsck掃描的速度和檔案刪除以及讀操作的速度。另外,在ext2的檔案系統中,為根目錄保留了5%的空間,對一個大的檔案系統,除非用作日誌檔案,5%的比例有些過多。可以使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"將它改為1%並以塊大小4096byte建立檔案系統。 


使用多大的塊大小,需要根據你的系統綜合考慮,如果系統用作郵件或者新聞伺服器,使用較大的塊大小,雖然效能有所提高,但會造成磁碟空間較大的浪費。比如檔案系統中的檔案平均大小為2145byte,如果使用4096byte的塊大小,平均每一個檔案就會浪費1951byte空間。如果使用 1024byte 的塊大小,平均每一個檔案會浪費927byte空間。在效能和磁碟的代價上如何平衡,要看具體應用的需要。 
第1組命令: 
mkfs.ext3 -T news /dev/sda5 (指定該分割槽檔案系統的塊大小為4096) 
mkfs.ext3 -b 4096 /dev/sda5 

norflash有地址線與資料線,可以通過晶片對應的手冊查到該norflash的扇區的大小。

nandflash使用複用的介面線,它內部有一個頁暫存器(一個頁:大小一般為512位元組),nandflash內部儲存管理使用的塊大小是多少個頁。它的扇區一般為一個頁的一半大小。

=======================================================================

winhex的使用:

   開啟對應磁碟

       如上圖所示,為開啟一個磁碟後的資料,這時的偏移地址是相對磁碟的儲存起始地址而言,上圖所示,磁碟有一個分割槽(FAT16),還使用了一個扇區。

       在通過KEIL4讀SD卡時,給一個偏移地址0x11400,讀取到的資料就是這個根目錄下的偏移地址。如果點選開啟Partion 1,那麼這是顯示的offset就是相對Partion 1的偏移地址。 

=======================================================================

我們把Ext2MinixExt等實際可使用的檔案系統稱為具體檔案系統。具體檔案系統管理的是一個邏輯空間,這個邏輯空間就一個大的陣列,陣列的每個元素就是檔案系統操作的基本單位——邏輯塊,邏輯塊是從0開始編號的,而且,邏輯塊是連續的。與邏輯塊相對的是物理塊,物理塊是資料在磁碟上的存取單位,也就是每進行一次I/O操作,最小傳輸的資料大小。我們知道資料是儲存在磁碟的扇區中的,那麼扇區是不是物理塊呢?或者物理塊是多大呢?這涉及到檔案系統效率的問題。

如果物理塊定的比較大,比如一個柱面大小,這時,即使是1個位元組的檔案都要佔用整個一個柱面,假設Linux環境下檔案的平均大小為1K,那麼分配32K的柱面將浪費97%的磁碟空間,也就是說,大的存取單位將帶來嚴重的磁碟空間浪費。另一方面,如果物理塊過小,則意味著對一個檔案的操作將進行更多次的尋道延遲和旋轉延遲,因而讀取由小的物理塊組成的檔案將非常緩慢!可見,時間效率和空間效率在本質上是相互衝突的。

因此,最優的方法是計算出Linux環境下檔案的平均大小,然後將物理塊大小定為最接近扇區的整數大小。在Ext2中,物理塊的大小是可變化的,這取決於你在建立檔案系統時的選擇,之所以不限制大小,也正體現了Ext2的靈活性和可擴充性,一是因為要適應近年來檔案的平均長度緩慢增長的趨勢,二是為了適應不同的需要。比如,如果一個檔案系統主要用於BBS服務,考慮到BBS上的文章通常短小,所以,物理塊選的小一點是恰當的。通常,Ext2物理塊佔一個或幾個連續的扇區,顯然,物理塊的數目是由磁碟容量等硬體因素決定的。邏輯塊與物理塊的關係類似於虛擬記憶體中的頁與實體記憶體中的頁面的關係。

具體檔案系統所操作的基本單位是邏輯塊,只在需要進行I/O操作時才進行邏輯塊到物理塊的對映,這顯然避免了大量的I/O操作,因而檔案系統能夠變得高效。邏輯塊作為一個抽象的概念,它必然要對映到具體的物理塊上去,因此,邏輯塊的大小必須是物理塊大小的整數,一般說來,兩者是一樣大的。

通常,一個檔案佔用的多個物理塊在磁碟上是不連續儲存的,因為如果連續儲存,則經過頻繁的刪除、建立、移動檔案等操作,最後磁碟上將形成大量的空洞,很快磁碟上將無空間可供使用。因此,必須提供一種方法將一個檔案佔用的多個邏輯塊對映到對應的非連續儲存的物理塊上去,Ext2等類檔案系統是用索引節點解決這個問題的,具體實現方法後面再予以介紹。

為了更好的說明邏輯塊和物理塊的關係,我們來看一個例子。

假設使用者要對一個已有檔案進行寫操作,使用者程序必須先開啟這個檔案,file結構記錄了該檔案的當前位置。然後使用者把一個指向使用者記憶體區的指標和請求寫的位元組數傳送給系統,請求寫操作,這時系統要進行兩次對映。

1)一組位元組到邏輯塊的對映。

這個對映過程就是找到起始位元組到結束位元組所佔用的所有邏輯塊號。這是因為在邏輯空間,檔案傳輸的基本單位是邏輯塊而不是位元組。

2)邏輯塊到物理塊的對映。

這個過程必須要用到索引節點結構,該結構中有一個物理塊指標陣列,以邏輯塊號為索引,通過這些指標找到磁碟上的物理塊,具體實現將在介紹Ext2索引節點時再進行介紹。

9.1是由一組請求的位元組到物理塊的對映過程示意圖。

有了邏輯塊和物理塊的概念,我們也就知道通常所說的資料塊是指邏輯塊,以下沒有特別說明,塊或資料塊指的是邏輯塊。

Ext2中,還有一個重要的概念:片(fragment,它的作用是什麼?

每個檔案必然佔用整數邏輯塊,除非每個檔案大小都恰好是邏輯塊的整數,否則最後一個邏輯塊必然有空間未被使用,實際上,每個檔案的最後一個邏輯塊平均要浪費一半的空間,顯然最終浪費的還是物理塊。在一個有很多檔案的系統中,這種浪費是很大的。Ext2使用片來解決這個問題。

片也是一個邏輯空間中的概念,其大小在1K4K之間,但片的大小總是不大於邏輯塊。假設邏輯塊大小為4K,片大小為1K,物理塊大小也是1K,當你要建立一個3K大小的檔案時,實際上分配給你了3個片,而不會給你一個邏輯塊,當檔案大小增加到4K時,檔案系統則分配一個邏輯塊給你,而原來的四個片被清空。如果檔案又增加到5K時,則佔用1個邏輯塊和1個片。上述三種情況下,所佔用的物理塊分別3個、4個、5個,如果不採用片,則要用到4個、4個、8個物理塊,可見,使用片,減少了磁碟空間的浪費。當然,在物理塊和邏輯塊大小一樣時,片就沒有意義了。

由上面分析也可看出:

物理塊大小<=片大小<=邏輯塊大小

=========================================================================

NANDFLASH是FLASH儲存器的一種,與NOR FLASH相比,NANDFLASH具有更高的儲存密度,單片FLASH的儲存容量大大增加,也使得NANDFLASH的價格遠遠低於NOR FLASH。NANDFLASH採用命令方式實現讀寫和擦除,只需要8或16根資料線及相關的控制線,而且目前相同型別的NANDFLASH晶片都做到了管腳相容,使得NANDFLASH在不變更電路板的條件下更容易增加或減少容量。另外NANDFLASH還具有讀寫速度快的特點。NANDFLASH具有以上特點,才使得它得到了廣泛的應用。 
NANDFLASH儲存按頁(page)的方式,根據頁的大小不同,NANDFALSH可分為大頁(每頁2048+64位元組)和小頁(每頁512+16位元組)兩種。目前使用最多最廣泛的為大頁的FLASH,本文件中如不做特殊說明,則指的是大頁的NANDFLASH。 
      NANDFLASH有2048個塊(塊為擦除的最小單位),每個塊包含64個頁,每頁有2048+64個位元組。資料地址分為行地址和列地址兩種,行地址(Row)為頁地址,即頁的偏移量;列地址(Column)為頁內地址,即每個位元組的頁內偏移量。頁內的前2048位元組一般用於資料儲存,通常被程為data區;後64位元組一般用於儲存校驗資料和檔案系統的引數資訊,這後64位元組通常被稱為spare區,而這些位元組常被稱為冗餘位元組。NANDFLASH裡通常集成了ECC發生器,用於產生ECC校驗碼。ECC在寫操作時產生,寫入spare區,讀操作時將spare區內的ECC與讀資料時產生的ECC比對,來決定讀出的資料是否正確。另外ECC還具有糾錯能力,根據ECC位元組的長度不同,糾錯位數也有所不同。一般4位元組的ECC,可以糾1個BIT的錯誤;7位元組的ECC,可以糾2—3個BIT的錯誤。由於NANDFLASH的製造工藝決定了NANDFLASH的所有儲存單元不可能都是好的,對於那些壞的儲存單元所在的塊,需要在spare區裡標記為壞塊;在進行寫操作時,程式要對這些壞塊進行判斷以避開這些塊。 
對於三星平臺,直接使用NANDFLASH作為手機內的儲存器,一個分了7個區(bootloader、nk、systemdata、Userdata、DBData、DBBack、RegData),其中bootloader、nk分割槽無檔案系統,存放的是bootloader和nk程式;其他分割槽均有檔案系統,供wince啟動之後是用。對於TI和FREECALE平臺,使用mdoc作為手機內的儲存器。 
FMD層提供的介面有: 
FMD_Deinit:驅動解除安裝時呼叫,主要用於關閉初始化函式裡開啟的控制代碼; 
FMD_Init:驅動載入時呼叫,為裝置初始化函式; 
FMD_GetInfo:獲得該分割槽的基本資訊; 
FMD_GetBlockStatus:獲得指定塊的狀態資訊; 
FMD_OEMIoControl:提供給OEM廠家直接呼叫的介面; 
FMD_PowerUp:驅動喚醒時呼叫的介面; 
FMD_PowerDown:驅動進入待機狀態時呼叫的介面; 
FMD_ReadSector:按扇區讀取NANDFLASH裡的資料; 
FMD_WriteSector:按扇區向NANDFLASH裡寫入資料; 
FMD_SetBlockStatus:設定指定塊的狀態; 
FMD_EraseBlock:擦除指定的塊; 

=========================================================================

  在過去的20年裡,嵌入式系統一直使用ROM(EPROM)作為它們的儲存裝置。然而近年來Flash 全面代替了ROM(EPROM)在嵌入式系統中的地位。因為相較ROM而言,Flash有成本低,容易改寫等優點。

  目前Flash主要有兩種 NOR Flash 和 NADN Flash 它們在應用上有所不同因此也用於不同的場合。

  讀取NOR Flash和讀取我們常見的SDRAM是一樣的。它的所有地址都是可見的,你可以讀取它任意隨機地址的值。同時它和SDRAM一樣你可以直接執行裝載在NOR FLASH裡面的程式碼,這就是作謂的XIP(Execute-In-Place)技術。因為NOR Flash有這種特性,所以它非常適用於小型嵌入式系統。你可以把你的程式碼裝載到Flash中,在系統啟動的時候直接執行它,而減少SRAM的容量從而節約了成本。

  從這種意義上來說,NOR FLASH已經可以代替原先我們一直使用的標準的ROM。並且還具有ROM所沒有的特性。

  目前市面上的FLASH 主要來自Intel,AMD,Fujitsu,和Toshiba。常用的容量一般在128K到64M之間。

  NAND Flash 沒有采取記憶體的隨機讀取技術。它的讀取是以一次讀取一塊的形式來進行的,通常是一次讀取512個位元組。採用這種技術的Flash比較廉價。但是和所有塊裝置一樣,NAND Flash 比較容易出現壞位。這需要我們採用軟體來避免使用這些位。這樣以來就增加了軟體的複雜度。你不能直接執行NAND Flash上的程式碼。因此好多使用NAND Flash的開發板除了使用NAND Flah以外,還加上了一塊小的NOR Flash來執行啟動程式碼。這樣做會增加系統的複雜度。不過最近這種現象有所改觀。三星最近生產的一批採用ARM Core的CPU,採用了一個內部的緩衝來存放NAND Flash裡讀取的東西。以此來直接執行NAND FLASH裡面啟動程式碼。比如基於Arm920T和新的S3c2410晶片。

  另外,我們最常見的NAND FLASH的應用是嵌入式系統採用的DOC(Disk On Chip)和我們通常用的“閃盤”。

  目前生產NAND Flash的主要廠家有Samsung 和Toshiba。最大容量已經突破了1G位。寫Flash和寫SRAM截然不同。它是通過一系列指令才能完成一個寫操作的。而我們用的RAM直接寫入即可。無論是NOR Flash 還是NAND Flash都有一個“扇區”的概念。這個“扇區”從8K到256K不等。在寫操作中它將作為一個整體來操作。要向某個地址裡面寫如一個值得先看一下這個地址原先的值是不是全為“1“。如果全為“1”,那麼通過一系列指令可以將這個值寫入。反之,則先要進行擦除使其全部變為“1”。擦除操作是不能用一個地址來操作的。擦除必須一次擦除一個“扇區“。把這個“扇區”所有的值都變為“1”,然後才能進行寫操作。

  不同型號的Flash的操作指令不同。具體操作的時候需要仔細閱讀所使用產品的產品說明書。

=========================================================================

NandFlash系列之一:NorFlash與NandFlash對比

作者:劉洪濤,華清遠見嵌入式學院高階講師。

FLASH儲存器又稱快閃記憶體,主要有兩種:NorFlash和NandFlash,下面我們從多個角度來對比介紹一下。在實際開發中,設計者可以根據產品需求來進行快閃記憶體的合理選擇。

1、介面對比

NorFlash帶有通用的SRAM介面,可以輕鬆地掛接在CPU的地址、資料匯流排上,對CPU的介面要求低。NorFlash的特點是晶片內執行(XIP,eXecute In Place),這樣應用程式可以直接在flash快閃記憶體內執行,不必再把程式碼讀到系統RAM中。如uboot中的ro段可以直接在NorFlash上執行,只需要把rw和zi段拷貝到RAM中執行即可。

NandFlash器件使用複雜的I/O口來序列地存取資料,8個引腳用來傳送控制、地址和資料資訊。由於時序較為複雜,所以一般CPU最好整合NAND控制器。另外由於NandFlash沒有掛接在地址總線上,所以如果想用NandFlash作為系統的啟動盤,就需要CPU具備特殊的功能,如s3c2410在被選擇為NandFlash啟動方式時會在上電時自動讀取NandFlash的4k資料到地址0的SRAM中。如果CPU不具備這種特殊功能,使用者不能直接執行NandFlash上的程式碼,那可以採取其他方式,比如好多使用NandFlash的開發板除了使用NandFlash以外,還用上了一塊小的NorFlash來執行啟動程式碼。

2、容量和成本對比

相比起NandFlash來說,NorFlash的容量要小,一般在1~16MByte左右,一些新工藝採用了晶片疊加技術可以把NorFlash的容量做得大一些。在價格方面,NorFlash相比NandFlash來說較高,如目前市場上一片4Mbyte的AM29lv320 NorFlash零售價在20元左右,而一片128MByte的k9f1g08 NandFlash零售價在30元左右。

NandFlash生產過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,這樣也就相應地降低了價格。

3、可靠性性對比

NAND器件中的壞塊是隨機分佈的,以前也曾有過消除壞塊的努力,但發現成品率太低,代價太高,根本不划算。NAND器件需要對介質進行初始化掃描以發現壞塊,並將壞塊標記為不可用。在已製成的器件中,如果通過可靠的方法不能進行這項處理,將導致高故障率。而壞塊問題在NorFlash上是不存在的。 
在Flash的位翻轉(一個bit位發生翻轉)現象上,NAND的出現機率要比NorFlash大得多。這個問題在Flash儲存關鍵檔案時是致命的,所以在使用NandFlash時建議同時使用EDC/ECC等校驗演算法。

4、壽命對比

在NAND快閃記憶體中每個塊的最大擦寫次數是一百萬次,而NOR的擦寫次數是十萬次。快閃記憶體的使用壽命同時和檔案系統的機制也有關,要求檔案系統具有損耗平衡功能。

5、升級對比

NorFlash的升級較為麻煩,因為不同容量的NorFlash的地址線需求不一樣,所以在更換不同容量的NorFlash晶片時不方便。通常我們會通過在電路板的地址線上做一些跳接電阻來解決這樣的問題,針對不同容量的NorFlash。

而不同容量的NandFlash的介面是固定的,所以升級簡單。

6、讀寫效能對比

寫操作:任何flash器件的寫入操作都只能在空或已擦除的單元內進行。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為1。擦除NOR器件時是以64~128KB的塊進行的,執行一個擦除/寫入操作的時間約為5s。擦除NAND器件是以8~32KB的塊進行的,執行一個擦除/寫入操作最多隻需要4ms。

讀操作:NOR的讀速度比NAND稍快一些。

7、檔案系統比較

Linux系統中採用MTD來管理不同型別的Flash晶片,包括NandFlash和NorFlash。支援在Flash上執行的常用檔案系統有cramfs、jffs、jffs2、yaffs、yaffs2等。cramfs檔案系統是隻讀檔案系統。如果想在Flash上實現讀寫操作,通常在NorFlash上我們會選取jffs及jffs2檔案系統,在NandFlash上選用yaffs或yaffs2檔案系統。Yaffs2檔案系統支援大頁(大於512位元組/頁)的NandFlash儲存器。

參考文章:《NAND和NORFLASH技術設計師在使用快閃記憶體時需要慎重選擇》M-Systems公司 Arie TAL 

=====================================================================================

 以鎂光MT29F4G08BxB Nand Flash為例,這款Flash(如上圖)以4個扇區(sector)組成1個頁(page),64個頁(page)組成1個塊(block),4096個塊(block)構成整個Flash儲存器;由於每個扇區的容量是512 位元組(bytes),整個Flash容量為4224M Bit(相當於528M位元組),去掉備用區域用於存放ECC資料校驗16M(虛線部分),就是這個片子的容量512M位元組。其他型號的Flash也是同樣由扇區組成頁、由頁組成塊、塊組成整個儲存裝置,只是扇區、頁、塊的數量多少有區別而已。

      在Flash的生產製造過程中,由於生產工藝的缺陷,很容易在Flash中產生不能使用的壞區域,如果在U盤中要使用這樣的Flash,就必須使用所謂的“量產工具”;U盤量產工具其實就是一種集壞區域掃描和Flash管理系統裝載於一身的工具。常規U盤主控的掃描是以塊為單位,掃描即往每一個塊裡寫入資料,然後將讀出的資料與寫入的資料比較,如果資料有誤則把該塊標為“壞塊”。掃描完成後就是將Flash管理系統裝載到Flash裡面,Flash管理系統就會利用掃描產生的壞塊表對整個Flash進行讀寫管理,這樣就完成了整個量產動作,U盤也就可以正常使用了。所以U盤顯示的容量與實際所用的Flash容量差異來源於不能儲存資訊的壞塊和Flash管理系統的佔用塊。壞塊越多,做出的U盤容量越低;而Flash管理系統佔用的塊是沒有辦法避免,就像我們的電腦安裝作業系統要佔用硬碟空間一樣。

      當然這裡還涉及到一個ECC糾錯能力的問題,假設對這個Flash進行掃描的定義的ECC糾錯能力為1bit,只有資料出現超過1bit錯誤的塊才會被標記為壞塊。這個時候需要區分塊糾錯和扇區糾錯的差別,假設任何一個塊裡有任何一個扇區(512bytes)存在超出1bit的錯誤,常規主控在掃描的時候就會判斷整個塊為壞區域,這樣將損失整個塊128Kbytes的容量;但是當使用扇區糾錯的主控時,同樣1bit ECC糾錯,他會直接去判斷這個塊裡哪些是超出1bit錯誤的扇區,從而將其剔除,損失的只是每個真正有錯誤扇區的512bytes容量,從而保留了其餘沒有錯誤的扇區,這樣Flash的利用率可以得到極大的提高。