FAT32文件系統介紹

FAT32文件系統

      • (一)為什么要有文件系統
      • (二)FAT32文件系統組成
      • (三)分步介紹各部分
        • (1) 首先介紹一下MBR
        • (2)DBR介紹
        • (3)FAT表介紹
        • (4) 數據區

(一)為什么要有文件系統

文件系統是操作系統用于明確存儲設備或分區上的文件的方法和數據結構,即在存儲設備上組織文件的方法。如果沒有文件系統,那我們想找到在硬盤上保存的數據會是一件很麻煩的事情,文件系統的作用是,它負責為用戶建立文件、讀出、修改,控制文件的讀取,我們常說的格式化硬盤就是寫入文件系統。文件系統的種類有很多,而且有各自的特點,本文主要介紹FAT32文件系統。

(二)FAT32文件系統組成

FAT32文件系統由DBR及其保留扇區,FAT1,FAT2和DATA四個部分組成(下圖MBR是主引導記錄,不一定每個磁盤都有)
在這里插入圖片描述

(三)分步介紹各部分

(1) 首先介紹一下MBR

MBR主要存儲磁盤分區相關的信息,如果存在MBR的話,那么它占用第一個扇區的512個字節,前446個字節為MBR啟動代碼(這里不關心),接下來16*4個字節為磁盤分區表,每個分區的信息要占16個字節,所以,MBR分區表最多只能保存4個分區的分區信息,最后兩個字節是結束標識0x55AA。
如果你的SD卡開頭是EB 58 90那就說明你的SD卡沒有MBR,需要重新創建MBR,創建過程可以參考SD卡移植FAT32文件系統無MBR,下面我們來看下MBR的內容:
在這里插入圖片描述

標識長度介紹
Active1字節0x80表示活動分區,0x00表示非活動分區0x80
StartHead1字節分區的開始磁頭0x20
StartCylSect2字節開始柱面與扇區(柱面和扇區分別占用不同位數,有需要查資料)0x21 0x00
PartType1字節分區類型(0x0b和0x0c都是FAT32)0x0c
EndHead1字節分區的結束磁頭0xFE
EndCylSect2字節結束柱面與扇區(柱面和扇區分別占用不同位數,有需要查資料)0xff 0xE1
StartLBA4字節分區的第一個扇區0x00 0x08 0x00 0x00
Size4字節分區總扇區數目0x00 0xc0 0xf3 0x00

上面顯示的是小端模式(地址值存放低字節)
這么多信息,對于初學著只需要知道分區的第一個扇區和分區的大小即可,從上面可以看出起始扇區為0x00000800(注意是小端模式!!)=2048扇區,總扇區數目為0x00f3c000,那么總大小為0xf3c000*512/1024/1024/1024=7.6G

注:
(1)MBR分區方案中,有三種類型的分區,主分區、擴展分區和邏輯分區。擴展分區與邏輯分區是為了突破分區表中只能保存4個分區的限制而出現的。擴展分區不能直接使用,需要在擴展分區內劃分一個或多個邏輯分區后才能使用。
(2)一般每個扇區的容量是512字節,4個字節的扇區能表示的最大容量是2TB(2^32 * 512/1024/1024/1024=2048G=2TB),由此可知,在MBR分區表中,分區的起始位置不能大于2TB,分區的最大容量,也不能大于2TB。所以,對2TB以上容量的物理硬盤,不適合使用MBR分區方案。

有一些硬盤廠商,嘗試擴大扇區的大小,來突破MBR不適合2TB容量以上的硬盤這一限制。所以有時你會發現市場上存在的硬盤,不完全是每個扇區512字節的,有1024字節甚至2048字節每扇區的。但擴大扇區的大小,又會帶來很多其他的問題,特別是會嚴重影響硬盤的速度,所以這種方法,沒有被廣泛接受。

(2)DBR介紹

DBR是我們格式化分區時創建的,每個分區都會有DBR信息,1個DBR只能定義1個分區的系統文件,占用512個字節
在這里插入圖片描述
從上面的MBR可知第一個分區在2048扇區(2048*512字節=0x100000)我們直接跳過去看看:
在這里插入圖片描述
跳轉指令:EB 58 90:本身占2字節它將程序執行流程跳轉到引導程序處
OEM代號:這部分占8字節,其內容由創建該文件系統的OEM廠商具體安排。

跳轉指令之后是8字節長的OEM ID,它是一個字符串, OEM ID標識了格式化該分區的操作系統的名稱和版本號。為了保留與MS-DOS的兼容性,通常Windows 2000格式化該盤是在FAT16和FAT32磁盤上的該字段中記錄了“MSDOS 5.0”,在NTFS磁盤上(關于ntfs,另述),Windows 2000記錄的是“NTFS”。通常在被Windows 95格式化的磁盤上OEM ID字段出現“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁盤上OEM ID字段出現“MSWIN4.1”。
BPB:下面是從上圖截下的BPB內容
在這里插入圖片描述
我們主要關注紅色字體標出的內容:

