ハードディスクの容量上限問題
まりも(DOSsoft)
本コンテンツは2000年7月頃に書かれたものを一部修正加筆したものです。
2020年現在からみると情報が古い場合もあります。
ここでの容量単位表記MiBは2の20乗(1024×1024)バイトです。
一般的なセクタ長512Bでは、総セクタ数÷2048でMiB容量値は求められます。
メモリと同じように、ハードディスクにおいても、ディスク上のどこにデータがあるかということを示す番地づけ(アドレッシング)が必要です。ディスクインターフェイスでの容量の上限がなぜどのようにして決まるかを理解するには、アドレッシングの指定の仕方を理解する必要があります。しかしそれはハードディスクの進化と関わり合っているため、若干複雑です。そこで歴史的にどう変化してきたかを見ながら解説することにします。
なお、OSやIPL、DOSアプリケーションからディスクドライブに渡されるアドレスには、2階層あることに注意してください。すなわち、アドレッシングデータの流れは、
【16bitOS・IPLなど 】 →→[階層1]→→ 【BIOS】→→[階層2]→ → 【ディスクドライブ】
というようになっています。階層1のほうをBIOSレベルのアドレッシング、階層2はドライブファームウェアレベルのアドレッシングと呼ぶことにします。階層1と2とでどちらにも C/H/Sパラメータというものがあり得ることになりますが、それぞれ値は異なる場合があるということに注意してください。最近のATAとSCSIでは、階層2のアドレッシングではC/H/Sを使わ(え)ず、下記で述べる「LBA」での指定になっています。要するに、BIOSは、ディスクアドレッシングの変換をする(場合がある)わけです。また、ドライブのファームウェアでC/H/Sを指定する場合でも、パラメータ可変のものが登場してからは、ドライブファームウェアレベルのC/H/Sは、あまり気にしなくてよくなりました。
この時代はハードディスクコントローラがあまりインテリジェントではなく、本体CPUによる制御がかなり必要でした。ハードディスクの物理的なシリンダ、ヘッド、セクタ位置をCPU側からデータ転送してディスクドライブ上のデータにアクセスしていました。つまり、シリンダ、ヘッド、セクタ番号を レジスタなどに積んで BIOS を呼び出してアクセスするか、それと同等のパラメータをI/Oアドレスに指定の手順で送出してアクセスしていました。この基本的方法自体はいまでも変わっていませんが、当時は、BIOSレベルアドレッシングもファームウェアレベルも、物理ディスクレベルまでもが値が同じでした。
IDEのドライブになって容量が急速に増大し、物理的なシリンダ、ヘッド、セクタ番号と、CPU側から指定するそれとが一致しなくなって来ましたが、IDEのドライブのコントローラはインテリジェントでしたので、指定された値を物理的なアドレスに読み替えてアクセス可能になっていました。このためBIOS API上ではとくに指定を変更する必要はありませんでした。この当時は、BIOSレベルのC/H/Sアドレッシングとファームウェアレベルのそれとが同一でした。
PC/AT互換機では、BIOSのC/H/S仕様が窮屈で、それぞれ上限が 10bits,4bits(最大8),6bits(最大8)であったうえ、ゼロからでなく1から指定する仕様のため、IDEの上限というと 1023*16*63セクタすなわち527,966,208バイトとなっていました。俗に言う 528メガバイトの壁というのがこれです。これはBIOSコールに使用されるレジスタの使い方の仕様に基づいています。このため、ATAドライブについても指定上限をBIOSにあわせて作るなどという本末転倒なことになってしまいました。
SCSIではSCSIコマンドにディスクアドレスを送って読み書きのアクセスをしますが、大容量化に伴い物理的なC/H/Sはいかようにも変化することになりました。C/H/S指定では煩わしいため、セクタ番号を連続した32bitの一つの値で指定するようになりました。この値のことを「論理ブロックアドレス」(LBA)と呼んでいます。しかし、旧来からのパソコンシステムのOSおよびシステム自身は、BIOSを経由してC/H/Sアドレッシングでアクセスしていましたので、SASIやIDEとの互換性を失わないために、SCSIアダプタのBIOS上で BIOS C/H/Sを LBAに変換してSCSIコマンドに送出するようにしました。PC-98と異なり、PC/ATではBIOS上では IDEとSCSIの区別はありません。
初期のATAのC/H/Sアドレッシングでは 528MiBを超えられず、容量が不足となってきました。このため、BIOSのC/H/Sをそのままにして、ファームウェア側C/H/Sのどれかのパラメータを拡張するような方法がとられることになりました。そのためいろいろなパラメータが登場して混乱してきました。途中、約2GB(2015MiB)の上限となるBIOSもありました。最近のドライブに2GBクリップというスイッチが付いているのはその名残です。さらに大容量化が進むと、SCSIと同様にLBAでの指定も可能なドライブが登場し始めました。これにより、原理的にはSCSIと同じように32bitのセクタ数までの容量指定が可能になりました。
ところが相変わらずPCシステムの原始的なところでは BIOS レベルのC/H/S指定でしたので、BIOSでのヘッド数を 8bit上限まで増やすしかありませんでした。BIOSシリンダ数が頭打ちとなったことからヘッド数を相対的に増やし、1023*255*63セクタ数まで、すなわち
8,414,461,440バイト(8024MiB)まで指定可能にしました。俗に8.4ギガバイト壁と言うのは、この値の10の9乗分の1での値です。BIOSは、ドライブのファームウェアに対しては、シリンダ数を16倍に、ヘッド数を16分の1にパラメータ変換して渡すわけですが、LBA値で渡すようにしたBIOSを搭載することもこの時期から多くなってきました。また、ドライブのファームウェアも賢くなり、ヘッド16(15)、セクタ63という固定したパラメータ以外のC/H/Sも、設定次第では受け付けられるモノが主流になりました。ただしこの機能は使われずに、BIOS内でパラメータ変換していることも多かったようです。
ついに、PC/AT BIOS APIの仕様上限である、1023シリンダ、255セクタ、255ヘッドまでを使用することになってしまいました。これによる容量上限は、34,058,534,400バイト(32480Mバイト)となりました。俗に言う32GB上限の一つがこれです。この頃登場のPC/ATマシンでは、BIOSがドライブに対して発行するアドレッシングは、完全にLBAになってきました。
しかし取り残された旧機種ではC/H/Sのままで、BIOSに指定された値をヘッド数とシリンダ数しか変換しないマシンBIOSもまだあったため、ドライブのファームウェアも、旧機種での誤動作を避けて、C/H/Sモードでの容量の問い合わせに対してはシリンダ数は16383まで、ヘッド16、セクタ63を返すようにしてあります。以降、現在でもこれは引き続いています。つまり、ドライブに対してC/H/Sアクセスを行なう旧機種では、どんな大容量のドライブを繋いでも、8063MiBまでの上限のまま使用することになります(旧機種代表^^;のPC-9821でもこれが影響する)。これもおよそ8.4GBです。
以上のように、およそ8GB(8.4GB)という壁は、PC/ATの旧Int13h
APIの壁の場合(FDISKで問題になる)と、 IDEハードディスクのファームウェアレベルでのアクセス方式による壁(BIOS認識段階で問題になる)との2つがあることになりますが、きちんと厳密に区別されて理解されていないのが現状(注、2000年現在)のようです。
PC-9821の SASI/IDE BIOSのAPI仕様は、PC/ATに比べるとずっと余裕を持たせてありました。BIOSシリンダ数上限は16bits、ヘッド、セクタ数は8bitがまるまる使用できます。SASIの伝統的なパラメータ値を引き継いだので、IDEではセクタ数17、ヘッド数8、シリンダ数は65535までという値が採用されました。
1994年前半までの機種では、総セクタ数から BIOSヘッド数・セクタ数で除算して BIOSシリンダ数を求めるルーチンに問題があり、544MiB以上のドライブを繋ぐとBIOS内で除算エラーがでてハングしてしまう問題がありました。先にセクタ数17で除算した結果が16bitに収まらなくなってしまったのです。これは 544MiBの壁とか543MiBの上限と呼ばれていました。BIOSに対する動的パッチで対処することもできました。'94年後半以降の機種からは改善され、65535*8*17 セクタ、すなわち 4351MiB(4.25GiB)までの IDEディスクドライブをきちんと使用できるようになりました。
なお、ドライブに対しては、ディスクアドレスをドライブ固有のヘッド/セクタ数に変換して送るのでもよいのですが、BIOS内でのオーバーヘッドを避けるためか、ドライブのファームウェアにコマンドを送って、BIOSと同じくヘッド数8,セクタ数17でそのままの値を渡すようになりました。これができないドライブは、520MiB程度あるドライブでも504MiBまでしか使用できないということがありました。
ところがこれを超える容量のIDEドライブが登場するにつけて、別のパラメータに拡張する必要が生じてきました。そこで、4351MiBを超えるドライブに対しては、「ドライブの持っている初期のC/H/SパラメータにBIOSの C/H/Sパラメータをあわせる」という仕様に、NECはBIOSを変更しました。この仕様は'97年中頃の機種から採用されました。たいていのドライブではヘッド16(一部15)、セクタ63ですので、必然的に、容量は同時期のPC/ATと同様に、16383*16*63セクタ、すなわち 8063Mバイトが上限となりました。この値は8,454,668,288バイトになることから「IDE 8.4ギガバイトの壁」と書く場合があります。よく見かける値はこれが根拠です。既にPC/ATのところで述べたように、ドライブのファームウェアが返す仮のシリンダ数が、65535でなく16383で頭打ちになっているため、この容量を超えるものを繋いでも8063MiBまでしか領域確保はできません。
しかしLBA数から割り出した適切なシリンダ数を与えて内蔵IDE BIOSにパッチを当てれば、
65535シリンダまで確保できるようになります。この場合の容量上限は下記と同じになります。9821ではドライブに対してC/H/Sアクセスを行なっているので、本来は8063MiBまでしかアクセスできないはずなのですが、仮のシリンダ数である16383を超えた値を指定してもドライブはエラーを返さないと言う抜け道仕様(?)となっているため、このようなことができます。
インターフェイスがドライブに対して発行するアドレッシングをLBA化することで、98のIDE BIOSの上限である 65535×ヘッド数×セクタ数までのドライブを使用できるはずでしたが、アイオーデータは 8063MiBまでの9821のパラメータとの互換性を考慮して、ドライブファームウェアのデフォルトヘッド数/シリンダ数にあわせることにしました。このため実質的な上限は、65535*16*63セクタ数、すなわち32255MiBとなりました。なおIDE-98(Cバス用)は、ヘッド16セクタ17という独自パラメータを採用してしまったため、4352MiB以上の(4351MiBを超える)容量のドライブのつなぎ換えで問題が出ます。16*17*65535セクタ、すなわり8703MiBが上限となります。
初期のSCSIでは、BIOSレベルのC/H/Sパラメータは各社各様でしたので、A社のSCSIアダプタに繋いで領域確保したドライブはB社のアダプタで起動・認識できないという問題がありました。これをきちんと説明せずに「相性問題」などと言っていることがよくありました。しかしPC-9801-92ボードが登場しWindows95やWindowsNTが登場してくると、パラメータの不一致は非常に致命的となったため、SCSIアダプタベンダーの各社は、92ボードにあわせたBIOS C/H/Sパラメータを採用しました。すなわち、セクタ数32、ヘッド数8という値への統一です。これで上限は65535*8*32セクタ数=8192Mバイト未満ということになりました。俗に8.0GBの壁というものです。上記のIDEの約8GBの壁と近いので混同している人が多くいました。
ところがNEC純正(=アダプテック製)のPCI SCSIアダプタ(PC-9821X-B02L, B09,B10)では、さらに大容量のドライブが出現することを予期して、8191MiBを超える場合には、セクタ数128、ヘッド数8のパラメータを与えるようになっていました。このため、NEC純正もしくはアダプテックのSCSIアダプタを使用する場合は、128*8*65535セクタ数、すなわち32767MiBまでのドライブを使用できます。これも上記のUIDE-98による約32GBの上限とは値がきわめて近いので、上限の根拠を混同している人もいました。サードパーティ製のSCSIアダプタも、98年出荷頃以降のものは、NEC純正と同じパラメータに対応していますが、やや古いモノは8191MiB止まりで、それを超えたドライブを接続した場合の症状は、8191MiBまでを使えるもの、ハングアップしてダメなものと、さまざまです。
32GBを超えられるSCSIアダプタとして、2001年現在、メルコのIFC-USP-M2および CHANPON1 ボードのSCSI部があります。BIOSヘッド数15,セクタ数128というパラメータを使用し、60GBまで使えます。FreeBSD、Windows9xで使用できることがはっきりしています。アイオーデータのSC-UPCI系は、32GBを超えた容量のドライブを繋いでも、ハングアップはしません。しかし32GBで打ち止めとなります。マルチベンダパラメータを使って15ヘッド255セクタなどにすれば上限を引き上げることはできます。
以上をまとめると、PC-9821では下記のような上限値が存在することになります。その容量が上限となるかどうかは、本体内蔵IDEの場合は本体のBIOSに依存、SCSIの場合はSCSIアダプタのBIOSに依存します。
上限値 | 理由 | 上限を超えたHDを接続した場合の症状 |
(504MiB) | PC/ATの528メガ壁とも言われる
*** PC-9821では問題ない *** |
*** |
543MiB | IDE BIOSのアルゴリズム上のバグ(8bit除算上限) | 除算エラーでハングアップ |
(2014MiB) | *** PC-9821では無関係 *** | *** |
4351MiB | IDE BIOS C/H/Sパラメータ上限 (65535,8,17) | 除算エラーでハングアップ、または認識されず |
8063MiB | ATAドライブファームウェア C/H/S(16383,16,63) | 8063MiBまでは問題なく使える、後で拡張可 |
32,255MiB | IDE BIOS C/H/Sパラメータ上限(65535,16,63) | 本体内蔵の場合: 32255MiBとして認識
(EXIDE32Gを使えば 125GBまで可能) UIDE-xxの場合: おそらく除算エラーハングアップ |
130,558MiB | IDE BIOS C/H/S拡張パラメータ上限(65535,16,255) | 不明(拡張BIOSの作りに依る) |
131,071MiB | IDE BIOSとファームウェアともに LBA の上限
48bit LBA方式に対応しないファームウェアではこれが最大 |
不明 |
上限値 | 理由 | 上限を超えたHDを接続した場合の症状 |
8191MiB | SCSI BIOS C/H/Sパラメータ(8,32) | 除算エラーでハングアップ、または認識されず他の装置から起動 |
32767MiB | SCSI BIOS C/H/Sパラメータ(8,128) | 除算エラーでハングアップ、または認識されず他の装置から起動
SC-UPCI系 1.63 では、32GBとして認識 メルコIFC-USP BIOS 1.20以上ではこの上限を超えることができる |
IDEで 32255MiB、SCSIで32767MiBの上限が存在するわけですが、これを超えるドライブはもう登場しています(注:2020年現在128GBはおろかテラバイトオーダー)。しかし、これ以上のBIOS C/H/Sパラメータを策定する機関というものがもはやありません。NECが9821の新規開発から撤退しているためです。従って、どのサードパーティもあまり手を出したがらないように見えます。逆に言えば、「独自BIOS C/H/Sパラメータ」を勝手に決めたモン勝ちでやればよいと思います。どうせですから、32255MiB以上は、SCSIもIDEも統一のパラメータ(たとえばセクタ255, ヘッド15など)を採用してもらえれば、SCSI-ATA変換ユニットを介した場合とそうでない場合とでのパラメータ変更の必要がなくなって好都合です(注:2000年当時なのでSSDの存在は想定していない、16:64や16:128など2の乗数のほうがよい)。
ただし、そのような、セクタ数が大きなパラメータとなった場合、FDISKやFORMATプログラム、あるいはWindows9xなどのOS内部ルーチンが誤動作をする可能性があります。現に、Windows95は、セクタ数が64を超えるようなパラメータに対しては、内部のファンクションの一部が誤動作するようです。FORMAT.COMの段階でそれが露呈され、動作しなくなります。
以下の場合の98のフォーマットの問題点と方法を書いておきます。単に容量の問題だけではなく、接続方式でかなり違いますので注意して下さい。
1. 内蔵IDE接続で、4351MiB以下のドライブを接続している場合
とくに問題ありませんので、 Windows9x では 普通に FDISK, FORMATしてください。
2. 内蔵IDE接続で8063MiB上限のある(というか全てあります)機種の場合
残念ながらそれ以上のドライブをつないでも、8063MiBぶんまでしか FDISKで確保できません。BIOSを騙して真の容量を取得できるようにするソフトが必要になります。そのようなソフトに、EXIDE32Gがあります。EXIDE32Gが一旦動作した後であれば、32GBまではFDISK,FORMATが正常に使用できます。32GBを超える場合は、FORMAT.COMが異常動作しますので、FORMAT代替ソフトが必要です。
あるいは 下記 UIDE経由で一旦フォーマットしてあればOKです。ただし改めてFDISKやディスクアドミニストレータ、あるいは他社製フォーマッタを使用しないようにしてください。これは、BIOSが把握している上限値と、パーティションテーブルから判断される上限値とが一致していない状態にあるため、フォーマッタが混乱を来すことがあるからです。フォーマット変更を行う場合は、再びUIDEに接続したうえで行って下さい。
3. UIDE-98M/UIDE-66経由のIDEドライブ
この場合は32GBを超えないドライブを接続した場合は、FDISKにより全容量確保できます。
4. SCSIで 8192MiB未満の場合
とくに問題ありませんので普通に FDISK, FORMATしてください。
5. SCSIで 8192MiB以上対応のホストアダプタを使用し、そのようなドライブを接続している場合
Windows9xのバージョンにより問題が発生します。まず、Windows95 OSR2のFAT32でのFDISKとFORMATは使えないと考えて下さい。Windows98のFDISK,FORMAT場合は、32GBまでのハードディスクをフォーマットできます。Windows
NTのディスクアドミニストレータについてはよく分かりませんが、NT4.0 SP3以降を必要とするかも知れません。
・新品のハードディスクを使う場合は、Windows9xの場合、FDISKから 始めてかまいませんが、IDEハードディスクの場合、もっとも起動優先順位の高いポート(普通はプライマリマスタ)以外のポートにつながっている場合は、Windows95のFDISKではIPLコードが作成されない場合があるようです(Windows98のFDISKならば大丈夫らしい)。
そのような場合は FDISKの前に、DISKINITプログラムを走らせる必要があります(注:2000年の古い情報、2020年現在ではIPL_MENUを推奨)。よくわからない場合は、念のためDISKINITをしておくようにしたほうがよいでしょう。 なおDISKINITの終了までには、2時間くらいかかる場合がありますので、ハングアップと勘違いしないようにして下さい。しかし一晩たってもおわらないような場合は、ドライブに大量の不良箇所がある可能性があります。DISKINITを使用する際は、「ドライブ番号」を間違えないようにしてください。接続内容によって番号は変わります。
・PC/ATにつないでいたIDE HDDを98につなぐ場合、PC/AT用のIPLコードが災いして、つないだだけでマシンが起動できなくなることがかなりの確率であります。基本的にはPC/AT側で完全消去しておくべきです。それができなかった場合は、まずWindows9xまたはMS-DOS6.2の起動ディスクを用意して、フロッピーで起動させる必要があります。それでも起動できないときは、別途起動可能なハードディスクドライブがあるのならば(SCSIまたはIDE)、SCSIの場合には、メモリスイッチの「BOOT装置」のところを「SCSI固定ディスク」に設定した上で、一旦電源を切り、当該のPC/AT由来のHDDを接続します。こうすると、次回起動時には、最初に読むIPLコードはSCSIのドライブのものになるので、とりあえずシステムは起動できます。その後、PC/AT由来のドライブに対して「DISKINIT」をかけて(注:古い情報、現在ではIPL_MENUで)、以前の余計な情報を消しておきます。
<2020.3補記> PC/ATで使用していたディスクドライブを中身そのままに98で認識させたい場合は、PC/AT上で事前にPC98CNV -Nを適用するのが望ましいです。何もせずPC-98に持ってきてしまうと上記のようなブートの不都合が起こります。
起動可能なドライブがIDEの場合は、それをプライマリマスタにつなぎ、PC/AT由来のドライブはそれ以外の所に接続して起動して下さい。
UIDE-xxのBIOSには、ブートレコードあるいは全体を消去する機能がありますので、これを使うという手もあります。が、DISKINITと違って、98用の起動可能なIPLは書かれない点に注意する必要があります(普通はその後最初にFDISKした時点で書かれます)。
・他社製フォーマッタ(例えばメルコのDiskFormatterなど)では、OS起動可能なIPLコードが作成されません。起動可能にするには、FDISKまたはDISKINITからやり直さないといけないので、最初のパーティションを確保する際に使用することはお勧めできません。また、これで作ったパーティションをWindows9xやDOSで起動可能にするには、SYSコマンドを使用するか、DOSの場合FORMAT /h実行時にシステム転送を選択する必要もあります。
註)メモリスイッチの設定法(ソフトウェアディップスイッチと混同しないように!)
まず、HELP押し起動をして、ソフトウェアディップスイッチを出現させます。そしてメモリスイッチの項目を出します。これが「初期化する」になっているとダメなので、「保持する」ほうにします。再起動してから、MS-DOSまたはWindows9xを立ち上げて、それにある
SWITCH.EXEコマンド を起動します。このメニューの中に、ブート装置の選択メニューがあります。
作成2001年7月、改訂2020-2-27 まりも(DOSsoft)