1. 程式人生 > >磁碟定址(CHS定址方式、LBA定址方式)

磁碟定址(CHS定址方式、LBA定址方式)

目前市場上的硬碟價格越來越低,相比以前同樣價格買的硬碟容量越來越大。但是更換硬碟時,也要注意你的PC主機板是否支援目前的大容量硬碟。計算機的發展一直受著硬碟容量限制或BIOS(軟體系統,主機板是其硬體載體)訪問容量限制的制約。

要明白這個原因我們需要對IDE介面硬碟的工作方式做一個介紹,即使到現在我們今天的IDE硬碟驅動依舊使用早先的DOS-BIOS(磁碟作業系統-基本輸入/輸出系統)的分層結構上。它的基本工作模式就是:程式呼叫->DOS功能呼叫->檔案管理裝置->INT 13中斷管理(讀/寫)->BIOS磁碟服務->IDE(ATA)介面->磁碟控制器。也就是說我們如果需要對硬碟進行操作必須通過以上的一系列步驟才能完成,
那麼我們以下一起來看看這一系列步驟的作用。

檔案管理裝置

其負責檔案及其在磁碟上儲存位置之間的對映關係,不過需要通過磁碟讀寫中斷INT13執行讀寫命令來儲存、調入檔案。當新檔案被儲存時,檔案管理器決定它在當前目錄裡的儲存位置,在檔案分配表中為這個新檔案新增檔案目錄項,並把檔案寫入磁碟。當讀檔案時,檔案管理器在FAT中找到檔案在磁碟上的位置,接著就調入檔案。

IDE(ATA) 介面

在介紹IDE(ATA)介面前,簡單說說硬碟的結構:硬碟分為一定數量的柱面(以硬碟中心為圓心的同心圓磁跡),每個柱面都需要磁頭來讀寫資料。另外,硬碟上的資料都是以每扇區512位元組的格式儲存的,所有的資料傳輸都是以扇區(柱面被等分的園弧磁跡)為單位的。IDE(ATA)介面是暫存器驅動式的並口匯流排。要傳輸資料,BIOS首先往IDE(ATA)裡特定的暫存器寫入資料的開始地址和資料傳輸的長度,再把有關的讀/寫命令往特定的暫存器裡傳送從而開始資料傳輸。

現在的硬碟一般都支援邏輯塊定址(LBA)和柱面磁頭扇區定址(CHS),我們以CHS定址方式來舉例:資料傳輸的開始地址是寫到4個8位暫存器裡的,分別是:
  柱面低位暫存器
  柱面高位暫存器
  扇區暫存器
  裝置/磁頭暫存器
柱面地址是16位[柱面低位暫存器(8位),柱面高位暫存器(8位)],扇區地址是8位(注意:扇區暫存器裡第一個扇區是1扇區,而不是0扇區),而磁頭地址是4位(沒有完全佔用8位)。
因此,硬碟柱面的最大數是65,536(2的16次方),磁頭的最大數是16(2的4次方),扇區的最大數是255(2的8次方-1,注意剛剛我們提到的扇區暫存器問題)。

所以,能定址的最大扇區數是267,386,880 (65,536x16x255)。一扇區又是512位元組,也就是說如果以CHS定址方式,IDE硬碟的最大容量為136.9GB。LBA定址方式,上述的總共28位可用的暫存器空間(16+8+4)被看作一個完整的LBA地址,因為包括位0(CHS裡扇區不能從0開始計算),其能定址的扇區數是268,435,456 (65,536x16x256),這時IDE硬碟的最大容量為137.4GB。

INT 13管理


INT 13管理其實也是按照暫存器的模式來設計的,它的高層即檔案管理器層釋出資料讀寫命令和有關的引數給CPU,然後觸發INT 13中斷的進行,啟用BIOS的磁碟服務來執行資料傳輸。資料的開始地址被寫到3個8位暫存器裡,分別是:
  柱面低位暫存器
  柱面高位/扇區暫存器
  磁頭暫存器
