CHS 到 LBA 映射 -(磁碟儲存)

CHS 到 LBA 映射 -(磁碟儲存)

在 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-diskheads-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 位址。31501020,16,63


修訂後問題的附錄

在我看來,由於圓柱體穿過整個磁碟(多個盤片),因此將它們稱為“每個磁碟的磁頭”或“每個表面的磁頭”會賺得更多。

在我讀過的眾多技術文件(來自磁碟機製造商)中,(單一連接埠)磁碟機的規格表將列出讀/寫頭數量盤片數量。從來不存在heads per diskheads 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)

相關內容