分區(qū)體系有DOS、Apple辙喂、BSD等,Windows分區(qū)使用的是DOS分區(qū)體系鸠珠,用的是MBR分區(qū)表巍耗,一般我們的硬盤用的都是這種方式。MBR分區(qū)表下渐排,LBA(Logical Block Address炬太,邏輯塊地址)地址最大為32位,按每扇區(qū)512Byte計(jì)算最大能描述2TB的空間大小驯耻,若硬盤容量超過2TB左右便無法全部描述亲族。除此之外,還有一種分區(qū)表叫作GPT(GUID Partition Table可缚,全局唯一標(biāo)識(shí)符分區(qū)表)霎迫,這種分區(qū)表用的尋址方式是64位,不受前者的限制帘靡。不過知给,以目前的情況,2TB硬盤雖然并不少見描姚,但是通常我們也不用到涩赢,何況現(xiàn)今固態(tài)硬盤(SSD)已成為主流,所以Win操作系統(tǒng)中MBR分區(qū)表仍然是大部分人的選擇轩勘,而Linux下用的則是GPT分區(qū)表筒扒。下面我們來談一下MBR分區(qū)表的結(jié)構(gòu),關(guān)于GPT分區(qū)表以后再談绊寻。
? ? 首先看硬盤花墩。我們都知道,硬盤上存在著所謂的柱面(Cylinder)榛斯、磁頭(Head)和扇區(qū)(Sector)观游,也就是所謂的CHS,通過CHS地址驮俗,我們可以定位到硬盤的唯一一個(gè)扇區(qū)懂缕。此外,還有種地址叫做LBA王凑,也就是硬盤邏輯地址搪柑,物理硬盤上每磁道一般有63個(gè)扇區(qū)聋丝,每扇區(qū)從1開始編號(hào),而邏輯地址下工碾,扇區(qū)從0編號(hào)弱睦,直到最大扇區(qū)號(hào),最大扇區(qū)號(hào)為硬盤扇區(qū)總數(shù)減1渊额。所以說况木,U盤等移動(dòng)存儲(chǔ)設(shè)備也是有“扇區(qū)”的,這里的扇區(qū)對(duì)應(yīng)的是U盤芯片里的數(shù)據(jù)塊(Block)旬迹。另外火惊,對(duì)物理硬盤,柱面和磁道差不多是一樣的概念奔垦,它們也就是一個(gè)個(gè)的同心圓屹耐,但從微觀角度看扇區(qū)是矩形而非扇形。硬盤下每扇區(qū)一般是512字節(jié)椿猎,這是一種約定俗成的標(biāo)準(zhǔn)(最新的SSD可能會(huì)有1024字節(jié))惶岭,磁頭是最少的,一般有幾個(gè)到十幾個(gè)不等犯眠,不過按灶,如果你用Diskgen軟件查看硬盤會(huì)發(fā)現(xiàn),可能會(huì)顯示255個(gè)磁頭阔逼,硬盤每盤片上一般有兩個(gè)磁頭兆衅,硬盤一般只有幾張盤片地沮,怎么可能有255個(gè)磁頭呢嗜浮?甚至連U盤也顯示255個(gè)磁頭,這是怎么回事呢摩疑?其實(shí)這里的磁頭是指邏輯磁頭數(shù)危融,而非硬盤物理磁頭數(shù),Windows操作系統(tǒng)會(huì)把硬盤分為每扇區(qū)字節(jié)數(shù)(512)雷袋,每磁道扇區(qū)數(shù)(63)吉殃,每柱面磁道數(shù)(255),以及柱面數(shù)(上萬個(gè))楷怒,這里少個(gè)磁頭數(shù)蛋勺,因?yàn)橐陨线@些都操作系統(tǒng)定義的邏輯數(shù)據(jù),而非硬盤真實(shí)的結(jié)構(gòu)鸠删,前面說了抱完,對(duì)物理硬盤而言柱面和磁道是等價(jià)的東西,而Diskgen顯示的磁頭數(shù)應(yīng)該是磁道數(shù)(估計(jì)連diskgen自己也不清楚刃泡,按照Windows的DISK_GEOMETRY結(jié)構(gòu)定義巧娱,成員TracksPerCylinder的意思確實(shí)是“每柱面磁道數(shù)”碉怔,看來Windows把柱面和磁道分開定義了。但請(qǐng)注意禁添,實(shí)際硬盤上撮胧,柱面就是磁道,磁道就是柱面老翘,兩者沒有區(qū)別)芹啥,如果用Everest軟件查看會(huì)發(fā)現(xiàn),硬盤的磁頭數(shù)僅為十幾個(gè)铺峭,而柱面數(shù)仍然為幾萬個(gè)叁征。
? ? 下面看分區(qū)表。用WinHex打開物理硬盤逛薇,第0號(hào)扇區(qū)就是MBR(Master Boot Recorder捺疼,主引導(dǎo)記錄),前446字節(jié)為引導(dǎo)代碼永罚,第447字節(jié)也就是偏移0x1BE處開始就是主分區(qū)表啤呼,大小為64個(gè)字節(jié),最后兩字節(jié)是55AA標(biāo)志呢袱。分區(qū)表中共有4個(gè)分區(qū)表項(xiàng)官扣,每個(gè)項(xiàng)大小為16字節(jié),第1個(gè)字節(jié)為可引導(dǎo)標(biāo)志羞福,0表示不可引導(dǎo)惕蹄,0x80表示可引導(dǎo),之后3個(gè)字節(jié)是分區(qū)起始CHS地址治专,然后是分區(qū)標(biāo)志卖陵,占1字節(jié),例如0x0F或0x05代表擴(kuò)展分區(qū)张峰,0x17代表隱藏NTFS分區(qū)泪蔫,然后是分區(qū)結(jié)束CHS地址,也是3字節(jié)喘批,最后兩個(gè)是分區(qū)起始LBA和分區(qū)大小扇區(qū)數(shù)撩荣,各占4字節(jié)。這里的4個(gè)分區(qū)都叫做主分區(qū)饶深,如果是擴(kuò)展分區(qū)也可以叫主擴(kuò)展分區(qū)餐曹。主分區(qū)表中最多可建4個(gè)主分區(qū),但擴(kuò)展分區(qū)只能建1個(gè)敌厘。主分區(qū)一般描述C盤台猴,而主擴(kuò)展分區(qū)同樣描述了另一個(gè)空間,可以把這個(gè)空間當(dāng)作一個(gè)新的磁盤,在這個(gè)空間上可以建立若干邏輯分區(qū)(D卿吐、E旁舰、F)。主擴(kuò)展分區(qū)的起始處一個(gè)扇區(qū)為引導(dǎo)記錄(可以稱作EBR嗡官,擴(kuò)展引導(dǎo)記錄)箭窜,同樣的位置0x1BE處又描述了一張分區(qū)表,可稱之為擴(kuò)展分區(qū)表衍腥,這個(gè)表只能表示兩個(gè)分區(qū)表項(xiàng)磺樱,第1個(gè)表項(xiàng)為文件系統(tǒng)分區(qū)(一般為第二個(gè)邏輯盤),屬于二級(jí)文件系統(tǒng)分區(qū)婆咸,第2個(gè)表項(xiàng)為二級(jí)擴(kuò)展分區(qū)竹捉,然后二級(jí)擴(kuò)展分區(qū)的EBR中又能表示兩個(gè)分區(qū),第1個(gè)分區(qū)為三級(jí)文件系統(tǒng)分區(qū)尚骄,第2個(gè)分區(qū)為三級(jí)擴(kuò)展分區(qū)块差,所有擴(kuò)展分區(qū)的結(jié)束部分一般會(huì)到頭,也就是會(huì)占滿硬盤倔丈,否則會(huì)多出空閑空間憨闰。照這個(gè)方式類推,最終遍歷完所有分區(qū)的結(jié)構(gòu)需五。分區(qū)一般為主分區(qū)和邏輯分區(qū)鹉动,擴(kuò)展分區(qū)并不能算真正意義的分區(qū),而是屬于硬盤分區(qū)后的剩余空間宏邮,所以通常我們說到分區(qū)泽示,一般不包括擴(kuò)展分區(qū)。每個(gè)分區(qū)(不包括擴(kuò)展分區(qū))的開始一個(gè)扇區(qū)為DBR(DOS Boot Recorder蜜氨,DOS引導(dǎo)記錄)械筛,里面記錄著分區(qū)的信息,比如分區(qū)大小總扇區(qū)數(shù)记劝、每扇區(qū)字節(jié)數(shù)变姨、每簇扇區(qū)數(shù)族扰、保留扇區(qū)數(shù)厌丑、根目錄簇等文件系統(tǒng)信息。
? ? 知道了以上這些要素渔呵,我們可以動(dòng)手寫一個(gè)自己的分區(qū)工具了怒竿。下面的這個(gè)分區(qū)程序只是個(gè)測(cè)試,功能比較簡單扩氢,大概的功能有快速分區(qū)并格式化耕驰、調(diào)整分區(qū)信息、刪除分區(qū)录豺、隱藏分區(qū)朦肘、設(shè)置活動(dòng)分區(qū)饭弓、重建MBR等。由于代碼太長媒抠,所以只例舉了部分最核心的代碼弟断。