柱面地址是10位(柱面低位暫存器佔用8位、柱面高位暫存器佔用2位),扇區地址為6位(8位-已經被計算過的高位暫存器的2位)。磁頭暫存器為8位。
因此如果這樣的話:柱面的最大數是1024(2的10次方) ,磁頭的最大數是256(2的8次方),扇區的最大數是63(2的6次方-1)。所以,通過INT 13管理能定址的扇區數是16,515,072 (1,024x256x63)。一扇區是512位元組,也就是說如果以CHS定址方式,IDE硬碟的最大容量為8.456GB。LBA定址方式能定址的扇區數是16,777,216(1024x256x64),這時IDE硬碟的最大容量為8.601GB。

看到這裡,我們應該感到硬碟容量限制的成因有了一些“眉目”了吧,那麼我們具體來到底是什麼讓硬碟出現了所謂的限制:

528MB硬碟容量限制

由於早先的硬碟容量比較小,因此設計的BIOS的時候當把地址從Int 13的地址暫存器轉換為IDE(ATA)的地址暫存器時,僅僅把INT 13管理中10位的柱面地址用來對應IDE(ATA)介面中的16位柱面暫存器,而把沒有用到的6位(高位暫存器)地址都設定為0。並且也僅把6位的扇區地址來對應IDE(ATA)介面的8位扇區暫存器,其中沒有用到的2位設定為0。並且INT 13管理的磁頭暫存器4位(又去掉了4位)來對應IDE(ATA)。因此,此時的磁碟柱面最大數為1024(2的10次方),磁頭的最大數是16(2的4次方),扇區的最大數是63(2的6次方-1)。因此能定址的扇區數就成了1,032,192 (1,024x16x63)。一個扇區的容量是512位元組,也就是說如果以CHS定址方式,IDE硬碟的最大容量為528.4MB。因此528MB的硬碟容量限制就出現了。

2.1GB硬碟容量限制

這裡分為兩個部分,一部分是由磁碟服務的限制造成的,另外一個是由於磁碟格式造成的,通常我們把前者稱為2.1GB的硬體容量限制,後一種稱為2.1GB的軟體容量限制。

硬體容量硬體:為了528MB容量限制的問題,人們提出一些不同的辦法,其中一個辦法就是INT 13服務的磁頭暫存器沒有用到的4位中的2位(確切的說是高2位)保留給柱面數的第11、12位使用。這樣,最大的磁頭數就是64(2的6次方)。但是,當時的作業系統不使用這種轉換方法,其認為磁頭暫存器的所有位數只可能記錄磁頭數。比如,為了正確地轉換柱面數為2,048、磁頭數為64的硬碟,就需要作業系統把柱面數除以4(512個邏輯柱面數),磁頭數乘以4(256個邏輯磁頭數)。不過由於BIOS中並沒有開放所有的磁頭數暫存器,當然無法記錄這樣的磁頭數。因此遇到這種執行機制的BIOS,在系統自檢的時候就會造成系統當機。

軟體容量限制:當時DOS分割槽的限制是由檔案分配表(FAT)決定的。FAT處理儲存空間是以簇為單位的,它處理一簇的最大長度是32,768位元組,最多能處理65,536個簇,如果將兩個數字相乘,就會得到DOS的最大分割槽界限值是2,147,483,648位元組或2,048MB (2,147,483,648 / 1,0242)。因此超過這個容量的硬碟,如果使用FAT格式,就最大隻能識別2.048GB的硬碟容量。

3.2GB的容量限制

一些版本的BIOS不能識別超過6322柱面的硬碟,不過這種BIOS比較少見,由於柱面有限制,其最高支援扇區數為6,372,576 (6,322x16x63),如果乘以512扇區容量的話,其最高支援容量為6,372,576x512=3,262,758,912/1024=3.18GB。

