Intel 80386

概要

1985年の発表当初の名称はIntel 80386であった。80386専用の数値演算コプロセッサには80387がある。仕様上は80287も接続できるが、そのためにはマシンが80287に対応する様に設計されている必要がある。
1988年に80386SX（SXはSingle-word eXternal、つまり16ビット外部バスを意味する） が80386シリーズに加わった際に、従来の32ビット外部バスのプロセッサには区別するためにDXをつけてIntel 80386DX（DXはDouble-word eXternal、つまり32ビット外部バスを意味する）と改名した。
また、インテルが80386からセカンドソースを廃止したため、Am386などの互換プロセッサが出現し、その対策もありi386DXと呼ばれるようになった（数字だけでは商標として登録・保護できないため）。
ごく初期の製品では32ビット演算が正しく行われない、仮想86モードが動作しないという不具合があったが、当初はMS-DOSなどのソフトウェアが主流であり、80286と同様に主として高速な8086/V30として使われていたために32ビット機能を使えなくても重大な支障はなかった。PC-9800シリーズ初の32ビット機「PC-98XL²」に採用された例では、32ビット機能がオプション扱いになっており、「機能拡張プロセッサ」を購入してCPUを交換することで32ビット機能を提供する仕様だが、機能拡張プロセッサは不具合が修正された80386そのものである。
80386で採用された32ビット命令セットや仮想86モードはやがて多くのオペレーティングシステム (OS) で徐々に使われるようになっていった。また、Unix系OSであるBSDが移植されて386BSDとなり、Linuxの開発も80386上で開始された。

機能

プロテクトモードとリアルモードの二つの異なる動作モードを備える。80286ではいったんプロテクトモードに入るとリアルモードに戻すにはリセットが必要であったのに対し、80386ではリアルモードとプロテクトモードを行き来することができる。また、プロテクトモード上で複数の8086を仮想的に動作させる仮想86モードが追加された。
汎用レジスタは32ビットに拡張された。32ビットレジスタはEAX、ESIのように従来の16ビットレジスタ名に「E」をつけて呼ばれる。従来の16ビットレジスタに上位16ビットを拡張した形で用意されており、下位16ビットは従来通りの16ビット/8ビットレジスタとしてもアクセス出来る。上位16ビットのみを独立した16ビットレジスタとして使用することは出来ない。
セグメントレジスタは従来のCS、DS、ES、SSの４個にFS、GSが追加された。プロテクトモード上ではセグメントレジスタは単にセグメントアドレスを格納するのではなく、メモリ上のセグメントディスクプリタを指すためのセレクタとなっており、レジスタサイズは16ビットのままである。
既存の命令が32ビット演算に対応したほか、多くの新命令が追加された。レジスタの直交性が増し、従来「AX は演算用」「SI、DIはメモリ操作用」など用途別に対応命令が細かく分化していたEAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI合計8個の「汎用レジスタ」がほぼ均等に扱えるようになり、コンパイラ言語への対応が容易になった。
レジスタ及び命令の拡張はCPUのモードとは独立したもので、プロテクトモード・リアルモードの別なく使用可能である。従って、リアルモードでも32ビットプロセッサとして動作し32ビット幅のレジスタやデータを扱えるが、64KBを超えるアクセスを実行すると一般保護例外が発生する。
また、ハードウエアによるデバッグ支援機能が追加され、DR0からDR7のデバッグレジスタを備える。
32ビット化に併せて論理・物理アドレス空間も4GB（32ビット）に拡張され、セグメントサイズも最大4GBに拡張された。従って、セグメント機構の無いプロセッサ同様のフラットメモリモデル(リニアメモリモデル)で全メモリ空間が使用可能である。また可変長のセグメントに加えて固定長のページ単位によるメモリ管理も追加され、近代的なOSの実装が容易になった。

アーキテクチャ

x86アーキテクチャCPUとしては、複数の並列ステージ（Intel386 では6 ステージ）を持つ最初のインテル・アーキテクチャ・プロセッサとなった（初めての「パイプライン」ではないことに注意。80286は80386と同じ4段パイプライン構成）。80386のパイプラインは4段で構成されている。命令の実行は全てマイクロコードで実現されており、複数サイクルの時間を要する。また、複雑な命令の場合はデコードで所要サイクルが増加した。

