硬盘存储结构及分区简介
硬盤結(jié)構(gòu)簡介:
很久以前, 硬盤的容量還非常小的時候,人們采用與軟盤類似的結(jié)構(gòu)生產(chǎn)硬盤. 也就是硬盤盤片的每一條磁道都具有相同的扇區(qū)數(shù). 由此人們定義硬盤參數(shù)為(CHS)參數(shù),即磁頭數(shù)(Heads),柱面數(shù)(Cylinders),扇區(qū)數(shù)(Sectors),以及相應(yīng)的尋址方式。
其中:
磁頭數(shù)表示硬盤總共有幾個磁頭,也就是有幾面盤片,最大為255 (用8個二進(jìn)制位存儲);
柱面數(shù)表示硬盤每一面盤片上有幾條磁道, 最大為1023(用10個二進(jìn)制位存儲);
扇區(qū)數(shù)(Sectors) 表示每一條磁道上有幾個扇區(qū), 最大為63 (用6個二進(jìn)制位存儲);
每個扇區(qū)一般是 512個字節(jié), 理論上講這不是必須的, 但好象沒有取別的值的;
所以磁盤最大容量為:255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes )
或硬盤廠商常用的單位:255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )
在 CHS 尋址方式中, 磁頭, 柱面, 扇區(qū)的取值范圍分別為 0 到 Heads – 1,0 到 Cylinders - 1,1 到 Sectors (注意是從 1 開始)
在老式硬盤中,由于每個磁道的扇區(qū)數(shù)相等,所以外道的記錄密度要遠(yuǎn)低于內(nèi)道,因此會浪費(fèi)很多磁盤空間 (與軟盤一樣)。為了解決這一問題,進(jìn)一步提高硬盤容量,人們改用等密度結(jié)構(gòu)生產(chǎn)硬盤。也就是說,外圈磁道的扇區(qū)比內(nèi)圈磁道多。采用這種結(jié)構(gòu)后,硬盤不再具有實(shí)際的3D參數(shù),尋址方式也改為線性尋址,即以扇區(qū)為單位進(jìn)行尋址。為了與使用3D尋址的老軟件兼容在硬盤控制器內(nèi)部安裝了一個地址翻譯器。由它負(fù)責(zé)將老式3D參數(shù)翻譯成新的線性參數(shù)。這也是為什么現(xiàn)在硬盤的3D參數(shù)可以有多種選擇的原因 (不同的工作模式, 對應(yīng)不同的3D參數(shù), 如 LBA, LARGE, NORMAL)。
磁盤分區(qū)簡介:
BOOTSECTOR簡介
Boot Sector 也就是硬盤的第一個扇區(qū), 它由 MBR (Master Boot Record), DPT (Disk Partition Table) 和 Boot Record ID 三部分組成。MBR 又稱作主引導(dǎo)記錄占用 Boot Sector 的前 446 個字節(jié) ( 0 to 0x1BD ), 存放系統(tǒng)主引導(dǎo)程序 (它負(fù)責(zé)從活動分區(qū)中裝載并運(yùn)行系統(tǒng)引導(dǎo)程序).
DPT 即主分區(qū)表占用 64 個字節(jié) (0x1BE to 0x1FD), 記錄了磁盤的基本分區(qū)信息,主分區(qū)表分為四個分區(qū)項(xiàng),,每項(xiàng) 16 字節(jié),分別記錄了每個主分區(qū)的信息(因此最多可以有四個主分區(qū)).Boot Record ID 即引導(dǎo)區(qū)標(biāo)記占用兩個字節(jié) (0x1FE and 0x1FF), 對于合法引導(dǎo)區(qū),它等于 0xAA55,這是判別引導(dǎo)區(qū)是否合法的標(biāo)志。
BOOTSECTOR的具體結(jié)構(gòu)如下圖所示:
| Master Boot Record主引導(dǎo)記錄(446字節(jié)) | |
| 分區(qū)信息1(16字節(jié)) | |
| 分區(qū)信息2(16字節(jié)) | |
| 分區(qū)信息3(16字節(jié)) | |
| 分區(qū)信息4(16字節(jié)) | |
| ? | 55AA |
BOOTSECTOR結(jié)構(gòu)圖
分區(qū)表結(jié)構(gòu)簡介
分區(qū)表由四個分區(qū)項(xiàng)構(gòu)成, 每一項(xiàng)長度為16個字節(jié),分區(qū)表結(jié)構(gòu)如下圖所示:
| 分區(qū)狀態(tài),0=未激活,0x80=激活(注意此項(xiàng)) | 0 |
| 分區(qū)起始磁頭號 | 1 |
| 分區(qū)起始扇區(qū)和柱面號,底字節(jié)的低6位為扇區(qū)號,高2位為柱面號的第9,10位,高字節(jié)為柱面號的低8位 | 2 |
| 3 | |
| 分區(qū)類型,如0x0B=FAT32,0x83=Linux等,0表示此項(xiàng)未用 | 4 |
| 分區(qū)結(jié)束磁頭號 | 5 |
| 分區(qū)結(jié)束扇區(qū)和柱面號,低字節(jié)的低6位為扇區(qū)號,高2位為柱面號的第9,10位,高字節(jié)為柱面號的低8位 | 6 |
| 7 | |
| 在線性尋址方式下的分區(qū)相對扇區(qū)地址(對于基本分區(qū)即為絕對地址) | 8 |
| 9 | |
| A | |
| B | |
| 分區(qū)大小(總扇區(qū)數(shù)) 注意:在DOS/Windows系統(tǒng)下,基本分區(qū)必須以柱面為單位劃分(Sectors*Heads個扇區(qū)),如對于CHS為764/255/63的硬盤,分區(qū)的最小尺寸為255*63*512/1048576=7.844MB | C |
| D | |
| E | |
| F |
分區(qū)表結(jié)構(gòu)圖
擴(kuò)展分區(qū)簡介
由于主分區(qū)表中只能分四個分區(qū), 無法滿足需求, 因此設(shè)計(jì)了一種擴(kuò)展分區(qū)格式. 基本上說,擴(kuò)展分區(qū)的信息是以鏈表形式存放的, 但也有一些特別的地方.
首先, 主分區(qū)表中要有一個基本擴(kuò)展分區(qū)項(xiàng), 所有擴(kuò)展分區(qū)都隸屬于它,也就是說其他所有擴(kuò)展分區(qū)的空間都必須包括在這個基本擴(kuò)展分區(qū)中. 對于DOS / Windows 來說, 擴(kuò)展分區(qū)的類型為 0x05(EXTENDX). 除基本擴(kuò)展分區(qū)以外的其他所有擴(kuò)展分區(qū)則以鏈表的形式級聯(lián)存放,后一個擴(kuò)展分區(qū)的數(shù)據(jù)項(xiàng)記錄在前一個擴(kuò)展分區(qū)的分區(qū)表中, 但兩個擴(kuò)展分區(qū) 的空間并不重疊.擴(kuò)展分區(qū)類似于一個完整的硬盤, 必須進(jìn)一步分區(qū)才能使用. 但每個擴(kuò)展分區(qū)中只能存在一個其他分區(qū). 此分區(qū)在 DOS/Windows 環(huán)境中即為邏輯盤. 因此每一個擴(kuò)展分區(qū)的分區(qū)表 (同樣存儲在擴(kuò)展分區(qū)的第一個扇區(qū)中)中最多只能有兩個分區(qū)數(shù)據(jù)項(xiàng)(包括下一個擴(kuò)展分區(qū)的數(shù)據(jù)項(xiàng)).
擴(kuò)展分區(qū)的分區(qū)表存放在該分區(qū)的第一個扇區(qū)中它的結(jié)構(gòu)與硬盤的BOOTSETOR基本相同,只是沒有主引導(dǎo)紀(jì)錄,即該扇區(qū)的0-0X1BD的數(shù)據(jù)是無效的,另外它的分區(qū)表只有前面兩項(xiàng)是有效的。他的最后兩個字節(jié)也是合法性檢測標(biāo)志即55AA
下面是擴(kuò)展分區(qū)的結(jié)構(gòu)示意圖
擴(kuò)展分區(qū)的結(jié)構(gòu)示意圖
硬盤分區(qū)類型
0 未使用分區(qū)項(xiàng)
1 DOS12一種Fat表為12位的分區(qū)主要用于早期小硬盤和部分軟盤
2 xenix一種linux分區(qū)
4 D0S16早期硬盤分區(qū)方法,分區(qū)表項(xiàng)為16位,最大支持32M分區(qū)大小
5 EXTEND擴(kuò)展分區(qū)的一種該分區(qū)的 起始扇區(qū)為前面的第一個EXTENDX分區(qū)起始扇區(qū)+該分區(qū)的相對偏移
6 BIGDOS即FAT16分區(qū) 分區(qū)表為16位,每簇最大為32K,最大分區(qū)為2G
7 NTFS分區(qū)
B FAT32分區(qū) 分區(qū)表為32位
C FAT32X分區(qū)與FAT32基本相同
E BIGDOSX即FAT16分區(qū)擴(kuò)展 分區(qū)表為16位,每簇最大可以超過32K
F EXTENDX擴(kuò)展分區(qū)的一種,起始扇區(qū)為該分區(qū)的相對偏移或者 前面的前面的第一個EXTENDX分區(qū)起始扇區(qū)+該分區(qū)的相對偏移;
如何找到一個邏輯分區(qū)
前面介紹了硬盤的分區(qū)結(jié)構(gòu),下面主要講解如何找到一個硬盤的邏輯分區(qū)首先讀取硬盤BOOTSECTOR,讀取該硬盤的分區(qū)表例如下面是一個15G硬盤的BOOTSECTOR
一個硬盤的BOOTSECTORS數(shù)據(jù)
其中紅色部分是主引導(dǎo)紀(jì)錄(MBR)藍(lán)色和淺綠色是分區(qū)表數(shù)據(jù)一共是4個分區(qū)項(xiàng)和顯然后兩個分區(qū)表項(xiàng)是未用的。最后兩個字節(jié)是合法性標(biāo)志。
對于第一個分區(qū)表項(xiàng)可以知道該分區(qū)是一個活動分區(qū),分區(qū)類型是0X0C (FAT16)分區(qū)分區(qū)相對扇區(qū)起始地址是0x3f(63) 分區(qū)大小是0x32F8E(208782個扇區(qū)大小大概未100M由于這是柱分區(qū)該分區(qū)的起始扇區(qū)號就為0x3f;
對于第二個分區(qū)表項(xiàng)可以知道該分區(qū)的分區(qū)類型是0x0F(EXTENDX)分區(qū),起始扇區(qū)地址是0X32FCD(208845)分區(qū)大小是0X1BC6CD5(29125845)個扇區(qū)。
讀取扇區(qū)0X32FCD取出擴(kuò)展分區(qū)得的分區(qū)表項(xiàng)
00 01 01 0D 07 FE BF 0A 3F 00 00 00 3F 04 7D 00
00 00 81 0B 05 FE FF 09 7E 04 7D 00 3F 82 3E 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
取出第一個分區(qū)表項(xiàng)知道該分區(qū)是類型是7(NTFS分區(qū))分區(qū)大小是0X7D043F分區(qū)相對扇區(qū)號為0x3f可以算出分區(qū)的起始扇區(qū)是0X32FCD+0X3F=0X3300C
取出第二個分區(qū)表項(xiàng)知道該分區(qū)是類型是5(EXTEND分區(qū))分區(qū)大小是0X3E823F分區(qū)相對扇區(qū)號為0X7D047E可以算出分區(qū)的起始扇區(qū)是0X32FCD+0X7D047E=0X80344B
讀取扇區(qū)0X80344B取出擴(kuò)展分區(qū)得的分區(qū)表項(xiàng)
00 01 81 0b 0b fe ff 08 3f 00 00 00 00 82 3e 00
00 00 c1 0a 05 fe ff ff bd 86 bb 00 57 a7 00 01
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
取出第一個分區(qū)表項(xiàng)知道該分區(qū)是類型是0b(Fat32分區(qū))分區(qū)大小是0X3e8200分區(qū)相對扇區(qū)號為0x3f可以算出分區(qū)的起始扇區(qū)是0X32FCD+0x7d047e +0X3F=0X80348a
取出第二個分區(qū)表項(xiàng)知道該分區(qū)是類型是5(EXTEND分區(qū))分區(qū)大小是0X100a757分區(qū)相對扇區(qū)號為0Xbb86bd可以算出分區(qū)的起始扇區(qū)是0X32FCD+0Xbb86bd=0Xbbe68a
讀取扇區(qū)0Xbbe68a取出擴(kuò)展分區(qū)得的分區(qū)表項(xiàng)
00 01 c1 0a 07 fe ff ff 3f 00 00 00 18 a7 00 01
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
取出第一個分區(qū)表項(xiàng)知道該分區(qū)是類型是7(NTFS分區(qū))分區(qū)大小是0X100a718分區(qū)相對扇區(qū)號為0x3f可以算出分區(qū)的起始扇區(qū)是0X32FCD+0xbbe68a+3f=0Xbeb6c9
邏輯分區(qū)簡介:
FAT16 FAT32 NTFS邏輯分區(qū)BOOTSECTOR
邏輯分區(qū)的BOOTSECTOR的第一個扇區(qū)它由以下部分組成 1.跳轉(zhuǎn)指令 2.硬盤分區(qū)類型的文本字符名 3.分區(qū)參數(shù)塊 4.擴(kuò)展的分區(qū)參數(shù)塊 5.啟動指令塊 6.合法性標(biāo)志55AA
對于不同的分區(qū)類型這些塊的內(nèi)容與意義是不同的下面是FAT FAT32 NTFS各分區(qū)的BOOTSECTORD的內(nèi)容語義的略圖
| 0H | 3 Byte | 跳轉(zhuǎn)指令 | EB 3C 90 | ||
| 3H | 8 Byte | 硬盤分區(qū)類型的文本字符名 | MSDOS5.0 | ||
| 0BH | 25 Byte | 分區(qū)參數(shù)塊 | 0BH | 2 Byte | 每扇區(qū)字節(jié)數(shù) |
| 0DH | 1 Byte | 每簇扇區(qū)數(shù) | |||
| 0EH | 2 Byte | 保留扇區(qū)數(shù) | |||
| 10H | 1 Byte | FAT表份數(shù) | |||
| 11H | 2 Byte | 根目錄入口項(xiàng) | |||
| 13H | 2 Byte | 磁盤大小 | |||
| 15H | 1 Byte | 介質(zhì)類型 | |||
| 16H | 2 Byte | FAT表占用扇區(qū) | |||
| 18H | 2 Byte | 每道扇區(qū)數(shù) | |||
| 1AH | 2 Byte | 磁頭數(shù) | |||
| 1CH | 2 Byte | 隱藏扇區(qū)數(shù) | |||
| 24H | 26 Byte | 擴(kuò)展的分區(qū)參數(shù)塊 | 24H | 1 Byte | 物理磁盤號 |
| 25H | 1 Byte | 當(dāng)前磁頭號 | |||
| 26H | 1 Byte | 0x28或0x29 | |||
| 27H | 4 Byte | 磁盤序列號 | |||
| 2BH | 11 Byte | 卷表 | |||
| 36H | 8 Byte | 系統(tǒng)標(biāo)識符 | |||
| 3EH | 448 | 啟動指令塊 | ? | ||
| 1FE | 2 Byte | 合法性標(biāo)志 | 55AA | ||
FAT16分區(qū)BOOTSECTOR結(jié)構(gòu)圖
| 0H | 3 Byte | 跳轉(zhuǎn)指令 | EB 58 90 | ||
| 3H | 8 Byte | 硬盤分區(qū)類型的文本 | MSWIN4.1 | ||
| 0BH | 25 Byte | 分區(qū)參數(shù)塊 | 0B | 2 Byte | 每扇區(qū)字節(jié) |
| 0D | 1 Byte | 每簇扇區(qū)數(shù) | |||
| 0E | 2 Byte | 保留扇區(qū)數(shù) | |||
| 10 | 1 Byte | FAT表份數(shù) | |||
| 11 | 2 Byte | 未用 | |||
| 15 | 1 Byte | 介質(zhì)類型 | |||
| 16 | 2 Byte | 未用 | |||
| 18 | 2 Byte | 每道扇區(qū)數(shù) | |||
| 1A | 2 Byte | 磁頭數(shù) | |||
| 1C | 2 Byte | 隱藏扇區(qū)數(shù) | |||
| 20 | 4 Byte | 磁盤總扇區(qū) | |||
| 24H | 52 Byte | 擴(kuò)展的分區(qū)參數(shù)塊 | 24 | 4 Byte | FAT表占用 |
| 2C | 1 Byte | 根目錄入口 | |||
| 40 | 1 Byte | 物理磁盤號 | |||
| 42 | 1 Byte | 0x29 | |||
| 43 | 4 Byte | 磁盤序列號 | |||
| 47 | 8 Byte | 系統(tǒng)標(biāo)識符 | |||
| 52 | 8 Byte | 系統(tǒng)標(biāo)識符 | |||
| 58 | 422 | 啟動指令塊 | ? | ||
| 1FE | 2 | 合法性標(biāo)志 | 55AA | ||
FAT32分區(qū)BOOTSECTOR結(jié)構(gòu)圖
| 0H | 3 Byte | 跳轉(zhuǎn)指令 | EB 52 90 | ||
| 03H | 8 Byte | 硬盤分區(qū)類型的文本字符名 | NTFS | ||
| 0BH | 25 Byte | 分區(qū)參數(shù)塊 | 0B | 2 Byte | 每扇區(qū)字節(jié)數(shù) |
| 0D | 1 Byte | 每簇扇區(qū)數(shù) | |||
| 0E | 2 Byte | 保留扇區(qū)數(shù) | |||
| 10 | 1 Byte | 0 | |||
| 11 | 4 Byte | 0 | |||
| 15 | 1 Byte | 介質(zhì)類型 | |||
| 16 | 2 Byte | 0 | |||
| 18 | 2 Byte | 每道扇區(qū)數(shù) | |||
| 1A | 2 Byte | 磁頭數(shù) | |||
| 1C | 2 Byte | 隱藏扇區(qū)數(shù) | |||
| 20 | 4 Byte | 0(未用) | |||
| 24H | 52 Byte | 擴(kuò)展的分區(qū)參數(shù)塊 | 24 | 4 Byte | 0(未用) |
| 28 | 8 Byte | 總扇區(qū)數(shù) | |||
| 30 | 8 Byte | MFT 表起始簇 | |||
| 38 | 8 Byte | MFT鏡像起始簇 | |||
| 40 | 4 Byte | 每個記錄段簇 | |||
| 44 | 4 Byte | 每個索引占簇 | |||
| 48 | 8 Byte | 磁盤序列號 | |||
| 50 | 4 Byte | 校驗(yàn)和 | |||
| 54H | 426 Byte | 啟動指令塊 | ? | ||
| 1FE | 2 Byte | 合法性標(biāo)志 | 55AA | ||
NTFS分區(qū)BOOTSECTOR結(jié)構(gòu)圖
FAT16 FAT32邏輯分區(qū)組成結(jié)構(gòu)
FAT16和FAT32的分區(qū)組成結(jié)構(gòu)比較類似其基本如下:
| BOOT SETCOR |
| 保留扇區(qū) |
| FAT表1 |
| FAT表2 |
| 根目錄區(qū) |
| 磁盤內(nèi)容 |
FAT16 FAT32邏輯盤結(jié)構(gòu)圖
其中FAT16的根目錄區(qū)是固定大小的緊跟在FAT表后,而FAT32的根目錄區(qū)可以是不固定大小的在BOOTSECTOR中提供了根目錄區(qū)的第一個簇的簇號。
每一個目錄項(xiàng)占20個字節(jié)這些字節(jié)的定義如下
0xA文件名 第一個字節(jié)為E5表示該目錄項(xiàng)已被刪除,為0表示未用,為2E表示是當(dāng)前目錄或者根目錄。
0xB是文件屬性BIT0文檔 BIT1只讀文件BIT2系統(tǒng)文件BIT3隱藏文件BIT4目錄 BIT5卷標(biāo)
0x10-0X13 文件創(chuàng)建日期
0x14-0X15 文件或目錄起始簇號高16位(對FAT16無效為00 00)。
0x16-0X19 文件更改日期
0X1A-0X1B 文件或目錄起始簇號低16位。
0X1C-0X1F 文件大小(對目錄該項(xiàng)為0)
整個磁盤空間是按簇劃分,在BOOTSECTOR中記錄了每個簇的大小參數(shù)。
FAT表是用來記錄整個磁盤空間的使用與分配情況的它的結(jié)構(gòu)是一種鏈?zhǔn)浇Y(jié)構(gòu)。
他每16個字節(jié)或者32個字節(jié)表示一個簇。例如我們在FAT16分區(qū)找到第121簇的使用情況過程如下:
假設(shè)該分區(qū)大小為2G,起始扇區(qū)為63,FAT表為255個扇區(qū),根目錄有0X100個入口,每簇大小為64個扇區(qū),隱含扇區(qū)為1個。
該簇在FAT表中的位置為:
A=121*2=241;B=A%512;IF(B!=0);B=1;
C=63+1+A/512+B;
讀取扇區(qū)C到緩沖區(qū)取第A%512/2個字即為該扇區(qū)的下一個扇區(qū),如果為0表示該扇區(qū)未用,為FF FF表示該扇區(qū)為最后一個扇區(qū)。其他的表示有下一個扇區(qū)。
該簇的物理磁盤扇區(qū)號是63+1+255*2+0X100*20/512+(121-2)*64
讀于一個FAT32分區(qū),要找到121簇的使用情況
假設(shè)該分區(qū)大小為4G,起始扇區(qū)為200048,FAT表為3997個扇區(qū),每簇大小為8個扇區(qū),根目錄起始簇號為2,隱含扇區(qū)為32個。
該簇在FAT表中的位置為:
A=121*4=241;B=A%512;IF(B!=0);B=1;
C=20048+32+A/512+B;
讀取扇區(qū)C到緩沖區(qū)取第A%512/4個雙字即為該扇區(qū)的下一個扇區(qū),如果為0表示該扇區(qū)未用,為FF FF FF FF表示該扇區(qū)為最后一個扇區(qū)。其他的表示有下一個扇區(qū)。
該簇的物理磁盤扇區(qū)號是20048+32+3997*2+(121-2)*8
經(jīng)過上面的介紹我們就比較親楚整個FAT16 FAT32分區(qū)的尋址方式
例如讀取文件C:\Windows\SYSTEM.INI
首先找到邏輯盤C的起始扇區(qū),然后讀出他的根目錄區(qū),在根目錄區(qū)中找到Windows子目錄項(xiàng),找到目錄項(xiàng)中該子目錄的起始簇,在FAT表中找到以該簇為起始簇的簇鏈,讀出這些簇的所在的扇區(qū)內(nèi)容然后找到文件名為SYTEM.INI的目錄項(xiàng),取得它的起始簇號,讀出該簇為起始簇的簇鏈的所有扇區(qū)內(nèi)容即可。
NTFS邏輯分區(qū)組成結(jié)構(gòu)
NTFS分區(qū)的結(jié)構(gòu)比FAT16和FAT32復(fù)雜。整個NTFS分區(qū)也是和FAT分區(qū)一樣以簇為基本的的存儲結(jié)構(gòu),但NTFS分區(qū)把整個分區(qū)的全部扇區(qū)都作為簇來劃分,而FAT分區(qū)的BOOTSECTORFAT表,根目錄(FAT32除外),作為另外的部分它的起始簇是在這些扇區(qū)之后的。
NTFS分區(qū)的結(jié)構(gòu)大概如下
BOOTSECTOR記錄了MFT表的起始簇號,通過BOOTSECTOR找到MFT的起始扇區(qū),(方法是 磁盤起始扇區(qū)+簇號*每簇扇區(qū)數(shù))。
MFT表是由很多個MFT記錄構(gòu)成,每個MFT記錄表示一個文件的信息,MFT表將整個文件系統(tǒng)的內(nèi)容,都當(dāng)成文件來處理包括它自己本身。MFT表記錄將文件的所有信息都當(dāng)成屬性來處理。
下面是MFT記錄的頭結(jié)構(gòu)說明。
| 起始 | 長度 | 意義 |
| 0 | 4 | MFT記錄標(biāo)志FILE |
| 4 | 2 | 修復(fù)效驗(yàn)偏移 |
| 6 | 2 | 修復(fù)數(shù)據(jù)長度,包含第一個字節(jié) |
| 8 | 8 | LSN |
| 10 | 2 | 序列號 |
| 12 | 2 | 鏈接個數(shù)(有多少個文件名鏈接在這個實(shí)際文件上) |
| 14 | 2 | 第一個屬性的起始于該MFT記錄的哪一個字節(jié) |
| 16 | 2 | BIT0表示該記錄中有屬性值存于記錄外,BIT1表示該記錄中存有文件目錄 |
| 18 | 4 | 該記錄的有效字節(jié)數(shù)(記錄頭+所有屬性長度和) |
| 1C | 4 | 該記錄的長度 |
| 20 | 8 | 高2字節(jié)主MFT記錄的記錄號,低2字節(jié)0 |
| 28 | 2 | 所有屬性加1 |
| 2A | 6 | 修復(fù)數(shù)據(jù)依賴于記錄長度 |
| MFT記錄頭 |
| 屬性1 |
| 屬性2 |
| 屬性3 |
MFT記錄結(jié)構(gòu)示意圖
MFT的記錄由記錄頭和屬性列表組成,每一個屬性都有一個結(jié)構(gòu)相同的屬性頭,屬性頭分兩種,一種是屬性內(nèi)容在MFT表中,一種是屬性的內(nèi)容在磁盤分配的簇中,屬性頭分兩部分對于所有屬性第一部分結(jié)構(gòu)是相同的第二部分結(jié)構(gòu)不同:
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 4 | 屬性類型 |
| 4 | 2 | 屬性總長度 |
| 8 | 1 | 屬性數(shù)據(jù)是否存在MFT表中,0表示是,1表示存在磁盤分配的空間 |
| 9 | 1 | 屬性名長度 |
| A | 2 | 屬性內(nèi)容相當(dāng)于屬性頭起始地址的偏移 |
| C | 2 | 屬性值是否壓縮,0表示沒壓縮,1表示壓縮 |
| E | 2 | 屬性標(biāo)志(通常為0) |
屬性頭的第一部分內(nèi)容(前16字節(jié))
| 10 | 4 | 1屬性數(shù)據(jù)長度 |
| 14 | 2 | 屬性數(shù)據(jù)起始字節(jié)(相當(dāng)于屬性頭起始地址) |
| 16 | 2 | 屬性在MFT屬性中是第幾個屬性(從0開始) |
屬性內(nèi)容在MFT表中的屬性頭第二部分內(nèi)容
| 10 | 10H | 屬性內(nèi)容所在簇計(jì)算的起始簇 |
| 20 | 2 | 屬性數(shù)據(jù)起始字節(jié)(相當(dāng)于屬性頭起始地址) |
| 22 | 2 | 屬性內(nèi)容壓縮方法(不太清楚) |
| 28 | 8 | 為屬性數(shù)據(jù)的分配空間大小 |
| 30 | 8 | 屬性數(shù)據(jù)的實(shí)際大小 |
| 38 | 8 | 初始化數(shù)據(jù)長度(對于壓縮的數(shù)據(jù)) |
| 40 | 8 | 壓縮前的長度(對于壓縮數(shù)據(jù)) |
| 48 | ? | vcn 1cn runlength 數(shù)據(jù)所在簇的位置(具體解釋在后面) |
屬性內(nèi)容不在MFT表中的屬性的第二部分內(nèi)容
屬性頭后緊跟的是屬性內(nèi)容NTFS的標(biāo)準(zhǔn)的屬性包括以下幾種。
| 10H | 標(biāo)準(zhǔn)信息屬性 | Standard information |
| 20H | 屬性列表屬性 | Attribute list |
| 30H | 文件名屬性 | File Name |
| 40H | 卷表版本屬性 | Volume Version |
| 50H | 安全性描述屬性 | Security descriptor |
| 60H | 卷表名屬性 | Volume name |
| 70H | 卷表信息屬性 | Volume information |
| 80H | 數(shù)據(jù)內(nèi)容屬性 | Data |
| 90H | 索引根目錄屬性 | Index Root |
| A0H | 索引分配表屬性 | Index Allocation |
| B0H | 鏡像屬性 | BitMap |
| C0H | 鏈接屬性 | Symlink |
| D0H | HPFS擴(kuò)展屬性信息屬性 | HPFS extended attributes information |
| E0H | HPFS擴(kuò)展屬性 | HPFS extended attributes |
對于NTFS標(biāo)準(zhǔn)屬性我并不完全了解下面就我所了解的部分進(jìn)行介紹
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 8 | 文件創(chuàng)建時間 |
| 8 | 8 | 文件內(nèi)容最后一次修改時間 |
| 10 | 8 | 文件別的屬性最后一次修改時間 |
| 18 | 8 | 文件最后一次修改時間 |
| 20 | 4 | 文件存取控制800文件內(nèi)容是壓縮的,400文件是一個連接,20文檔標(biāo)志,4系統(tǒng)文件標(biāo)志,2隱含文件標(biāo)志,1系統(tǒng)文件標(biāo)志 |
| 24 | C | 未用通常為0 |
標(biāo)準(zhǔn)信息屬性內(nèi)容定義
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 4 | 屬性名 |
| 4 | 2 | 屬性長度 |
| 6 | 1 | 屬性字符名長度 |
| 8 | 8 | 屬性簇號計(jì)算起始簇號 |
| 10 | 8 | 包含該屬性的MFT記錄號 |
| 38 | 8 | 文件存取控制38 |
| 1A | 長度為BIT6*2 | 屬性名的Unicode |
屬性列表屬性內(nèi)容定義
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 8 | 該文件的根目錄的MFT記錄號 |
| 8 | 20 | 文件的時間信息(與基本信息中的相同) |
| 28 | 8 | 屬性分配空間 |
| 30 | 8 | 屬性大小 |
| 38 | 8 | 文件屬性 38 20 文檔標(biāo)志 4 系統(tǒng)文件標(biāo)志,2隱含文件標(biāo)志,1系統(tǒng)文件標(biāo)識,39 08 壓縮 3B10 目錄 |
| 40 | 1 | 文件名長度 |
| 41 | 1 | 文件名類型 0 posix 1 unicode 2 dos 3both dos and unicode |
| 42 | Q長度為BIT40*2 | 文件名的Unicode |
文件名屬性內(nèi)容定義
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 4 | 總是30H |
| 4 | 4 | 總是1 |
| 8 | 4 | 索引記錄大小 |
| C | 4 | 每個簇可以記錄的索引記錄個數(shù) |
| 10 | 4 | 總是10 |
| 14 | 4 | 整個屬性大小+10H |
| 1C | 2 | 1如果有index allocation 屬性存在 |
| 1E | 2 | 標(biāo)志位(不知道意義) |
索引根目錄屬性定義
索引分配表屬性 該屬性分配索引空間以存放目錄
如果一個屬性內(nèi)容無法在MFT表中放下,MFT表就會申請磁盤空間,存放在申請的空間中,屬性列表定義中第48字節(jié)開始說明了該屬性所在的磁盤簇號。下面是該字段的意義的英文說明以及簡單的翻譯:
Nonresident attributes are stored in intervals of clusters called runs. Each run is represented by its starting cluster and its length. The starting cluster of a run is coded as an offset to the starting cluster of the previous run. Length and starting cluster are variable size fields. The first byte of a run indicates the size of both. The size of the offset is stored in the high nibble, and the size of the length in the low nibble.
For compressed or sparse runs, the offset is 0, and the size of the offset is also 0. Each compression unit starts at a multiple of 16 clusters. If compression is possible, at the VCN of a unit will be one or more data runs followed by an empty run. If there are data runs for more than 16 clusters, the unit was not compressible.If there is no data run at all (only a large empty run), the unit consists of all zeroes.
Example: 21 20 ED 5 22 48 7 48 22 21 28 C8 DB
First run: 20 clusters starting from 5ED (5ED to 60D)
2nd run: 748 clusters starting from 5ED+2248 (2835 to 2F7D)
3rd run: 28 clusters starting from 2835+DBC8 (3FD to 425)
Note that the offset is interpreted as signed value
不存儲于MFT表中的屬性值被存儲于分散的簇中稱為RUN。每個RUNS由它的起始簇和長度構(gòu)成。起始簇號和長度存儲于變長的域中,一個RUN的第一個字節(jié)表明了起始簇號和簇的個數(shù)分別占用的字節(jié)數(shù),跟著簇的個數(shù)數(shù)據(jù),接著是起始簇號的數(shù)據(jù)。入果沒有RUN存在著RUN的起始字節(jié)為0,RUNS是一個累加和,第二個RUN的起始簇號需要加上第一個RUN的起始簇號,以此類推。
NTFS分區(qū)的目錄結(jié)構(gòu)
NTFS分區(qū)的目錄結(jié)構(gòu)由文件名索引組成,它由 索引根目錄屬性(Index Root)
索引分配表屬性 (Index Allocation) 索引根目錄屬性表明該MFT表記錄是一個目錄,索引分配表屬性給該目錄分配磁盤空間以便存儲索引記錄(Index buffer)。
索引記錄由索引記錄頭和多個索引記錄項(xiàng)主組成,一個索引記錄大小為2k。其結(jié)構(gòu)如下:
| 索引記錄頭 |
| 索引記錄項(xiàng)1 |
| 索引記錄項(xiàng)2 |
| 索引記錄項(xiàng)N |
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 4 | 索引記錄標(biāo)志 總是INDEX |
| 4 | 2 | 自修復(fù)數(shù)據(jù)存儲位置 通常是28H |
| 6 | 2 | 自修復(fù)數(shù)據(jù)長度 |
| 10 | 8 | VCN值 |
| 18 | 2 | 頭結(jié)構(gòu)長度(第一個索引記錄項(xiàng)入口字節(jié)地址-18) |
| 1C | 4 | 整個記錄的長度 |
| 20 | 4 | 整個記錄存儲數(shù)據(jù)的長度 |
| 24 | 4 | 1表示沒有索引記錄項(xiàng) |
| 28 | A | 自修復(fù)數(shù)據(jù) |
索引記錄頭結(jié)構(gòu)定義
索引記錄項(xiàng)是在這個目錄下的文件或目錄的索引結(jié)構(gòu)其定義如下
| 偏移(16進(jìn)制) | 長度(16進(jìn)制) | 內(nèi)容的意義 |
| 0 | 8 | 該文件的MFT記錄號 |
| 8 | 2 | 記錄項(xiàng)長度 |
| A | 2 | 0x42+0x2*<0x50>可能是一個校驗(yàn)位 |
| C | 1 | 本記錄項(xiàng)有沒有子項(xiàng)(1表示有,為了支持DOS文件名) |
| 10 | 8 | 父目錄的MFT記錄號 |
| 18 | 20 | 文件的時間信息 |
| 38 | 8 | 文件數(shù)據(jù)屬性分配磁盤空間大小 |
| 50 | 1 | 文件名長度 |
| 51 | 1 | 文件名類型(詳見文件名屬性) |
| 52 | 長度為BIT8*2 | 文件名(Unicode) |
索引記錄項(xiàng)定義
NFTS分區(qū)重要文件:
MFT表里存儲了所有的文件的基本信息,MFT表的前16個記錄是保留給系統(tǒng)使用的,這些文件是:
| MFT 記錄0 | $MFT文件 | 即MFT表本身的信息 |
| MFT 記錄1 | $MFTMIRR文件 | MFT表的第一個記錄內(nèi)容的備份 |
| MFT 記錄2 | $LogFile文件 | 緩沖區(qū)文件保證系統(tǒng)突然死機(jī)后,重啟時用 |
| MFT 記錄3 | $Volume文件 | 磁盤卷表文件 |
| MFT 記錄4 | $Attrdef文件 | 屬性定義文件,包含各種屬性的定義 |
| MFT 記錄5 | $Root文件 | 根目錄文件,分區(qū)目錄結(jié)構(gòu)的入口 |
| MFT 記錄6 | $BitMap文件 | 磁盤分配鏡像文件,每個位表示一個簇是否被分配 |
| MFT 記錄7 | $Boot文件 | 指向磁盤boot setor開始的16個扇區(qū) |
| MFT 記錄8 | $BadClus文件 | 磁盤壞簇的鏡像文件 |
| MFT 記錄9 | $Quota文件 | 不太清楚該文件的用處 |
| MFT 記錄10 | $UpCase文件 | 大寫字母對應(yīng)的Unicode碼 |
| MFT 記錄10 | $MFT記錄15 | 未用 |
最后介紹一下NTFS文件系統(tǒng)中一個文件例如:要讀取文件F:\WINNT\SYSTEM32\ANSI .SYS
具體步驟如下:
1讀取分區(qū)表信息,找到磁盤F的起始扇區(qū)。
2讀取F盤的第一個扇區(qū)(分區(qū)的BOOTSETOR)取得分區(qū)的每簇大小,MFT表起始簇號,每簇大小等信息。
3.讀取MFT表的第五個記錄(根目錄)找到目錄索引所在簇號。
4.讀取索引,查找WINNT目錄所在的MFT記錄號
5.讀取WINNT目錄的MFT記錄,找到目錄索引所在簇號。
6.讀取索引,查找SYTEM32目錄所在MFT記錄號
7. 讀取SYTEM32目錄的MFT記錄,找到目錄索引所在簇號。
8. 讀取索引,查找ANSI . SYS所在MFT記錄號
9. 讀取ANSI .SYS文件的MFT記錄,找到它的DATA屬性。
10.根據(jù)DATA屬性中指定的文件數(shù)據(jù)存放位置讀取出ANSI .SYS文件的數(shù)據(jù)
總結(jié)
以上是生活随笔為你收集整理的硬盘存储结构及分区简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当Android开发遇到魅族手机
- 下一篇: 展厅万能播控软件,中控视频播放器!展馆专