4.2GB的容量限制

當時一些作業系統使用8位暫存器來儲存磁頭數,這樣當BIOS報告硬碟的磁頭數等於256(最高容量)時,只有磁頭數的最先一位(即0)被系統儲存,從而導致硬碟配置錯誤。一旦硬碟的磁頭數是16,柱面數大於8,192(2的13次方,由於後三位暫存器已經被磁頭暫存器借用,其實這裡牽涉到一個突破528MB容量限制的轉換做法的問題,由於這一段比較複雜,在這裡就不詳細介紹了,我們只要明白有這個限制就夠了),系統就無法正常識別了,因此其最大的容量就被限制在了4.2GB=8,192x16x63x512/1024。

8.4GB硬碟容量限制

我們已經知道INT 13服務的定址方式最高可以支援8.4GB以下的容量(柱面數、磁頭數、扇區數的最大值分別是16,383、16和63,而三者相乘就是8.456GB)。因此,這個容量限制出現是遲早的問題了。所以,這個限制是我們目前最常遇到的容量限制。

33.8GB的容量限制

在CHS定址中,由於IDE(ATA)介面的限制,柱面數最高支援65,535(2的16次方-1),所以,當遇到柱面數大於65,535的時候,系統就無法識別這種硬碟了,不過LBA由於獨特的定址模式就不存在這個問題,這個容量限制具體為:65,535x16x63x512/1024=33.8GB。

137GB硬碟容量限制

目前的磁碟工作方式就註定IDE硬碟存在這個問題,前面介紹IDE(ATA)介面的時候,這個問題就已經出現了。為了解決INT 138.4G限制,一些廠商定義了新的擴充套件INT 13服務擴充套件標準。新的INT 13服務擴充套件標準不使用作業系統的暫存器傳遞硬碟的定址引數,它使用儲存在作業系統記憶體裡的地址包。地址包裡儲存的是64位LBA地址,如果硬碟支援LBA定址,就把低28位直接傳遞給ATA介面,如果不支援,作業系統就先把LBA地址轉換為CHS地址,再傳遞給ATA介面。通過這種方式,能實現在ATA匯流排基礎上CHS定址最大容量是136.9 GB,而LBA定址最大容量是137.4GB。

因為137GB容量限制正是我們剛剛面臨的問題,因此變得十分有名,我也是因為遇到了這個問題才學習了下硬碟容量限制這些知識。目前已經使用了新的方法解決了此問題,因此,我們的電腦上已經用上了500GB、1TB的硬碟了。但是,我們目前使用的電腦依然存在這種容量限制:

2.1TB系統訪問容量限制

目前的主流電腦大多無法執行2.1TB以上容量的硬碟。也就是說採用普通32位Windows7、Windows Vista等系統的電腦目前最大也只能識別到2.1TB的硬碟。那麼到底是什麼原因造成了這一問題呢?答案就是傳統的LBA(Ligical Block Address,邏輯塊定址)定址方式以及現有系統的限制。

硬碟容量限制,最著名的當數137GB硬碟容量限制。當時不少人認為100GB的硬碟已經足夠了,所以工程師們便推出了28bit LBA定址模式,137GB由此而來。為了消除28bit LBA定址模式的限制、解除137GB容量的限制,Technical Committee T13組織對ATA/ATAPI-6標準進行了一些修改,通過48bit LBA來支援更多的扇區。後來由Compaq(康柏)、Microsoft(微軟)、Maxtor(邁拓)聯合推出的Big Drives規範就是以T13組織提出的48bit方案為基礎,這種規範的中心思想就是增加CHS(C:柱面,H:磁頭,S:扇區)的位數,而柱面暫存器不變,這樣就將原來LBA定址中可用的暫存器空間從28bit提高到了48bit,可以定址的扇區數就為281,474,976,710,655,這樣可支援的硬碟容量就達到了281,474,976,710,655×512=144,115,188,075,855,872位元組,大致相當於144PB(相當於144000GB)的容量,即使從現在的眼光來看,如此大容量的硬碟也足夠我們用上很久了。(當然,可能以後還會遇到144PB容量限制。)

