硬盤中的數據組織方式

深入瞭解硬盤的內部結構:

1 http://www.sansky.net/article/2007-05-31-disk-structure.html

 2 http://ncwcl.blog.51cto.com/36545/200395

 

硬盤存儲結構

人們採用與軟盤類似的結構生產硬盤. 也就是硬盤盤片的每一條磁道都具有相同的扇區數. 由此人們定義硬盤參數爲(CHS)參數,即磁頭數(Heads),柱面數(Cylinders),扇區數(Sectors),以及相應的尋址方式。

其中:

磁頭數表示硬盤總共有幾個磁頭,也就是有幾面盤片,最大爲255 (用8個二進制位存儲);

柱面數表示硬盤每一面盤片上有幾條磁道, 最大爲1023(用10個二進制位存儲);

扇區數(Sectors) 表示每一條磁道上有幾個扇區, 最大爲63 (用6個二進制位存儲);

每個扇區一般是 512個字節, 理論上講這不是必須的, 但好象沒有取別的值的;

所以磁盤最大容量爲:255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes )

或硬盤廠商常用的單位:255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )

在 CHS 尋址方式中, 磁頭, 柱面, 扇區的取值範圍分別爲 0 到 Heads – 1,0 到 Cylinders - 1,1 到 Sectors (注意是從 1 開始)

硬盤的容量=柱面數(CYLINDER)*磁頭數(HEAD)*扇區數(SECTOR)*512B.這下你也可以計算硬盤的一些參數了.


什麼是簇?

         文件系統是操作系統與驅動器之間的接口,當操作系統請求從硬盤裏讀取一個文件時,會請求相應的文件系統(FAT 16/32/NTFS)打開文件。扇區是磁盤最小的物理存儲單元,但由於操作系統無法對數目衆多的扇區進行尋址,所以操作系統就將相鄰的扇區組合在一起,形成一個簇,然後再對簇進行管理。每個簇可以包括2、4、8、16、32或64個扇區。顯然,簇是操作系統所使用的邏輯概念,而非磁盤的物理特性。

         爲了更好地管理磁盤空間和更高效地從硬盤讀取數據,操作系統規定一個簇中只能放置一個文件的內容,因此文件所佔用的空間,只能是簇的整數倍;而如果文件實際大小小於一簇,它也要佔一簇的空間。所以,一般情況下文件所佔空間要略大於文件的實際大小,只有在少數情況下,即文件的實際大小恰好是簇的整數倍時,文件的實際大小纔會與所佔空間完全一致。 
  “簇”是DOS進行分配的最小單位。當創建一個很小的文件時,如是一個字節,則它在磁盤上並不是只佔一個字節的空間,而是佔有整個一簇。DOS視不同的存儲介質(如軟盤,硬盤),不同容量的硬盤,簇的大小也不一樣。簇的大小可在稱爲磁盤參數塊(BPB)中獲取。簇的概念僅適用於數據區。
本點:(1)“簇”是DOS進行分配的最小單位。
   (2)不同的存儲介質,不同容量的硬盤,不同的DOS版本,簇的大小也不一樣。
   (3)簇的概念僅適用於數據區。

 

 

 

磁盤分區簡介

一個完整硬盤的數據應該包括五部分:MBR,DB*,**T,DIR區和DATA區。其中只有主引導扇區是唯一的,其它的隨你的分區數的增加而增加。

