doc drawn up: 2004-10-24 .. 2006-02-07

BIOS における IDE HDD パラメータの手動設定

HDD
日立 Deskstar 7K250 HDS722516VLAT80 (160GB)
M/B
Gigabyte GA-6VTXE (Rev 1.0), Bios: F9 (2003-03-12, AMI 1.24K)

大まかな話

DVD+R ドライブを使うようになってから、元々使用していた 20GB の HDD(IBM Deskstar DPTA-372050)では手狭な感じになってしまった。また、DPTA-372050 は Ultra DMA 66 だが、M/B の方は Ultra DMA 100 に対応しているので、そのうちに Ultra DMA 100 対応 HDD に換装したいとは思っていた。そこで先日、特に何も考えずに、単位バイト価格が割安な 160GB の大容量 HDD であるこの HDS722516VLAT80 を買ってしまった。

ところが実際に HDD を接続(元の HDD をそのまま起動用ドライブとしてマスタ接続したまま、セカンドドライブとしてスレーブ接続)してみると、BIOS の IDE デバイスの自動認識で HDD のパラメータを自動設定しないので、慌てることになった。ネットで情報を収集すると、137GB の限界だとか、そういった情報が目に飛び込んできた。「げっ! 何にも考えないで 160GB とかばかデカい HDD にしちゃったけど、デカ過ぎるというのも問題の種だったのか。もう少し考えてから選ぶべきだったか……」そんな思いが頭を錯綜した。

とりあえず自動認識されない状態を放置して、そのまま PC を起動してみることにする。すると IDE の設定が適切でないという警告メッセージがビープ音を伴って表示されて、一旦入力待ちになる。F1 キーを押してそのまま起動過程を続行させると、元の HDD にインストールされた OS (Windows) の起動過程へと到った。Windows が起動してしまえば、BIOS とは別個に HDD を扱うことになるので「一応は」この HDD を使うことができる。しかし、毎度毎度起動のたびに F1 キーを押すのは面倒な話である。それに BIOS でちゃんと HDD を扱えないと、この HDD をマスタ接続して起動用ドライブとして使えないことになる。

Partition Magic を使って情報を見てみると「物理ジオメトリ」という項目があり、そこに C/H/S=20023/255/63 という情報が表示されていた。もしかしたらと思い、BIOS の HDD のパラメータの手動設定において、この値を入力してみた(この BIOS では、Landz は C の値から自動的に決定されユーザ入力が不可となっている。また、Precomp はネットで調べた情報によると最近の HDD では無関係な値なので手動設定時には 0 のままにしておいた。要するに、Precomp, Landz は特に関係なく、C/H/S の値だけを念頭に置けばいいということになる)。すると、起動時のエラーが解消され、OS 起動直前に一瞬表示される画面でもどうやら HDD が正常に認識されているらしいのが確認できる。

ちなみに元々自動認識可能だった DPTA-372050 の場合 C/H/S = 39770/16/63 (Precomp=434, Landz=39770) だった。

Partition Magic が「物理ジオメトリ」として示した新 HDD の C/H/S は、BIOS が自動認識した旧 HDD の C/H/S と比較すると、C が約 1/2 倍、H が約 16 倍、S が同じ、となっている。つまり全体としては約 8 倍ということになる。旧 HDD が 20GB で新 HDD が 160GB だから、どうやら Partition Magic の「物理ジオメトリ」情報はだいたい正しいようである。

厳密な話

BIOS の HDD パラメータの手動入力にあたっては、当然、日立の Web サイトの情報を参照して C/H/S のパラメータについての情報を探した。英語の Technical Library Documentation の中にある Deskstar 7K250 Specification v1.3 なんてものまで隈なく探してみたつもりだが、どこにも「BIOS の C/H/S のパラメータにどういう数字を入れろ」という具体的な記述を見つけることができなかった。C/H/S の数値については、唯一 16383/16/63 という数値があり、これは HDD に貼付されているシールにも表記されている数値だが、単に、IDE の規格上の最大値を並べたものに過ぎない(実際には、この HDD の LBA 数はこの最大値を超過している)。こちとら IDE の規格表現上の最大値を知りたいのではなく、BIOS の設定画面で使えるこの HDD のための C/H/S 値を知りたいのだ(怒)。

データシート等に存在しない C/H/S の値を Partition Magic が「物理ジオメトリ」として示すことができたということは、何らかの方法によって C/H/S の値を算出しているものと考えることができる。

C/H/S 以外に HDD 貼付シール上やデータシート上で明確に提示されている値は、LBA (Logical Block Address) 総数である。新 HDD(HDS722516VLAT80)の場合は 321672960、旧 HDD(DPTA-372050)の場合は 40088160 となっている。

ふと思い付いて試算してみたところ、C/H/S が BIOS の自動認識で設定された旧 HDD の場合、LBA 総数 40088160 という値は、C × H × S すなわち 39770 × 16 × 63 に相当することに気が付いた。

