ここにある LBA から CHS への方程式を見てきましたが、なぜそれらが機能するのか理解できません。これらの方程式が機能する理由を誰かが説明できますか? (おそらく、フロッピー ディスクなどのストレージ デバイスにデータが格納される順序を簡単に説明します)
1 に答える
CHSは、ディスクが文字通りデータにアクセスした時代のシリンダー、ヘッド、セクターを指します。つまり、読み取るシリンダー、ヘッド、セクターを選択します。
LBAは、基本的にディスクを継続的に増加するブロック数としてアドレス指定する新しいスキームです。
変換スキームは、基本的に一方から他方へと移動します。まず、方程式は、知る必要のあるいくつかの値のプレースホルダーを提供します。つまり、シリンダーあたりのヘッド数と、ヘッドあたりのセクター数です。
したがって、次のようなデータがあると想像してください。
Cylinder number Head Number Sector Number Data LBA
================================================================================
0 0 0 A 1
0 0 1 B 2
0 0 2 A 3
0 1 0 B 4
0 1 1 A 5
0 1 2 B 6
これは、ヘッドごとに3つのトラックしかない、意図的に考案されたスキームです。どのように、私たちは、私たちが上がる各トラック番号が番号を増やすように、LBAを注文することを選択しました。ただし、ヘッドを切り替えるときは、トラック番号もインクリメントする必要があります。したがって、次のように言うことができます。
LBA = sectors per head * current head + current sector number
したがって、LBA 4を見つけるために、CHS表記でに等しいことがわかり(0,1,0)
ます。頭あたり3つのセクターで3*1+0=4
。
注意してください、私は故意に逃した-1
ので、あなたはアイデアに集中します-それはLBAがゼロオフセットであるために使用されます。
とにかく、これはヘッドとセクターではうまく機能しますが、シリンダーはどうですか?さて、シリンダー番号が1つ増えると、ディスク上のセクターであるディスクnumber of heads per cylinder
上で頭を前にジャンプしました。number of heads per cylinder times number of sectors per head
シリンダー、ヘッド、セクタータプルが与えられた場合、合計すると次のセクターがいくつあるかを計算できます。
LBA = (((cylinder number * heads per cylinder) + head number) *
* sector per head) + sector number - 1
方程式の最初の部分は、左から右に向かって、シリンダー数をジャンプに必要なヘッドの数に変換します。次の部分では、現在のヘッド番号をそれに追加し、それをいくつかのセクターに変換します。最後に、現在のセクター番号を加算し、ゼロインデックスから1を減算します。
私はここで自分自身を繰り返しているようなものですが、それには正当な理由があります。これはそれらの概念の1つにすぎません。それが役立つ場合は、平行線を描画します-16進数から10進数に変換します。私があなたにFEDを与え、それが10進数で何であるかを知りたいと仮定します。まあ、変換は次のようになります:
dec = (((15*16)+14)*16)+13
どうやってそれを解決したのですか?さて、FEDの左から右へ、「10」あたり16の「百」があり、数字は15です。これに「十」の数を加算すると14になります。これに16を掛けます。ユニットあたり16"十"。最後に、13ユニットを追加します。
重要なのは、この種のことを10進数で毎日行うことです。ここでの唯一の問題は、基数または基数が10ではない数値であるため、自然な表記法で意味があることです。
編集:あなたが実際に反対の方向について尋ねているのは私に起こったばかりです。それははるかに簡単です!
まず、剰余演算子-これは、別の値で割ったときの特定の値の余りを意味します。したがって、ある場合r = X mod Y
、XをYで割ったときの余りはrになります。
これは、時計のように、増加するにつれてこれらの値が循環的に循環するという事実のために、一般にクロック演算と呼ばれますX
。
また、除数の商を計算することもできます-ペアが与えられたX
場合、それはそのようなの最大値です。Y
X/Y
A
X > AY
すべてをまとめると、商と32の余りを5で割って計算するように求められた場合、5は30を割るので、2 = 32 mod 5であることがわかります。次に、30 = 6 * 5なので、商は6になります。
さて、式に移りましょう。LBAアドレスが与えられると、ヘッドあたりのトラック数にシリンダーあたりのヘッド数を掛けると、特定のシリンダー番号が「カバー」するトラック数が得られます。この範囲の残りはすべて同じシリンダー番号を使用します。上記の考案された表を使用した実際の例:ヘッドごとに3つのトラックがあり、シリンダーごとに6つのヘッドがあるとします。つまり、6 * 3=18です。ここで、LBAを取得します。たとえば、5-5/18 = 0の余り5です。したがって、その商の値をシリンダー番号と見なします。
それで、次の質問はLBA番号を取り、それをあなたが持っているトラックごとのセクターで割ります-なぜですか?よく覚えておいてください、私たちのLBAは「トラック」を数えます。この値で割ってフロアを取ると(個々のトラックがすべての可能な余りを占めるため)、私たちは頭に変わります。次に、シリンダーあたりのヘッド数を法としてその値を取得します。たとえば、シリンダーあたり6つのヘッドがあり、ヘッド値が8の場合、ヘッド数は2として正しく報告されます(シリンダー番号は1であり、最初の6)。
最後に、セクター番号は、トラックごとのセクター(プラスゼロインデックスをオフセットするための1)の余りで割った単純なLBAです。なんで?ええと、各トラックには、異なるヘッド/トラックが必要になる前に、特定の数のセクターしか含めることができません。