既然48bit LBA支援144PB容量的硬碟,那現在的系統怎麼識別不到2.1TB以上的硬碟呢?要真正實現144PB,除了硬體儲存系統及其介面晶片方面的改造外,還需要作業系統的支援。目前只有專業領域才支援64bit運算,而主流作業系統仍停留在32bit的編碼模式,所以對硬碟的定址自然最大也只有 32位。現有32位系統的硬碟容量限制大小可以根據 32bit LBA來計算,最後得出結論是最大隻能支援2.1 TB的硬碟容量。這有點類似於當年“528MB、2.1GB”時所遇到的問題,因此,要讓硬碟突破2.1TB的限制,使用者必須先將系統升級到64位作業系統。目前的Windows7或者Windows Vista的64位系統和修改版的Linux系統都可以支援48bit這種長位元組定址模式。

* GPT分割槽表

除了徹底解放48bit LBA定址模式以外,我們還要考慮到另外一個關鍵因素,即分割槽表。目前的硬碟都採用MBR分割槽方式,而這種方式也是限制硬碟容量的關鍵因素。MBR位於硬碟的第一個扇區,它所記錄的便是硬碟的分割槽資訊。如果使用Fdisk、Partition Magic或者直接在Windows安裝過程中對硬碟進行分割槽,分割槽的資訊都將被寫入硬碟的MBR中,硬碟就根據MBR的內容來確定自己的邏輯分割槽情況。

MBR最多可支援四個主分割槽或三個主分割槽、一個擴充套件分割槽的組合。這一方案採用4個位元組來儲存分割槽的總扇區數,最大能表示4,294,967,296 (2的32次方)個扇區,按每扇區512位元組計算,分割槽最大容量不能超過2.1TB(2,199,023,255,552)。而當磁碟容量超過2.1TB以後,分割槽的起始位置也就無法表示了,當然也就無法進行分割槽。在硬碟還未進入TB時代時,這種分割槽方式沒有什麼問題,但是當硬碟容量達到2TB同時還有向上的趨勢時,MBR分割槽方案顯然就無法滿足需要了。(編注:談到MBR所支援的最大分割槽,也許有不少朋友說我目前的電腦分割槽就有七八個,這是咋回事?這裡是說MBR 只支援4個主分割槽表項。要獲得更多分割槽,則需要次級結構――擴充套件分割槽。擴充套件分割槽可以再次讓一個磁碟被分成一個或多個邏輯磁碟,打個比喻:MBR 就像是一本書的結構,目錄、頁碼,而擴充套件分割槽則為這本書劃分出了具體章節,這就是 MBR 分割槽方法。)

要解決MBR所存在的容量限制,還需要使用GUID(Globally Unique Identifier,全域性唯一標誌符)分割槽模式,即採用GPT(GUID 分割槽表)。與MBR最大4個主分割槽表項的限制相比,GPT對分割槽數量沒有限制(目前Windows系統最大僅支援128個GPT分割槽),每個分割槽都擁有唯一的ID標誌碼,可管理的儲存資源範圍遠遠超過MBR。而在分割槽容量方面,因為它使用64位的整數表示扇區號,所以理論上允許使用者使用最高18EB容量(1EB=100萬TB)進行分割槽,這絕對是一個高得令人匪夷所思的數字。GPT的分割槽資訊是在分割槽中,而不像MBR一樣在主引導扇區,為保護GPT不受MBR類磁碟管理軟體的危害,GPT在主引導扇區建立了一個保護分割槽(Protective MBR)的MBR分割槽表,這種分割槽的型別標誌為0xEE,這個保護分割槽的大小在Windows下為128MB,Mac OS X下為200MB,在Windows磁碟管理器里名為GPT保護分割槽,可讓MBR類磁碟管理軟體把GPT看成一個未知格式的分割槽,而不是錯誤地當成一個未分割槽的磁碟。