80386の判別

80386では後のCPUID命令と同様のプロセッサ・シグニチャという概念が導入されたものの、まだCPUID命令そのものは無く、インテルはフラグレジスタを使ったCPU判別方法を紹介している。
80386と80486以降を区別する方法としては、80486で追加されたACビットの存在が利用できる。PUSHFDとPOPFDで読み書きできる32ビット分のフラグのうち第18ビットが該当し、これを変更できれば80486以上、変更できなければ80386系のCPUであると判断できる。ただし32ビット分のフラグレジスタへのアクセス命令は16ビットCPUには存在しないので、これに先立ち80286以前か80386以降かをあらかじめ判別しておく必要がある（詳細はIntel 80286を参照）。
またリセット直後のEDXレジスタには、後のCPUIDのEAX=1に相当するCPUの識別情報（プロセッサ・シグニチャ）が格納されるようになったため、これが利用できる状況ならばそれを使うこともできる（CPUIDも参照）。ただし80386のプロセッサ・シグニチャは80486以降やCPUID命令とは定義に少々違いがあり、80386ではプロセッサタイプが4ビット分使われている。ファミリは4ビットで同じだが、モデル番号に相当する4ビットはメジャー・ステッピングと呼ばれ、ステッピングIDに相当する4ビットはマイナー・ステッピングと呼ばれる。なお上位16ビットはすべて予約ビットとなっており、拡張ファミリと拡張モデルは利用できない。

80386SX

