實作FAT檔案系統,剛開始的時候對隐藏扇區和保留扇區很困惑,不清楚FAT表的入口位址應該根據什麼來進行計算。查閱資料,對這個問題,網上并沒有非常清晰的答案。這實際上是非常關鍵的一點,如果不清楚,那麼無法獲得BPB的資訊。根據工作的進展,這個問題已經解決。現在讀取128M/512M/1G的CF卡中的語音檔案利用DAC播放,已經非常流暢了。下面對這個問題總結一下。 假設現在有硬碟,或者CF卡,或者SD卡,就是存儲媒體, 我需要存放100個資料,那麼如何存放呢?知道計算機中存放形式為二進制,也就是0/1。簡單的把100個資料放到存儲媒體中可以,但是如果不同的資料多了,如何處理呢?這就引出了檔案系統。檔案系統實際上就是對存儲的資料進行管理,這些存儲的資料加上額外的管理開銷,就形成了檔案這個抽象的概念。而如何管理資料,如何降低開銷,這些都是檔案系統是否優越的重要名額。FAT檔案系統采用的是連結清單的方式,一級一級的往下找。而在Linux下,ext2/3采用的是樹的方式。在嵌入式系統中,不一定要有作業系統,也不一定要有檔案系統,這些都需要根據具體的應用需求來進行系統設計。 FAT(File Allocation TAble,檔案配置設定表),我的了解是它是資料管理的額外開銷部分,利用它,我可以知道檔案的存放記錄在那裡,那麼就可以找到檔案記錄;找到檔案記錄,就可以知道資料實體上在那裡存放的,長度有多少,這樣就可以把資料取出來。 上面是些基本的知識,下面就隐藏扇區和保留扇區說一下我的了解。 我在Windows XP SP2CF卡把格式化成FAT16檔案系統,包括128M、512M、1G三種,利用Winhex工具檢視具體資訊。它們的參數如下: 128M: 隐藏扇區 0 保留扇區 6 每簇4個扇區 每個扇區512Bytes 512M: 隐藏扇區 63 保留扇區 4 每簇16個扇區 每個扇區512Bytes 1G: 隐藏扇區 63 保留扇區 6 每簇32個扇區 每個扇區512Bytes 1 隐藏扇區(hidden sector) 在分區之前的部分。通常所說的MBR,它是隐藏扇區的第一個扇區,也是整個存儲媒體的第一個扇區。使用C/H/S尋址方式為0 Cylinder / 0 Head / 1 Sector,換成LBA尋址方式,就是所謂的第0扇區。需要注意的是,隐藏扇區不是必須的,它是系統啟動有關,如果你僅僅是作為存儲,那麼隐藏扇區可以沒有,比如128M CF Card。還需要區分實體扇區和邏輯扇區。實體扇區是從整個存儲媒體的角度出發,而邏輯扇區僅僅是從該分區的角度出發。 2 保留扇區(reserved sector) 分區之内FAT表之前的所有扇區。通常所說的BPB,就是保留扇區的第一個扇區。如果隐藏扇區為0個,那麼BPB所在的扇區就成為了實際的第0扇區。 | 隐藏扇區 | 保留扇區 | FAT表 | 根目錄區 | 資料區 | 分區前 <-|->分區之後,也就是檔案系統的起始部分 上面是FAT16的組織形式。預設上,LBA=0時,讀取第一個扇區,得到的應該是MBR資訊。在偏移位置為0x1be處,如果為0x80,則表示該分區是活動的。在偏移位置為0x1c6及其後的三個位元組構成一個32位的長字(注意是按照小端存放方式),這是DBR的入口位址,也就是保留扇區的第一個扇區。如果在0x1be處不是0x80,則表明這不是MBR,也就是隐藏扇區為0,從保留扇區開始。那麼讀取LBA=0的扇區就是DBR了。 由此看出相關的公式如下: 1 讀取LBA=0的扇區,如果判斷是MBR,則說明存在隐藏扇區,根據MBR的資訊找到分區的DBR扇區位址; 2 讀取DBR,分析相關的資訊,獲得檔案系統參數BPB。 FAT表的入口位址 = 隐藏扇區數 + 保留扇區數 根目錄區的入口位址 = FAT表的入口位址 + FAT的扇區數 資料區的入口位址 = 根目錄區的入口位址 + 根目錄區的扇區數
文章轉自: http://blog.csdn.net/hongjiujing/article/details/2135184