標識長度介紹
BytesPerSec2字節每扇區字節數,通常為512、1024、2048、40960x00 0x02
SecPerClus1字節每簇扇區數,這個值不能為0,而且必須是2的整數次方,比如1、2、4、8、16、32、64、1280x08
ResdSecCnt2字節保留扇區數0x5E 0x06
NumFATs1字節FAT表數目0x02
RootEntCnt2字節FAT32固定為00x00 0x00
TotSec162字節FAT32固定為00x00 0x00
Media1字節存儲介質,0xF8標準值,可移動存儲介質0xf8
FATSz162字節FAT32固定為00x00 0x00
SecPerTrk2字節磁道扇區數0x3f 0x00
NumHeads2字節磁頭數0xff 0x00
HiddSec4字節FAT區前隱藏扇區數0x00 0x08 0x00 0x00
TotSec324字節總扇區數0x00 0xC0 0xF3 0x00
FATSz324字節一個FAT表扇區數0xd1 0x3c 0x00 0x00
ExtFlags2字節FAT32持有0x00 0x00
FSVer2字節FAT32持有0x00 0x00
RootClus4字節第一個目錄的簇號0x02 0x00 0x00 0x00
FSInfo2字節保留扇區數,FSINFO(文件系統信息扇區)扇區號是1,該扇區為操作系統提供關于空簇總數及下一可用簇的信息0x01 0x00
BkBootSec2字節通常為60x06 0x00
Reserved12字節用以擴展0x00 0x00 … 0x00
DrvNum1字節驅動器號0x80
Reserved11字節保留0x00
BootSig1字節擴展引導標簽0x29
VolID4字節分區序列0x24 0x09 0x88 0x8a
FileSysType11字節卷標
FilSysType18字節系統ID

解讀:
(1)從上面我們可以看出每扇區字節數為0x0200,即512字節
(2)每簇扇區數為0x08
(3)保留扇區數為:0x065e=1630
(4)FAT表數目為2
(5)總扇區為:0x00f3c000即15974400個扇區
(6)一個fat表扇區數:0x000003cd1即15569
(7)第一個目錄簇號0x00000002
(8)第一個fat表的扇區號=DBR所在扇區+保留扇區=2048+1630=3678
(9)第一個目錄的扇區號=第一個fat表的扇區號+2*(一個fat表扇區數)=3678+2*15569=34816
FAT32文件系統在DBR的保留扇區中安排了一個文件系統信息扇區,用以記錄數據區中空閑簇的數量及下一個空閑簇的簇號,該扇區一般在分區的1號扇區,也就是緊跟著DBR后的一個扇區,其內容如下
在這里插入圖片描述
引導程序代碼:FAT32的DBR引導程序占用420字節,對于沒有安裝操作系統的分區來說這段程序是沒有用處的.
結束標識:DBR的結束標志與MBR,EBR的結束標志相同,為“55 AA”。

(3)FAT表介紹

文件系統分配磁盤空間按簇來分配。因此,文件占有磁盤空間時,基本單位不是字節而是簇,即使某個文件只有一個字節,操作系統也會給它分配一個最小單元:即一個簇。對于大文件,需要分配多個簇。同一個文件的數據并不一定完整地存放在磁盤中一個連續地區域內,而往往會分若干段,像鏈子一樣存放。這種存儲方式稱為文件的鏈式存儲。為了實現文件的鏈式存儲,文件系統必須準確地記錄哪些簇已經被文件占用,還必須為每個已經占用的簇指明存儲后繼的下一個簇的簇號,對于文件的最后一簇,則要指明本簇無后繼簇。這些都是由FAT表來保存的,FAT 表對應表項中記錄著它所代表的簇的有關信息:諸如是空,是不是壞簇,是否是已經是某個文件的尾簇等。

定位FAT絕對位置的方法如下:

1、首先從MBR的分區表中得知分區的起始扇區,偏移到此扇區。

2、從DBR的BPB中得知DBR的保留扇區數,FAT表的個數,FAT表的大小。

3、因此FAT1=分區起始扇區+DBR保留扇區,FAT2=分區起始扇區+DBR保留扇區+FAT1。