開発コード名P9。命令セットは80386と互換性があるが、外部アドレス幅を24ビット (16MB)、外部データバスを16ビット幅に縮小し、システム(システム基板、メモリを含む）のトータル的なコストダウンと、既存の80286搭載パーソナルコンピュータ (PC) をほとんど仕様変更せずにCPU換装を可能として、当時急速にシェアを拡大しつつあったAMDなどのセカンドソース版80286、特にIntelが提供していなかった16MHz版Am80286などの高クロック周波数動作対応モデルを市場から駆逐することを念頭に置いて設計されたCPUである。
特にメモリのバス幅が狭いことからプロテクトモードの利用は性能の低下が激しかったが、それでもこのCPUを採用することで、PCメーカーは従来の80286マシンをわずかな手直しを施すだけで「32ビットマシン」として販売することが可能となり、またユーザー側にもMicrosoft Windows 3.1（日本語版）の動作が可能になる、あるいは後述するようにDOS環境でも1MB以上のメモリ空間にマッピングされるプロテクトモード対応増設メモリ（XMSメモリ）を仮想86モードの下でEMSメモリとして割り当てて使用可能となるなど、80286使用時と比較してメモリ利用の自由度が上がるというメリットがあったため、一時は広く普及した。

80386SL

80386SXをベースに、システムマネジメントモードを追加し、サスペンドやレジューム機能などに対応させたCPU。現在のモバイル用CPUの先駆けといえる。また、日本電気がインテルに発注して製造された、PC-9800シリーズアーキテクチャ専用のCPU、80386SL (98) もある。80386SL (98) にはi386SLロゴの下にPC-98ロゴも入っており、PC9800 NECと打刻されている。通常版にはPC9800 NECの代わりにISAと打刻されている。

80376

80376は、組込機器用のマイクロコントローラである。80386SXに基づいているものの、リアルモードを実装しておらず、ブート時からプロテクトモードで動作する。

80386EX

80386EXは、フルスタティック設計の80386SXコアとした組込機器用のマイクロコントローラ。クロック、システムマネージメント、タイマーカウンター、ウォッチドッグタイマー、同期/非同期シリアル入出力、パラレル入出力、DMAコントローラ、DRAMリフレッシュ、JTAG検査ロジックなどの周辺回路を混載し、フットプリントと消費電力とコストの低減を図っている。

IBM 386SLC

386SL(386SX)ベースのIBM改良版。内部32ビット、外部データバス16ビットのまま、内蔵キャッシュ8Kを搭載。IBM PS/2 などに搭載。インテルは80386からセカンドソースを廃止したが、IBMはインテルとの提携により、80486までは製造ライセンスを持っていた。名称の「C」はCacheの略とも言われる。

IBM 386SLC2

IBM 386SLCのダブルクロック版。例えば386SLC2-50/25は、ベースクロック25MHz、内部クロック50MHzで稼働する。PS/Vなどに搭載。

IBM 486SLC

IBM 386SLCの改良版。内蔵キャッシュ16Kを搭載。内部32ビット、外部データバス16ビットのまま、内蔵キャッシュ16Kにより486SXと同レベルの性能を実現。ThinkPadなどに搭載。名称より「486SXのIBM改良版」との誤解が多いが、コアは386SL (386SX) ベースである。

IBM 486SLC2

IBM 486SLCのダブルクロック版。内部32ビット、外部データバス16ビット、ダブルクロックのまま、内蔵キャッシュ16Kを搭載。PS/V、ThinkPadなどに搭載。

影響

32ビットCPUとして登場したものの、当初のPC市場にはその機能を活用できるOSは存在しておらず、単に高速なx86CPUとして、主にMS-DOS環境で使われる場合が多かった。
その後、80386のアーキテクチャを前提として新たに開発された32ビットOSとして、OS/2 2.0やWindows NTが市場に登場するが、その頃には既に80486が登場しており、80386は下位機種向けで外部16ビットバスの386SXが主流となりつつあった。外部16ビットのシステムで32ビットOSを動かすには力不足が明白であり、結果的により高速なIntel 486やPentiumプロセッサがその後を受け継ぐこととなった。

MS-DOS

MS-DOS環境における利点は、メモリマネージャとよばれるソフト（EMM386.EXE等）によって仮想86モードへと移行し、高速・広帯域のプロテクトメモリを転用してEMSメモリをハードウェアEMSと同等、またはそれ以上の性能で実現できたことである。しかしこれも本来の80386の機能・スペックからすると中途半端な使い方であり、80386本来の機能を活かし切るには程遠いものであった。
また仮想86モードの使用はI/Oアクセスなどの際にトラップを発生させ、その処理と復帰に数十サイクル程度の時間を要するため、25MHzや33MHzの80386であっても、処理によっては12MHzの80286と大差ない状況や、場合によってはむしろ劣るといった状況をも招いてしまうこともあった。ただし、通常の演算処理やメモリ操作に関しては、CPUおよびメモリの駆動クロックの差が実効性能に反映されるため、これは都合の悪い処理をピンポイント的に繰り返した際の話にすぎない。

UNIX

80386搭載PCは「高額」とは言っても、当時隆盛していたRISCワークステーション等よりは大幅に安価であったため、より大規模なシステムで利用されていたUNIXなどの32ビットOS環境をこれら安価なパーソナルコンピュータに移植する試みが、80386の登場によって始められた。1988年には当時既にSPARCプロセッサを搭載するSUN-4を製造販売していたサン・マイクロシステムズがSUN386iと称する、SUN OS 4.0の386対応版を搭載するワークステーションを発表し、低価格であるだけでなく、当時のSPARC搭載機では困難であった、MS-DOS環境とSUN OS環境の共存を制限付きながら可能とするなど、当時のRISCプロセッサ搭載機にはない新しい機能についての提案を行った。その後、386BSD（後のFreeBSDおよびNetBSD）やLinuxなど、今日の代表的なPC-UNIX系環境の移植やビルドが始められたが、その理由や動機は、80386の登場によってパーソナルコンピュータがこれらの近代的な32ビットオペレーティングシステム環境を実現するだけの機能や性能を持ちえるに至ったからに他ならない。

その後の状況

80386で実装された32ビット命令（のちのIA-32命令）は、登場から30年以上が経過したが、上位互換を保ったCPUがインテルから提供され続けている他、AMD、VIAが発売しているx86系のさまざまな互換CPUにおいても継承され続けており、ほとんどのパーソナルコンピュータと多くのサーバで採用され続けている。80386の命令アーキテクチャは、組み込みシステムで圧倒的なシェアを誇るARMアーキテクチャと並び、これまでに最も普及した命令アーキテクチャと言える。80386以降のIA-32プロセッサでは基本命令の追加はあまりなく、MMX、SSE、SSE2、SSE3などのSIMD命令の追加が主であった。