
在 LBA 之前,您只需擁有磁碟的實體映射,最初在舊的 IBM-PC 相容機器上使用 BIOS 進行磁碟存取將如下所示:
- 汽缸數:(10b)
- 0-1024(1024 = 2^10)
- 頭號: (8b)
- 0-256(256 = 2^8)
- 區號: (6b)
- 0 通常保留用於“開機磁區」(C-0,H-0,s-0)
- 1-64 (63 = 2^6 - 1) *0 保留
CHS 總地址:24b (10+8+6)
當天平均(檔案|區塊|磁區)大小為 512B。
範例來自維基百科:
512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit)
我感到困惑的是頭heads-per-cylinder
實際上,當在 LBA 公式中引用時,它的意思是 。這對我來說沒有意義,因為據我所知,頭是頭,除非它是可移動媒體拼盤有兩個(頂部、底部),每個表面各一個。
在我看來,由於將它們稱為heads-per-disk
或heads-per-surface
,因此會產生更多,因為圓柱體穿過整個磁碟(多個磁碟片)。
邏輯區塊尋址:
公式:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)
A
- 邏輯區塊位址Nheads
- 磁碟上的磁頭數量heads-per-disk
Nsectors
- 磁軌上的磁區數sectors-per-track
c,h,s
- 是柱面、磁頭、磁區號24-bits total (10+8+6)
看第一個例子這裡:
For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA 3150=(3× 16+2)× 63
幾何學:(這是由製造商定義的)
- 汽缸 - 1020
- 頭 - 16
- 部門 - 63
答案1
總的來說,您對術語的使用相當草率,因此這是進一步混亂的根源。
1024 位元可尋址數 (1024 = 2^10)
IBM PC/XT 使用 Western Digital WD1010 磁碟控制器(在硬體暫存器中)使用 10 位元柱面號。
第一個柱面的位址為 0,因此有 1024 個柱面位址。
」可尋址號碼」是無稽之談。
-1 表示「引導磁區」(c-0,h-0,s-0)
63 位元可尋址數 (63 = 2^6 - 1)
(每個磁軌的)第一個磁區是位址 1,因此 6 位元磁區號最多可以尋址每個磁軌上的 63 個磁區(磁區號 1 到 63)。
沒有扇區位址為零。它沒有被保留。它不存在。
減去該偏移量是算術必需的,並且與引導磁區沒有任何關係。使用磁碟機的第一個磁區(或任何磁區)進行開機(或任何功能)與減去起始偏移量無關。
所以我知道你可以得到以下理論上的最大地址:
512(位元組)× 63(磁區)× 256(磁頭)× 1024(柱面)= 8064 MiB
不,這是最大容量。
磁碟位址是針對磁區的,而不是針對位元組的。
我知道頭號是一個 246 位元可尋址的數字...
啊? 「可尋址號碼」?
驅動器參數之一是磁頭數量(在圓柱體中)。
CHS 地址中的數字之一是頭號。
246位?
我感到困惑的是,當它被稱為 時,頭實際上是什麼
heads-per-track
。
Heads-per-track
是你編造的,因為 PC 中使用的典型 HDD 沒有這樣的參數(即該數字始終是統一的)。
特定磁軌只能由一個特定的 R/W 磁頭讀取和寫入。
每個表面都有一個讀/寫頭。 (您不太可能使用雙埠驅動器。)
讀取/寫入頭安裝在臂的末端。
所有讀/寫頭和臂都包含一個由執行器移動/旋轉的組件。
(但也曾有過固定的-磁頭磁碟機,例如每磁軌一個磁頭,其尋道時間為零。
這些術語對我來說沒有任何意義,因為據我所知,磁頭是(執行讀取/寫入操作的實際手臂),除非它是可移動介質,否則每個盤都有兩個(頂部,底部),所以它真的會自從將它們稱為每盤磁頭或每磁碟磁頭......實際上它應該是每磁道扇區,對嗎?
那麼顯然你對什麼是頭感到困惑。
您還將“拼盤”與“表面”混淆了。
不要求必須使用盤片的兩面,因此每個表面都被視為一個單元,而不是盤片作為一個單元。
有一個驅動器參數稱為sectors per track
。
heads-per-track
現在,當您查看從 CHS 到 LBA 的轉換時,就會出現該術語。
又是你編出來的東西。每軌磁頭是統一的。
但是幾何圖形 1020,16,63 如何轉換成 CHS 3,2,1 有人可以跟我解釋嗎?
LBA是扇區位址。
CHS也是一個扇區地址。
為了將一種位址樣式轉換為另一種位址樣式,您需要指定磁碟機幾何形狀:
. number of cylinders
. number of heads (per cylinder)
. number of sectors per track
您無法將幾何圖形*翻譯*為地址;你使用用於轉換位址的幾何圖形。如果驅動器幾何結構為 ,則
CHS 位址3,2,1
相當於 LBA 位址。3150
1020,16,63
修訂後問題的附錄
在我看來,由於圓柱體穿過整個磁碟(多個盤片),因此將它們稱為“每個磁碟的磁頭”或“每個表面的磁頭”會賺得更多。
在我讀過的眾多技術文件(來自磁碟機製造商)中,(單一連接埠)磁碟機的規格表將列出讀/寫頭數量和盤片數量。從來不存在heads per disk
、heads per surface
、 或的比率heads per platter
。
在我擔任軟體/韌體工程師開發控制器韌體、磁碟裝置驅動程式和檔案系統處理程序的工作中,我從未關心或必須使用碟片的數量。盤片的數量或盤片有兩個可能的表面是機械性質這與 CHS 尋址的驅動器幾何結構完全無關。
CHS中的C指的是柱面位址。磁碟機必須(機電)尋找到請求的柱面位址/位置,以便正確定位 R/W 磁頭組件。
CHS中的H指的是R/W頭位址。磁碟控制器(電動)選擇請求的 R/W 磁頭(尋道完成後)透過其位址存取正確的磁軌。所有其他讀取/寫入頭均被(電氣)停用。
CHS中的S指的是扇區位址。當磁碟控制器在(選定的)R/W 磁頭下旋轉時,磁碟控制器(以程式設計方式)掃描每個磁區(在尋道和磁頭選擇之後),直到找到所要求的磁區(例如,讀取磁區的ID 記錄,並執行尋址)。
另外,
如果您熟悉維度分析,則將磁碟機的磁頭數指定為heads per cylinder
比 更有意義heads per drive
。
我了解幾何 CHS 數字,但是 (3,2,1) 元組 CHS 數字來自哪裡?
這只是選擇用於轉換為 LBA 位址的範例的任意 CHS 位址。
順便提一句
用最終用戶的術語來說,「磁碟」==磁碟機。
用專業的 HDD 術語來說,「磁碟」== 磁碟盤片。
答案2
以下是 Python 中實現的轉換、歷史怪癖和正確術語的便捷快速總結。大寫字母指定幾何形狀,小寫字母指定(c,h,s)
扇區位址的組成部分。
預設幾何(C,H,S)
形狀提供了通常用於現代大型磁碟在早期啟動時用於 MBR/BIOS 樣式啟動的值。
def chs(lba,C=1024,H=255,S=63):
"""
'lba' linearly addresses sector, indexing from zero.
'C','H','S' specify geometry - fixed for a given disk:
1 <= C <= 1024 (10 bits)
1 <= H <= 255 (8 bits) not 256 due to WD1010 quirk
1 <= S <= 63 (6 Bits) not 64 due to WD1010 quirk
Returns address as c,h,s tuple:
0 <= c <= 1023 (10 bits) modulo C
0 <= h <= 255 (8 bits) modulo H
1 <= s <= 63 (6 Bits) not 64 due to WD1010 quirk
"""
if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
raise ValueError, \
"Invalid (C,H,S) geometry: ({},{},{})". \
format(C,H,S)
t,s = divmod(lba,S); s+=1 # tracks, sector offset
c,h = divmod(t,H)
if c>=C: raise ValueError, \
"Unaddressable lba value: {} for ({},{},{}) geometry.". \
format(lba,C,H,S)
return (c,h,s)
def lba(c,h,s,C=1024,H=255,S=63):
"""
'C','H','S' specify geometry as for function 'chs'.
'c','h','s' address a sector in this geometry.
"""
if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
raise ValueError, \
"Invalid (C,H,S) geometry: ({},{},{})". \
format(C,H,S)
if c<0 or h<0 or s<1 or c>=C or h>=H or s>S:
raise ValueError, \
"Unaddressable (c,h,s) value: ({},{},{}) for ({},{},{}) geometry.". \
format(c,h,s,C,H,S)
return (c*H+h)*S+(s-1)