要點:(1)整個硬盤可分爲MBR,DBR,FAT,BD和數據區。
   (2)MBR,DBR,FAT,和BD位於磁盤外道。

  • 主引導扇區

      主引導扇區位於整個硬盤的0磁道0柱面1扇區,包括硬盤主引導記錄MBR(Main Boot Record)和分區表DPT(Disk Partition Table)。其中主引導記錄的作用就是檢查分區表是否正確以及確定哪個分區爲引導分區,並在程序結束時把該分區的啓動程序(也就是操作系統引導扇區)調入內存加以執行。至於分區表,很多人都知道,以80H或00H爲開始標誌,以55AAH爲結束標誌,共64字節,位於本扇區的最末端。值得一提的是,MBR是由分區程序(例如DOS 的Fdisk.exe)產生的,不同的操作系統可能這個扇區是不盡相同。如果你有這個意向也可以自己去編寫一個,只要它能完成前述的任務即可,這也是爲什麼能實現多系統啓動的原因(說句題外話:正因爲這個主引導記錄容易編寫,所以纔出現了很多的引導區病毒)。
    要點:(1)MBR位於硬盤第一個物理扇區柱面0,磁頭0,扇區1處。不屬於DOS扇區,
       (2)主引導記錄分爲硬盤的主引導程序和硬盤分區表。
  • 操作系統引導扇區

      OBR(OS Boot Record)即操作系統引導扇區,通常位於硬盤的0磁道1柱面1扇區(這是對於DOS來說的,對於那些以多重引導方式啓動的系統則位於相應的主分區/擴展分區的第一個扇區),是操作系統可直接訪問的第一個扇區,它也包括一個引導程序和一個被稱爲BPB(BIOS參數塊)的本分區參數記錄表。其實每個邏輯分區都有一個OBR,其參數視分區的大小、操作系統的類別而有所不同。引導程序的主要任務是判斷本分區根目錄前兩個文件是否爲操作系統的引導文件(例如MSDOS或者起源於MSDOS的Win9x/Me的IO.SYS和MSDOS.SYS)。如是,就把第一個文件讀入內存,並把控制權交予該文件。BPB參數塊記錄着本分區的起始扇區、結束扇區、文件存儲格式、硬盤介質描述符、根目錄大小、FAT個數、分配單元(Allocation Unit,以前也稱之爲簇)的大小等重要參數。它包含邏輯格式化時使用的參數,可供DOS計算磁盤上的文件分配表,目錄區和數據區的起始地址,OBR由高級格式化程序產生(例如DOS 的Format.com)。
  • BPB格式
    序號 偏移地址 意義
    1 03H-0AH OEM號
    2 0BH-0CH 每扇區字節數
    3 0DH 每簇扇區數
    4 0EH-0FH 保留扇區數
    5 10H FAT備份數
    6 11H-12H 根目錄項數
    7 13H-14H 磁盤總扇區數
    8 15H 描述介質
    9 16H-17H 每FAT扇區數
    10 18H-19H 每磁道扇區數
    11 1AH-1BH 磁頭數
    12 1CH-1FH 特殊隱含扇區數
    13 20H-23H 總扇區數
    14 24H-25H 物理驅動器數
    15 26H 擴展引導簽證
    16 27H-2AH 卷系列號
    17 2BH-35H 卷標號
    18 36H-3DH 文件系統號
    DOS引導記錄公式:
    文件分配表≡保留扇區數
    根目錄≡保留扇區數+FAT的個數×每個FAT的扇區數
    數據區≡根目錄邏輯扇區號+(32×根目錄中目錄項數+(每扇區字節數-1))DIV每扇區字節數
    絕對扇區號≡邏輯扇區號+隱含扇區數
    扇區號≡(絕對扇區號MOD每磁道扇區數)+1
    磁頭號≡(絕對扇區號DIV每磁道扇區數)MOD磁頭數
    磁道號≡(絕對扇區號DIV每磁道扇區數)DIV磁頭數
    要點:(1)DBR(Dos的OBR)位於柱面0,磁頭1,扇區1,其邏輯扇區號爲0
       (2)DBR包含DOS引導程序和BPB。
       (3)BPB十分重要,由此可算出邏輯地址與物理地址。
  • 文件分配表

      FAT(File Allocation Table)即文件分配表,是DOS/Win9x系統的文件尋址系統,爲了數據安全起見,FAT一般做兩個,第二FAT爲第一FAT的備份, FAT區緊接在OB*之後,其大小由本分區的大小及文件分配單元的大小決定。關於**T的格式歷來有很多選擇,Microsoft 的DOS及Windows採用我們所熟悉的FAT12、FAT16和FAT32格式,但除此以外並非沒有其它格式的FAT,像Windows NT、OS/2、UNIX/Linux、Novell等都有自己的文件管理方式。文件分配表是反映硬盤上所有簇的使用情況,通過查文件分配表可以得知任一簇的使用情況。DOS在給一個文件分配空間時總先掃描FAT,找到第一個可用簇,將該空間分配給文件,並將該簇的簇號填到目錄的相應段內。即形成了“簇號鏈”。FAT就是記錄文件簇號的一張表。FAT的頭兩個域爲保留域,對FAT12來說是3個字節,FAT來說是4個字節。其中頭一個字節是用來描述介質的,其餘字節爲FFH 。介質格式與BPB相同。
    第一個字節的8位意義:
    7 6 5 4 3 2 1 0
    └─────-┘ │ │ │┌0非雙面
    置1 │ │ └┤
    │ │ └1雙面
    │ │┌0不是8扇區
    │ └┤
    │ └1是8扇區
    │┌0不是可換的
    └┤
    └1是可換的
    FAT結構含義
    FAT12 FAT16 意義
    000H 0000H 可用
    FF0H-FF6H FFF0H-FFF6H 保留
    FF7H FFF7H 壞
    FF8H-FFFH FFF8H-FFFFH 文件最後一個簇
    ×××H ××××H 文件下一個簇
    對於FAT16,簇號×2作偏移地址,從FAT中取出一字即爲FAT中的域。
    邏輯扇區號=數據區起始邏輯扇區號+(簇號-2)×每簇扇區數
    簇號=(邏輯扇區號-數據區起始邏輯扇區號)DIV每簇扇區數+2
    要點:(1)FAT反映硬盤上所有簇的使用情況,它記錄了文件在硬盤中具體位置(簇)。
       (2)文件第一個簇號(在目錄表中)和FAT的該文件的簇號串起來形成文件的“簇號鏈”,恢復被破壞的文件就是根
    據這條鏈。
       (3)由簇號可算邏輯扇區號,反之,由邏輯扇區號也可以算出簇號,公式如上。
       (4)FAT位於DBR之後,其DOS扇區號從1開始。
  • 目錄區

      DIR是Directory即根目錄區的簡寫,DI*緊接在第二**T表之後,只有FAT還不能定位文件在磁盤中的位置,FAT還必須和DIR配合才能準確定位文件的位置。DIR記錄着每個文件(目錄)的起始單元(這是最重要的)、文件的屬性等。定位文件位置時,操作系統根據DI*中的起始單元,結合**T表就可以知道文件在磁盤的具體位置及大小了。在DIR區之後,纔是真正意義上的數據存儲區,即DATA區。DOS爲目錄項分配32字節。目錄項分爲三類:文件,子目錄(其內容是許多目錄項),卷標(只能在根目錄,只有一個。目錄項中有文件(或子目錄,或卷標)的名字,擴展名,屬性,生成或最後修改日期,時間,開始簇號,及文件大小。
    目錄項的格式
    字節偏移 意義 佔字節數
    00H 文件名 8B
    08H 擴展名 3B
    0BH 文件屬性 1B
    0CH 保留 10B
    16H 時間 2B
    18H 日期 2B
    1AH 開始簇號 2B
    1CH 文件長度 4B
    目錄項文件名區域中第一個字節還有特殊的意義:00H代表未使用
    05H代表實際名爲E5H
    EBH代表此文件已被刪除
    目錄項屬性區域的這個字節各個位的意義如下: 7 6 5 4 3 2 1 0
                          未 修 修 子 卷 系 隱 只
                          用 改 改 目 標 統 藏 讀
                            標 標 錄   屬 屬 屬
                            志 志     性 性 性
    注意:WINDOWS的長文件名使用了上表中所說的“保留”這片區域。
    要點:(1)文件目錄是記錄所有文件,子目錄名,擴展名屬性,建立或刪除最後修改日期。文件開始簇號及文件長度的一張
          登記表.
       (2)DOS中DIR列出的內容訓是根據文件目錄表得到的。
       (3)文件起始簇號填在文件目錄中,其餘簇都填在FAT中上一簇的位置上。
  • 數據區

      DATA雖然佔據了硬盤的絕大部分空間,但沒有了前面的各部分,它對於我們來說,也只能是一些枯燥的二進制代碼,沒有任何意義。在這裏有一點要說明的是,我們通常所說的格式化程序(指高級格式化,例如DOS下的Format程序),並沒有把DATA區的數據清除,只是重寫了FAT表而已,至於分區硬盤,也只是修改了MBR和OBR,絕大部分的DATA區的數據並沒有被改變,這也是許多硬盤數據能夠得以修復的原因。但即便如此,如MBR/OB*/**T/DIR之一被破壞的話,也足夠咱們那些所謂的DIY老鳥們忙乎半天了……需要提醒大家的是,如果你經常整理磁盤,那麼你的數據區的數據可能是連續的,這樣即使MB*/**T/DIR全部壞了,我們也可以使用磁盤編輯軟件(比如DOS下的DiskEdit),只要找到一個文件的起始保存位置,那麼這個文件就有可能被恢復(當然了,這需要一個前提,那就是你沒有覆蓋這個文件……)。

硬盤分區方式
          我們平時說到的分區概念,不外乎三種:主分區、擴展分區和邏輯分區。

  主分區

主分區是一個比較單純的分區,通常位於硬盤的最前面一塊區域中,構成邏輯C磁盤。在主分區中,不允許再建立其它邏輯磁盤。

  擴展分區

擴展分區的概念則比較複雜,也是造成分區和邏輯磁盤混淆的主要原因。由於硬盤僅僅爲分區表保留了64個字節的存儲空間,而每個分區的參數佔據16個字節,故主引導扇區中總計可以存儲4個分區的數據。操作系統只允許存儲4個分區的數據,如果說邏輯磁盤就是分區,則系統最多隻允許4個邏輯磁盤。對於具體的應用,4個邏輯磁盤往往不能滿足實際需求。爲了建立更多的邏輯磁盤供操作系統使用,系統引入了擴展分區的概念。

      所謂擴展分區,嚴格地講它不是一個實際意義的分區,它僅僅是一個指向下一個分區的指針,這種指針結構將形成一個單向鏈表。這樣在主引導扇區中除了主分區外,僅需要存儲一個被稱爲擴展分區的分區數據,通過這個擴展分區的數據可以找到下一個分區(實際上也就是下一個邏輯磁盤)的起始位置,以此起始位置類推可以找到所有的分區。無論系統中建立多少個邏輯磁盤,在主引導扇區中通過一個擴展分區的參數就可以逐個找到每一個邏輯磁盤。

  需要特別注意的是,由於主分區之後的各個分區是通過一種單向鏈表的結構來實現鏈接的,因此,若單向鏈表發生問題,將導致邏輯磁盤的丟失。

  文件的讀取

       操作系統從目錄區中讀取文件信息(包括文件名、後綴名、文件大小、修改日期和文件在數據區保存的第一個簇的簇號),我們這裏假設第一個簇號是0023。

  操作系統從0023簇讀取相應的數據,然後再找到FAT的0023單元,如果內容是文件結束標誌(FF),則表示文件結束,否則內容保存數據的下一個簇的簇號,這樣重複下去直到遇到文件結束標誌。

     文件的寫入

  當我們要保存文件時,操作系統首先在DIR區中找到空區寫入文件名、大小和創建時間等相應信息,然後在Data區找到閒置空間將文件保存,並將Data區的第一個簇寫入DIR區,其餘的動作和上邊的讀取動作差不多。

     文件的刪除

  看了前面的文件的讀取和寫入,你可能沒有往下邊繼續看的信心了,不過放心,Win9x的文件刪除工作卻是很簡單的,簡單到只在目錄區做了一點小改動――將目錄區的文件的第一個字符改成了E5就表示將改文件刪除了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章