パーティションテーブルの各エントリが16バイトの情報量しか持ち得ないことを受けて、CHS (Cylinder, Head, Sector) は、3バイト、具体的には、Cは0〜1023、Hは0〜254、Sは1〜63までの値に制限されている。よって8GBを超えるHDDでは、CHSとLBAでは互いに可逆変換することはできない。
この場合の、CHSの表示方法には2種類ある。
・1番目の方法
convert LBA to CHS, store (cylinder & 0x3FF, head & 0xFF, sector & 0x3F)
1行目は、LBAをシリンダの1023という制限無しでCHS形式の表示にすると言う意味である。次に2行目のような方法で、各値の論理積をとるという方法である。 1行目の変換で算出したCHSであるが、実際には、Hは0xFF(10進数では255)、Sは0x3F(10進数では63)を超えることはないので、ヘッド・セクタに関しては、上記の論理積を経ても値は不変と考えてよい。(0xFFは2進数で11111111、0x3Fは111111だからカットされる桁がないため) シリンダに関しては、1024以上の値の場合には、0x3FF(10進数で1023・2進数で1111111111)なので、10桁までの数値に変換され、11桁より上はカットされる。 |
これは、おそらくVersion.8.0までのPartition Magic で採用されていた変換方式である。
・2番目の方法
convert LBA to CHS if cylinder <= 1023, store (cylinder & 0x3FF, head & 0xFF, sector & 0x3F) else store (1023, max_head & 0xFF, max_sector & 0x3F)
1行目までは最初の方法と同じだが、そのときに算出されたシリンダ値によって、2行目以降の扱いを変える。 シリンダ値が1023以下の場合には、1番目の方法と全く同じだ。ただし1023以下と分かっているので、シリンダに関しても論理積操作をしても数値は不変である。 シリンダ値が1024以上の場合には、算出値がどうであれ、とりうる最大値をCHSとして固定してしまうという意味だ。たとえばジオメトリのヘッド値が255であれば1023/254/63、おなじくヘッド値が240であれば1023/239/63のように表示される。 |
これはLinuxのFDISKやTestDiskが採用している方法だ。
TestDiskがパーティションテーブルを調べる時には、どちらの方法で表示されていても適正なものとして判断する。しかし2番目の方法のほうが、始点が終点よりも後ろになってしまうことを防げると言う意味で、より好ましいと考えられる。
例えば、ジオメトリが1シリンダあたり255ヘッド、1ヘッドあたり63セクタのハードディスクにおいて、パーティションの始点が2912/0/1、終点が3072/254/63の場合を考えてみると…
・1番目の方法
start: 864, 0, 1 end: 0,254,63
・2番目の方法
start: 1023,254,63 end: 1023,254,63
のようになる。1番目は、始点が終点よりも後ろにあるという矛盾した表示になってしまう。(おそらくVersion8.0までの)Partition Magic では2番目の方法を不正なものと判断するだろうが、これはこれできちんと仕様に則ったものである。TestDiskでは、どちらの方法でもエラー表示などは出さない。