既然GPT分割槽方案具有如此多的優點,在分割槽時是不是可以全部採用這種方案呢?答案是否定的。並不是所有的Windows系統都支援這種分割槽方案,至少Windows XP/2000/NT/98這些系統就無法支援GPT分割槽方案,所以在希捷的宣告中,也說明了遇到3TB的硬碟,Windows XP最多隻能認出990MB的容量。

* UEFI/EFI助硬碟容量騰飛

不過光是系統支援GPT還不行,那樣使用者只能在GPT分割槽上儲存資料而不能在分割槽上啟動電腦。如果要電腦支援GPT磁碟啟動,還需要配合UEFI/EFI此類新一代BIOS。正如我們之前所言,由於目前主流的主機板都採用BIOS系統,也就是說只支援MBR的分割槽方式,那麼即使我們擁有了64位的作業系統,擁有了GPT磁碟,也無法享受到2.1TB以上的大容量硬碟。要想使用2.1TB硬碟,我們還必須要保證自己的主機板採用的是EFI/UEFI,而非傳統的BIOS,這樣才能支援GPT磁碟啟動電腦。

Intel在制定EFI方案時就將GPT列為其中的一部分內容,後來的UEFI也延續了這一點。由於現有的BIOS不可能將MBR分割槽方式立刻進化為GPT分割槽方式,所以要讓主機板識別到2.1TB以上容量的硬碟,那麼只能使用UEFI/EFI。因此,如果使用者的主機板支援UEFI/EFI,那麼可以從GPT分割槽直接啟動Windows Vista/7系統,作業系統載入程式和啟動分割槽均駐留在GPT磁碟上。與基於x86的計算機上的系統卷相同,EFI/UEFI系統分割槽包含作業系統載入程式、驅動程式和啟動Windows Vista/7需要的其他檔案。在僅包含一個GPT磁碟的計算機上,UEFI/EFI系統分割槽是磁碟上的第一個分割槽。如果使用者的電腦沒有EFI/UEFI支援,GPT實際上並不能被真正的支援,僅僅能作為MBR/GPT混合磁碟來啟動。也就是說,原本GPT的標準中,存在一個保護性質的MBR(Protective MBR),在不支援EFI/UEFI的晶片組主機板下,BIOS會繼續使用該MBR來引導。

可以說,目前使用者要突破硬碟所面臨的2.1TB容量限制,首先要升級作業系統,其次還要有一定的硬體支援。目前的硬碟、BIOS和作業系統製造商均將2.1TB的最大容量視為製造標準,主流配置的主機板基本不會配備UEFI系統,儘管微星等少數主機板製造商在一些主機板中裝載了UEFI系統,但它仍未成為真正的標準配置,個人電腦裡也許只有蘋果在使用 EFI/UEFI,因此大家要真正使用單個容量超過2.1TB的硬碟,還需要UEFI普及開來才行,這想必還需要一段時間。但我們相信,隨著未來硬體規格的升級,容量在2.1TB以上的超級硬碟的巨大優越性(特別是速度)仍然會很快讓不少玩家毫不猶豫地投懷送抱……

Seleced from/Refered to:
硬碟容量限制問題的形成以及解決方案
http://tech.sina.com.cn/roll/2007-07-19/1127365280.shtml
硬碟大容量限制解讀
http://www.xcar.com.cn/bbs/viewthread.php?tid=14364805
硬碟137GB容量限制的原因
http://blog.sina.com.cn/s/blog_4b96ca09010007w7.html
衝破137GB容量限制:大容量硬碟使用全攻略
http://www.zhaoniupai.com/blog/archives/633.html