從上面我們計算出第一個fat表的扇區號在3678扇區,第一個目錄的扇區號34816,我們使用winhex查看一下:
在這里插入圖片描述
第0號表項:0x0FFFFFF8,表示FAT表固定標識
第1號表項:0xFFFFFFFF,不用,默認值
第2號表項:0x0FFFFFFF,根目錄所在簇,由于此時只占用1簇,所以是結束標識
下面我們在SD卡里創建一個大于4k(每簇占8個扇區即4k,只有大于4k才占用多簇)文件,重新查看該位置的內容
在這里插入圖片描述
此時已經看到新增加了三簇內容:該test文件簇鏈為0x05—>0x06–>0x07(結束),注意簇鏈結束標識為0x0FFFFFFF,文件大小小于一簇大小的直接占用1簇,以0X0FFFFFFF結束
在這里插入圖片描述

(4) 數據區

數據區時真正用于存放用戶數據的區域,數據區的位置在FAT2的后面,具體定位方式如下;

1、通過MBR中的分區表信息得知分區的起始位置。

2、通過分區中DBR得知DBR的保留扇區數以及FAT表的大小,FAT表的個數。

3、通過上面的信息就可以找到數據區的起始位置,數據區 = 隱藏扇區數+DBR保留扇區+(每個FAT表扇區數*2)。

數據區的類容主要由三部分組成:根目錄,子目錄和文件內容。在數據區中是以“簇”為單位進行存儲的,2號簇被分配給根目錄使用。
數據起始扇區=根目錄起始扇區號+(簇號-2)x每簇的扇區數
注:FAT表對所有劃分后的位置由0進行地址編號。0號地址與1號地址被系統保留并存儲特殊標志內容。從2號地址開始,每個地址對應于數據區的簇號,也就是數據區起始位第2簇!FAT表中0和1號表項沒有對應物理地址。
前面我們算出第一個目錄(根目錄)的扇區號34816,我們使用winhex直接跳轉34816過去看下:
在這里插入圖片描述
FAT32文件系統中,分區根目錄下的文件和目錄都放在根目錄區中,子目錄中的文件和目錄都放在子目錄區中,并且每32個字節為一個目錄項(FDT),每個目錄項紀錄著一個目錄或文件(也可能是多個目錄項記錄一個文件或目錄),上圖所示就是一個目錄項。

在FAT32文件系統中,目錄項可以分為四類:卷標目錄項、“.”和“…”目錄項、短文件名目錄項、長文件名目錄項。
我們分別創建SHUIYUE目錄和SHUIYUE.txt文件來看下
在這里插入圖片描述
在這里插入圖片描述
FDT第1字節又表明了該文件的狀態,它有如下四種取值方式:
a. 00H–目錄項的空目錄。
b. E5H–表示該目錄項曾經使用過,但文件已被刪除。
c. 2EH–表示子目錄下的兩個特殊文件 “. “或 “… “目錄項
d. 其它任何字符–表示一個文件名(或目錄名)的第一個字符的ASCII碼值.
我們來看下SHUIYUE.txt目錄項代表的東西

標識長度介紹
deName8字節文件名,不足部分補空格(0x20)0x53 0x48 0x55 0x49 0x59 0x55 0x45 0x20(SHUIYUE)
deExtension3字節擴展名,不足部分補空格(0x20)0x54 0x58 0x54(TXT)
deAttributes1字節文件屬性0x20(存檔)
deLowerCase1字節系統保留0x10
deCTime3字節創建時間0x8c 0x00 0xab
deCDate2字節創建日期0x8d 0x51
deADate2字節最后訪問的日期0x8d 0x51
deHighClust2字節開始簇的高兩個字節0x00 0x00
deMTime2字節最后修改的時間0x09 0xab
deMDate2字節最后修改的日期0x8d 0x51
deLowCluster2字節開始簇的低兩個字節0x06 0x00
deFileSize4字節文件的大小0xd8 0x21 0x00 0x00

從上面我們可以看出SHUIYUE.txt開始簇為0x06我們查找FAT表:
在這里插入圖片描述
從第6簇開始,占據了3簇,我們跳到第6簇看下內容,第6簇在數據區起始扇區34816+(6-2)*8=34848
在這里插入圖片描述
從上可以看出剛好是我們寫入的數據,其他可以自己嘗試,例如新創建一個不同大小的文件、創建子目錄觀察數據的變化。

注:
(1)目錄所在的扇區,都是以32 Bytes劃分為一個單位,每個單位稱為一個目錄項。

(2)根據文件名及后綴,我們可以分為短目錄文件,長目錄文件,簡單點理解,如果文件名>8 byte 或者后綴名>3, 則為長文件目錄,否則為短文件目錄
在這里插入圖片描述


參考文章:
(1)FAT32長文件名短文件名目錄項
(2)詳解FAT32文件系統
(3)FAT32文件系統格式詳解
(4)FAT32文件系統詳解
(5)SD卡中FAT32文件格式快速入門(詳細圖文介紹)
(6)FAT32文件系統SD卡建立MBR引導扇區
(7)FAT32文件系統格式詳解(圖文針對具體文件存儲,分析fat32 SD卡)
(8)MBR、EBR與DBR詳解