そこで新 HDD についても試算してみた。Partition Magic の示した C/H/S を使ってみると、20023 × 255 × 63 = 321669495 となり、3465 だけ小さくわずかな余りが出るものの、ほぼ LBA 総数と同じになっている。

要するに、C × H × S = LBA 総数ということは間違いないだろう。LBA というものについては「従来の C/H/S 方式による容量限界を超えるための方式」というありきたりの知識しかなかったが、今回ようやくその実質的な意味がわかった気がする。もはや LBA 方式で操作する最近の大容量 HDD の場合 C/H/S の値は有名無実化しており、実際の HDD の操作に使われない非現実的なもののようである。直接、LBA 総数として BIOS で設定すれば話が早いのだろうが、なぜか下位互換性のためだろうか、LBA 総数の値を C/H/S の値の設定によって BIOS に伝える方式となっているようである。つまりユーザが設定した C/H/S の値から、結局は C × H × S によって LBA 総数を BIOS が知り、その LBA 総数によって LBA 方式で HDD を操作しているわけである。だから C/H/S の個別の値は実は「どーでもいい」わけで、C × H × S の計算結果さえ等価ならば、C と H と S の値が入れ替わっていようが関係ないと言える。

ところで、この AMI の BIOS では設定できる C/H/S の最大値が 65535/255/255 となっているので、その範囲内で、 C × H × S の値がちょうど LBA 総数になるように工夫する必要がある。

新 HDD の LBA 総数 321672960 を素因数分解してみると、28 × 32 × 5 × 7 × 3989 となった。この素因数分解式から、255 以内で最大の数値を考えてみると、 32 × 7 = 63、さらに 63 × 22 = 252 を得ることができる。残った素因数分解式は、26 × 5 × 3989 で、再び 255 以内で最大の数値を考えてみると、25 × 5 = 32 × 5 = 160 を得る。残った素因数分解式 2 × 3989 から 7978 を得ることができる。すなわち C/H/S = 7978/160/252 にすればいいことになる(もちろん、C/H/S = 7978/252/160 でも可だろう)。

こうして得られた C/H/S = 7978/160/252 (Precomp=0) を BIOS で手動設定したが、どうやら問題なく動いているようである(マスタ接続して起動ドライブとして使用中)。

2006-02-07 追記:素因数分解式から計算し直してみたところ、319120/16/63 という組合せも可能であることに気がついた。同じ日立製の旧 HDD では 39770/16/63 で、H と S の値が IDE 規格の最大値であり、C の値のみ規格を超過した値となっているから、新 HDD では 319120/16/63 とするのが一番正解っぽい。だが、319120 という数値は BIOS 側の設定値の限界を超えているので、仕方なく C を 5 で割って代わりに H に 5 を掛けると 63824/80/63 という組合せを得たので、現在はこれを使用している。

Partition Magic のアルゴリズム

Partition Magic の C/H/S 値は、やや不正確であったが、それは算出アルゴリズムによるものだろう。想像するに Partition Magic の場合は、素因数分解を使わずに、後ろの S 値から順番に最大値を配当し、その最大値で割って算出しているものと思われる。LBA 総数が 321672960 で、S 値の最大値を 63 と仮定し、その数で割る。すると 321672960 ÷ 63 = 5105920 を得る。さらにこの数値を H 値の最大値を 255 と仮定し、その数で割る。すると 5105920 ÷ 255 = 20023 … 55 を得る。そうやって得たのが C/H/S = 20023/255/63 ではないかと思われる。

Partition Magic の場合、実際の内部操作において LBA 値を用い、C/H/S の値はあくまでもユーザに対する表示の上で利用しているに過ぎないのなら、問題はない。だがもしも算出した C/H/S の値を実際に用いてパーティション操作を行っていたとしたら、やや少ない(-3465の)数の LBA しか使えていないことになる。

Partition Magic だけを使ってパーティション操作を行う場合は気にしなくていい。もし他のパーティション操作ツールを使って、この最後の 3465 の LBA をきちんと使い切ったパーティションを作成できたと仮定する。その場合、Partition Magic はそのパーティションに対してどのような動作をするのか、疑問が残る。内部操作において LBA 値しか使っていないのなら問題はないのだが、端数の出る C/H/S 値をベースに操作していた場合、どうなるのかちょっと心配である。しかし今回は、Partition Magic のお陰でヒントを得られることになったのだから、気にしないことにしよう(笑)。

あとがき

BIOS で手動設定するための C/H/S の算出方法を勝手に編み出してしまいましたが、おそらく知っている人にとっては全くの常識で、取り立てて云々するような話ではないのかもしれません。しかし、当方で Web 上の情報を検索した限り、全くそういった話にお目にかかることができませんでした。Big Disk の認識に問題がある場合、BIOS をアップデートしろとか、ありきたりの初心者向けの FAQ なら至る所にあるのですが、C/H/S の手動設定の内容について踏み込んで書かれている情報が見つかりません。そんなわけで、このような試行錯誤によって自分でわざわざ算出法を編み出すほかなかった次第です。もし、このやり方では間違っている等の何かご指摘等ございましたら、メール等でお教えいただけると幸いです。


《以上》