硬碟定址概說
傳統上一般說來定址的方法有古老的C/H/S (cylinder/head/sector)的方法,也就是說硬碟上的pin 腳位,我們傳進去這三個值,硬碟裡面的晶片會自動幫我們轉換到硬碟上一個區塊(block)上去作讀寫。這是最早的根據硬碟實體(硬碟片數量就是cylinder, 讀寫頭數目head)製作的定址方法,以前ATA只定義24bit (H(8b)S(6b)C(10b)), ATA-2定義28bit (H(4b)S(8b)C(16b)),由於一個硬體讀寫sector傳統上512B,所以ATA的硬碟最多只有8G,ATA-2的硬碟最多只有128G。這限制了硬碟的總大小與使用者對不同廠家硬碟的使用。不同廠家硬碟的C/H/S不同,那就要寫不同的程式控制。所以後來提出LBA (Logical Block Addressing)方法,就是不管了,只要給我一個數目,內部轉換是硬碟廠家自己的事,在ATA-6的規格裡面可以定址到48bit, 就是248
Byte。基本上後來的硬碟都能用LBA了。不同廠家的geometry是不一樣的,也就是同樣是80G的硬碟,但可以由不同的CHS總數來達成,這讓要找到真正的LBA定址困擾,所以CHS與LBA有公式做轉換,而且跟當初定義硬碟的geometry head跟sector有關:
LBA = (c * GH + h) * GS + (s - 1)
例如geometry (255,63,xxx) 的(32, 33, 0)的LBA值,就是(0 * 255 + 32) * 63 + (33 - 1) = 2048,通常這就是linux fdisk所切的第一partition位置。
新的usb drive, SSD等已經沒有CHS了,甚至連sector都有定義4k的讀寫。geometry是由OS 跟driver去跟硬碟詢問得到的,最早在DOS由int 13去問硬碟,所以當用virtual machine時,geometry是由virtual machine回報給OS的。由於現在都用LBA,現在已經沒有真正physical 上的geometry意義,像fdisk還可以自己高興隨便定義 (所以在用fdisk等工具時如果無聊自己去定義geometry,不同的話,根據公式轉出的CHS值也會不同,就是要轉換正確LBA,然後bootloader, OS driver大家都同意就好)。總之現在只是邏輯上計算的值,而唯一可能看到的地方是MBR裡面partition的定義,那個也基本無意義了,我猜所有的bootloader應該都是用LBA去跟硬碟要boot sector,除了DOS會來看,所以只對要裝DOS的硬碟有意義。