本文章僅供學習交流用禁止用作商業用途,文中內容來水枂編輯,如需轉載請告知,謝謝合作

微信公眾號:zhjj0729

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中動態代理實現機制

前言: 代理模式是常用的java設計模式,它的特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等。代理類與委托類之間通常會存在關聯關系,一個代理類…

libiconv庫簡單裁剪支持CP437編碼

有許多人在做項目的時候都會遇到字符編碼的不一致導致的亂碼問題,那如何去解決呢?在Linux系統上可以通過iconv函數族來進行編碼轉換,但有時候我們并不需要全部的字符集,因為可能會占用比較大的空間,本文主要支持CP437編…

簡單java在線測評程序

簡單java程序在線測評程序 一.前言 大家過年好!今年的第一篇博客啊!家里沒有網,到處蹭無線!日子過得真糾結!因為畢設的需求,簡單寫了一個java程序在線測評程序,當然也可以在本地測試…

指針強制類型轉換觸發內存自動對齊

C語言的指針是我們操作很靈活,但是也留下了不少坑,今天工作遇到了一個指針的坑,這里復現一下: 指針類型強制轉換,并進行解引用,引起的內存對齊問題.(一)問題復現: 運行環境:Ubuntu …

簡單文本編輯器

一、前言 聚天地之靈氣,集日月之精華!一個簡單的java文本編輯器由此而生。畢設所需,很是無奈! 二、界面預覽 三、實現思路 1.字體選擇器的實現 (1).字體類 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出現data abort

(一)問題描述 u-boot下新增了一條update的命令,直接輸入update沒有報錯,但是輸入up按TAB鍵補全時發現出現data abort,而且輸入不支持的命令也會有data abort (二)解決方法 最開始我包含的頭…

sublime text學習

Ctrl / ---------------------注釋 Ctrl 滾動 --------------字體變大/縮小 Ctrl N-------------------新建 軟件右下角可以選擇文檔語法模式 Ctrl Shift P ------------------命令模式 命令: sshtml模糊匹配-----語法切換到html模式,同理所得&am…

core文件如何分析

目錄(一)什么是coredump(二)coredump產生的條件(1)coredump產生主要原因:(2)如何生成coredump(三)gdb使用(四)實例調試coredump文件(五)總結(一)什么是coredu…

SpringMVC+FreeMarker

前言: 最近在學習SpringMVC,模板引擎用的是FreeMarker,之前沒有接觸過。利用SpringMVC開發其實還有許多的步驟,比如控制層,服務層,持久化層,實體等等,先弄了一個小demo來總結一下Spr…

SpringMVC那點事

一、SpringMVC返回json數據的三種方式 1、第一種方式是spring2時代的產物&#xff0c;也就是每個json視圖controller配置一個Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js學習內容的整理

1、jquery動態添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…

(一)最鄰近插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;最鄰近插值實現&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;最鄰近插值實現 一般情況下我…

(二)雙線性插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;雙線性插值原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;雙線性插值原理 一般情況下我…

js self = this的解釋

Demo 1: function Person(){this.name hjzgg;this.age 24;this.show function(){alert(name " " age);}}var p new Person();p.show(); 錯誤&#xff1a;name 和 age都沒有定義。 Demo 2: function Person(){this.name hjzgg;this.age 24;this.show functio…

(三)圖像轉灰度圖Python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;轉換原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;轉換原理 &#xff08;三&#xff…

SD卡實例分析fat32文件系統

目錄 環境描述 分析過程 1.SD卡格式化 2.使用winhex打開sd卡 3.MBR分析 4.DBR分析

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我這種菜雞。反反復復看了好幾遍了...&#xff0c;真是... 一、簡單的繼承體系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 關鍵字&#x…

基于matlab的步進電機仿真(一)

這里寫目錄標題環境準備基礎準備模型參數輸入和輸出仿真原理圖仿真資源環境準備 MatLab2021b 基礎準備 打開Matlab&#xff0c;在幫助文檔里面搜索step motor,我們這里選擇如下模型 該模型實現了一個通用的步進電機模型&#xff1a; 可變磁阻步進電機永磁或混合步進電機 …

java自定義類加載器

前言 java反射&#xff0c;最常用的Class.forName()方法。做畢設的時候&#xff0c;接收到代碼字符串&#xff0c;通過 JavaCompiler將代碼字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse項目中的bin目錄里&#xff09;&#xff0c;然后通過jav…

常用網址

MDN : 一個不錯的前端學習網站 https://developer.mozilla.org/zh-CN/  https://developer.mozilla.org/en-US/ CodePen 是一個網站前端設計開發平臺&#xff0c;是一個針對網站前端代碼設計的開發工具。 RunJS - 在線編輯、展示、分享、交流你的 JavaScript 代碼 : http://r…