LBAの前は、ディスクの物理マッピングがあっただけでした。元々、古いIBM-PC互換機のBIOSでディスクにアクセスすると、次のようになります。
合計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
_と呼ばれる場合、headが実際に何を意味するかです。私が知っていることから、頭は頭であり、リムーバブルメディアでない限りなので、私には意味がありません。プラッターには、その表面ごとに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)
here の最初の例を見てください:
_For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA 3150=(3× 16+2)× 63
_
ジオメトリ:(これはメーカーによって定義されています)
全体的に、あなたは用語にかなりずさんなので、それはさらなる混乱の原因です。
1024ビットのアドレス指定可能な数(1024 = 2 ^ 10)
IBM PC/XTは、(ハードウェアレジスターで)10ビットのシリンダー番号を使用するWestern DigitalWD1010ディスクコントローラーを使用しました。
最初のシリンダーのアドレスは0なので、1024個のシリンダーアドレスがあります。
"アドレス指定可能な番号"は無意味です。
「ブートセクタ」の場合は-1(c-0、h-0、s-0)
63ビットのアドレス指定可能な数(63 = 2 ^ 6-1)
(すべてのトラックの)最初のセクターはアドレス1であるため、6ビットのセクター番号は各トラックで最大63セクター(セクター番号1から63)をアドレス指定できます。
セクターアドレスゼロはありません。予約されていません。存在しません。
このオフセットの減算は算術的な必要性であり、ブートセクターとはまったく関係ありません。起動(または任意の機能)のためにディスクドライブの最初のセクター(または任意のセクター)を使用することは、開始オフセットを減算する必要性とは無関係です。
したがって、次の理論上の最大アドレスを取得できます。
512(バイト)×63(セクター)x 256(ヘッド)×1024(シリンダー)= 8064 MiB
いいえ、それが最大容量です。
ディスクアドレスはセクター用であり、バイト用ではありません。
ヘッド番号が246ビットのアドレス可能な番号であることを理解しています...
え? 「アドレス可能な番号」???
駆動パラメータの1つは、(シリンダー内の)ヘッドの数です。
CHSアドレスの番号の1つは、ヘッド番号です。
246ビット???
私が混乱しているのは、
heads-per-track
と呼ばれるときの頭が実際に何であるかです。
Heads-per-track
は、PCで使用される一般的なHDDにはそのようなパラメーターがないため、作成したものです(つまり、その数は常に1になります)。
特定のトラックは、1つの特定のR/Wヘッドによってのみ読み取りおよび書き込みが行われます。
サーフェスごとに1つのR/Wヘッドがあります。 (デュアルポートドライブを使用する可能性はほとんどありません。)
R/Wヘッドはアームの端に取り付けられています。
すべてのR/Wヘッドとアームは、アクチュエータによって移動/回転されるアセンブリを構成します。
(ただし、fixed-シーク時間がゼロのヘッドディスクドライブ(トラックごとに1つのヘッドなど)もあります。)
私が知っていることから、ヘッド(読み取り/書き込みを行う実際のアーム)であり、リムーバブルメディアでない限り、各プラッターには2つ(上、下)があるため、これらの用語は私には意味がありません。それらをheads-per-Platterまたはheads-per-diskと呼ぶようになってから、さらに多くのことができます...そして実際にはそれはセクター/トラックである必要がありますよね?
それからどうやらあなたは頭が何であるかについて混乱しています。
「プラッター」と「サーフェス」も混同しています。
プラッターの両面を使用する必要はないため、各サーフェスは、プラッターを1つの単位としてではなく、1つの単位として扱われます。sectors per track
というドライブパラメータがあります。
これで、CHSからLBAへの変換を見ると、この用語
heads-per-track
が表示されます。
繰り返しますが、あなたが作り上げたように見える何か。トラックあたりのヘッド数は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,1
は、ドライブの形状が3150
の場合、LBAアドレス1020,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アドレスです。
[〜#〜] btw [〜#〜]
エンドユーザーの専門用語では、「disk」==ディスクドライブ。
プロのHDD専門用語では、「ディスク」==ディスクプラッター。
これは、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)