CHS から LBA へのマッピング - (ディスク ストレージ)

CHS から LBA へのマッピング - (ディスク ストレージ)

LBA 以前は、ディスクの物理的なマッピングのみでしたが、古い IBM-PC 互換機の BIOS を使用したディスク アクセスは、次のようなものでした。

  • シリンダー番号:(10b)
    • 0-1024 (1024 = 2^10)
  • ヘッド番号: (8b)
    • 0~256(256 = 2^8)
  • セクター番号: (6b)

合計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) 

私が混乱しているのは、LBA式で「」と表記されるとき、実際には何を意味するの heads-per-cylinderか私にはわかりません。私が知っている限りでは、ヘッドとは、そしてそれがリムーバブルメディアでない限り、大皿それぞれの表面ごとに 2 つ (上部、下部) あります。

ここに画像の説明を入力してください

私としては、シリンダーがディスク全体(複数のプラッター)を通過するため、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 では、(ハードウェア レジスタで) 10 ビットのシリンダ番号を使用する Western Digital WD1010 ディスク コントローラが使用されていました。
最初のシリンダのアドレスは 0 なので、シリンダ アドレスは 1024 個あります。
"アドレス可能な番号「」は意味不明です。

「ブートセクター」の場合は -1 (c-0、h-0、s-0)
63 ビットのアドレス指定可能な番号 (63 = 2^6 - 1)

最初のセクター (各トラック) はアドレス 1 なので、6 ビットのセクター番号は各トラックの最大 63 セクター (セクター番号 1 から 63) をアドレス指定できます。
セクター アドレス 0 はありません。これは予約されていません。存在しません。
このオフセットの減算は算術上必要なことであり、ブート セクターとはまったく関係ありません。ディスク ドライブの最初のセクター (または任意のセクター) をブート (または任意の機能) に使用することは、開始オフセットを減算する必要性とは無関係です。

したがって、理論上の最大アドレスは次のようになります。

512(バイト) × 63(セクター) × 256(ヘッド) × 1024(シリンダー) = 8064 MiB

いいえ、それは最大容量です。
ディスク アドレスはバイトではなくセクター単位です。

ヘッド番号は 246 ビットのアドレス指定可能な番号だと理解しています...

えっ???「アドレス指定可能な番号」???
ドライブ パラメータの 1 つはヘッド数 (シリンダー内) です。CHS
アドレスの数字の 1 つはヘッド番号です。246
ビット???

私が混乱しているのは、頭と呼ばれるものが実際には何なのかということですheads-per-track

Heads-per-trackこれはあなたが作ったものです。PC で使用されている一般的な HDD にはそのようなパラメータはありません (つまり、その数値は常に 1 です)。
特定のトラックは、特定の R/W ヘッド 1 つによってのみ読み書きされます。1 つ
のサーフェスにつき 1 つの R/W ヘッドがあります (デュアル ポート ドライブを使用することはまずありません)
。R/W ヘッドはアームの端に取り付けられています。
すべての R/W ヘッドとアームは、アクチュエータによって移動/回転されるアセンブリを構成します
(ただし、修理済みヘッド ディスク ドライブ (例: トラックごとに 1 つのヘッドがあり、シーク時間がゼロ)。

これらの用語は私には意味がわかりません。なぜなら、私が知っている限りでは、ヘッド (読み取り/書き込みを行う実際のアーム) は、リムーバブル メディアでない限り、各プラッターに 2 つのヘッド (上部、下部) があるため、プラッターあたりのヘッドまたはディスクあたりのヘッドと呼ぶ方が理にかなっているからです... 実際は、トラックあたりのセクター数と呼ぶべきですよね?

どうやら、ヘッドが何であるかについて混乱しているようです。
また、「プラッター」と「表面」も混同しています。
プラッターの両面を使用する必要はないため、プラッターをユニットとしてではなく、各表面をユニットとして扱います。と
呼ばれるドライブ パラメータがありますsectors per track

heads-per-trackCHS から LBA への変換を見ると、この用語が表示されます。

これもあなたがでっち上げたもののようです。トラックあたりのヘッド数は 1 です。

しかし、ジオメトリ 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,1LBA アドレスと同等です。31501020,16,63


改訂された質問に対する補足

私の考えでは、シリンダーがディスク全体 (複数のプラッター) を通過するため、それらをディスクあたりのヘッド数または表面あたりのヘッド数と呼ぶ方が意味が通ります。

私が読んだ数多くの技術文書(ディスクドライブメーカーの)の中で、(シングルポート)ドライブの仕様表には、R/Wヘッドの数そしてそのプラッターの数heads per disk、、heads per surfaceまたはの比率は決して存在しませんheads per platter

ソフトウェア/ファームウェアエンジニアとして、コントローラファームウェア、ディスクのデバイスドライバー、ファイルシステムハンドラーを開発する仕事では、プラッターの数を気にしたり、使用したりすることはありませんでした。プラッターの数やプラッターに2つの表面があるという事実は、機械的性質これらは、CHS アドレス指定のドライブ ジオメトリとはまったく関係ありません。

CHSのCはシリンダアドレスを表します。ディスクドライブは(電気機械的に)求めるR/W ヘッド アセンブリが正しく配置されるように、要求されたシリンダー アドレス/位置に移動します。

CHSのHはR/Wヘッドアドレスを表します。ディスクコントローラ(電気的には)選択する要求された 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)

関連情報