Intel 80386 (またはi386 )はインテル の32ビット マイクロプロセッサ (CPU ) である。1985年 10月 に発表され、x86 アーキテクチャを32ビットに拡張し、レジスタ を強化した。インテルが現在使用している名称はIntel386TM プロセッサ (Intel386TM Processor ) である。互換CPUにも386の型番が付くものがある。
後にIA-32 と呼ばれる、インテルの32ビットCPUのベースとなる命令セット アーキテクチャ は、このCPUで確定した。アーキテクチャとしてのi386 については、x86 およびIA-32 の項目も参照のこと。
概要
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[ 注 1] として使われていたために32ビット機能を使えなくても重大な支障はなかった。PC-9800シリーズ 初の32ビット機「PC-98XL2 」に採用された例では、32ビット機能がオプション扱いになっており、「機能拡張プロセッサ」を購入してCPUを交換することで32ビット機能を提供する仕様だが、機能拡張プロセッサは不具合が修正された80386そのものである。
80386で採用された32ビット命令セットや仮想86モードはやがて多くのオペレーティングシステム (OS) で徐々に使われるようになっていった。また、Unix系 OSであるBSD が移植されて386BSD となり、Linux の開発も80386上で開始された。
特徴
機能
80386DXの内部ブロック図
プロテクトモード とリアルモード の二つの異なる動作モードを備える。80286 ではいったんプロテクトモードに入るとリアルモードに戻すにはリセットが必要であったのに対し、80386ではリアルモードとプロテクトモードを行き来することができる。また、プロテクトモード上で複数の8086 を仮想的に動作させる仮想86モード が追加された。
汎用レジスタは32ビットに拡張された。32ビットレジスタはEAX、ESIのように従来の16ビットレジスタ名に「E」をつけて呼ばれる。従来の16ビットレジスタに上位16ビットを拡張した形で用意されており、下位16ビットは従来通りの16ビット/8ビットレジスタとしてもアクセス出来る。上位16ビットのみを独立した16ビットレジスタとして使用することは出来ない。
セグメント レジスタは従来のCS、DS、ES、SSの4個にFS、GSが追加された。プロテクトモード上ではセグメントレジスタは単にセグメントアドレスを格納するのではなく、メモリ上のセグメントディスクプリタを指すためのセレクタ[ 注 2] となっており、レジスタサイズは16ビットのままである。オフセットアドレスは従来と同じく「ベース」、「インデックス」、「符号付き定数」の3項目の任意の組み合わせで記述するが、32bitの汎用レジスタ[ 注 3] を用いて記述する場合には必要に応じてインデックス側に*1
、*2
、*4
、*8
のいずれかの掛け算(スケールファクタ)も記述できるようになった。
既存の命令が32ビット演算に対応したほか、多くの新命令が追加された。レジスタの直交性 が増し、従来「AX は演算用」「SI、DIはメモリ操作用」など用途別に対応命令が細かく分化していたEAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI合計8個の「汎用レジスタ」がほぼ均等に扱えるようになり、コンパイラ 言語への対応が容易になった。
レジスタ及び命令の拡張はCPUのモードとは独立したもので、プロテクトモード・リアルモードの別なく使用可能である。従って、リアルモードでも32ビットプロセッサとして動作し32ビット幅のレジスタやデータを扱えるが、64KBを超えるアクセスを実行すると一般保護例外が発生する。[ 注 4]
フラグレジスタも32ビットに拡張する形で新たなフラグが設けられた。第16ビットは RF (Resume flag) と呼ばれ、デバッグフォールトの発生を制御する。第17ビットは VM (Virtual 8086 mode)で、このビットが立つことにより仮想86モードに移行する。
従来のMSW (Machine status word)レジスタも拡張され、CR0 - CR3というコントロールレジスタ4個が設けられた。それぞれ32ビットで、CR0の下位16ビットがMSWそのものである。386で追加されたフラグはCR0の第4ビットのET (Extension type)フラグと末尾31ビットのPG (Paging enable)である。前者は80387が存在するとセットされ、後者をセットするとページング が有効になる。CR1は予約されており使用できない。CR2とCR3はページングに使われる[ 注 5] 。CR2はページング有効時にページフォールトが発生したときにそのアドレスが格納される。CR3の上位20ビットはページングで使用するページディレクトリのアドレス上位20ビットすなわちベースアドレスを記録する。
また、ハードウエアによるデバッグ支援機能が追加され、DR0からDR7のデバッグレジスタを備える[ 注 6] 。
さらにTLB(トランスレーション・ルックアサイド・バッファ)をテストするテストレジスタTR6-TR7が設けられた[ 注 7] 。
32ビット化に併せて論理・物理アドレス空間 も4GB(32ビット)に拡張され、セグメントサイズも最大4GBに拡張された。従って、セグメント機構の無いプロセッサ同様のフラットメモリモデル(リニアメモリモデル)で全メモリ空間が使用可能である。また可変長のセグメントに加えて固定長のページ 単位によるメモリ管理 も追加され、近代的なOSの実装が容易になった。
アーキテクチャ
x86 アーキテクチャCPUとしては、複数の並列ステージ(Intel386 では6 ステージ)を持つ最初のインテル・アーキテクチャ・プロセッサとなった(初めての「パイプライン」ではないことに注意[ 1] 。80286は80386と同じ4段パイプライン構成[ 注 8] )。80386のパイプラインは4段で構成されている。命令の実行は全てマイクロコード で実現されており、複数サイクルの時間を要する。また、複雑な命令の場合はデコードで所要サイクルが増加した。
80386の判別
80386では後のCPUID 命令と同様のプロセッサ・シグニチャという概念が導入されたものの、まだCPUID命令そのものは無く、インテルはフラグレジスタ を使ったCPU判別方法を紹介している[ 2] 。
80386と80486以降を区別する方法としては、80486で追加されたACビットの存在が利用できる。PUSHFD
とPOPFD
で読み書きできる32ビット分のフラグのうち第18ビットが該当し、これを変更できれば80486以上、変更できなければ80386系のCPUであると判断できる。ただし32ビット分のフラグレジスタへのアクセス命令は16ビットCPUには存在しないので、これに先立ち80286以前か80386以降かをあらかじめ判別しておく必要がある(詳細はIntel 80286 を参照)。
またリセット直後のEDXレジスタには、後のCPUIDのEAX=1に相当するCPUの識別情報(プロセッサ・シグネチャ)が格納されるようになったため、これが利用できる状況[ 注 9] ならばそれを使うこともできる(CPUID も参照)。ただし80386のプロセッサ・シグニチャは80486以降やCPUID命令とは定義に少々違いがあり、80386ではプロセッサタイプが4ビット分使われている。ファミリは4ビットで同じだが、モデル番号に相当する4ビットはメジャー・ステッピングと呼ばれ、ステッピングIDに相当する4ビットはマイナー・ステッピングと呼ばれる。なお上位16ビットはすべて予約ビットとなっており、拡張ファミリと拡張モデルは利用できない。
追加命令一覧
システム命令
新たに追加されたコントロールレジスタ (CR0-3)・テストレジスタ (TR6-7)・デバッグレジスタ (DR0-7) のシステムレジスタはニーモニック上はMOV
命令でデータ交換する書式ではあるが、当然ながら内部的には新規のシステム命令である。
既存命令の32ビット版に相当する一般命令
既存命令と同様の機能で、32ビットのデータや32ビットレジスタを扱うものを挙げる。以下のほか、実質的な追加命令として条件ジャンプ命令が一新されており、16ビットや32ビットのアドレス属性を扱えるコードが新たに用意された。
CDQ (Convert doubleword to qwadword)
CMPSD (Compare string double word)
CWDE (Convert word to doubleword extended)
INSD (Input string double word)
IRETD (Interrupt return using EIP)
JECXZ (Jump if ECX is zero)
LODSD (Load string double word)
MOVSD (Move string double word)
OUTSD (Output string double word)
POPAD (Pop all general doubleword registers)
POPFD (Pop extended flags off stack)
PUSHAD (Push all general doubleword registers)
PUSHFD (Push extended flags onto stack)
SCASD (Scan string double word)
STOSD (Store string double word)
その他の一般命令
ビットをテストする命令群が6個追加された。
アドレス(セグメント・オフセット)をロードする命令には、新たにSS・FS・GSのセグメントレジスタに対応したものが用意された。
データのビット長を拡張する命令および、シフト命令について、結果を別のレジスタに保存できる命令が新たに追加された。
条件SET命令は各種の条件ジャンプ命令の冒頭の"J"の部分を"SET"にそれぞれ置き換えたニーモニック表記の命令群で、条件が合致した際にはジャンプする代わりに、判定結果を指定されたレジスタやメモリに保存するだけの動作となる。
BSF (Bit scan forward)
BSR (Bit scan reverse)
BT (Bit test)
BTC (Bit test and complement)
BTR (Bit test and reset)
BTS (Bit test and set)
LFS (Load pointer using FS)
LGS (Load pointer using GS)
LSS (Load pointer using SS)
MOVSX (Move with sign extend)
MOVZX (Move with zero extend)
SHLD (Double precision shift left)
SHRD (Double precision shift right)
条件SET (Byte set on condition)
非公開命令
ICE が接続されている状態でこの命令を実行すると、ICE側のプログラムに制御が移る。ICEが接続されていない状態ではシングルステップ割込みINT 1を実行する[ 4] 。のちにINT1(オペコードはF1)として公開された。
ICE側のメモリとデバッグターゲット側のメモリ間の転送命令である[ 4] 。
ICE側でこの命令を実行するとICEBP実行時点のレジスタの状態をすべてもどしてデバッグターゲット側でのプログラムの実行に戻る。また、ICEとは関係ないがLOADALLを使用するとリアルモードのままで、プロテクトメモリを含む4Gバイトのメモリにアクセス可能となる。ただし、80386以降ではUnreal mode を使用すればLOADALLを使用しなくともリアルモードのままで4Gバイトのメモリにアクセス可能である。
その他の80386シリーズ
80386SX
i386SX(外部から機能を停止できるC STEP)
開発コード名P9。命令セットは80386と互換性があるが、外部アドレス幅を24ビット (16MB)、外部データバス を16ビット 幅に縮小し、システム(システム基板、メモリを含む)のトータル的なコストダウンと、既存の80286搭載パーソナルコンピュータ (PC) をほとんど仕様変更せずにCPU換装を可能として、当時急速にシェアを拡大しつつあったAMD などのセカンドソース 版80286、特にIntelが提供していなかった16MHz版Am80286 などの高クロック周波数動作対応モデルを市場から駆逐することを念頭に置いて設計されたCPUである。
特にメモリのバス幅が狭いことからプロテクトモードの利用は性能の低下が激しかったが[ 5] 、それでもこのCPUを採用することで、PCメーカーは従来の80286 マシンをわずかな手直しを施すだけで「32ビットマシン」として販売することが可能となり、またユーザー側にもMicrosoft Windows 3.1 (日本語版)の動作が可能になる、あるいは後述するようにDOS環境でも1MB以上のメモリ空間にマッピングされるプロテクトモード対応増設メモリ(XMS メモリ)を仮想86モードの下でEMS メモリとして割り当てて使用可能となるなど、80286使用時と比較してメモリ利用の自由度が上がるというメリットがあったため、一時は広く普及した。
80386SL
i386SL(PQFPパッケージ)
80386SXをベースに、システムマネジメントモード を追加し、サスペンドやレジューム機能などに対応させたCPU。現在のモバイル用CPUの先駆けといえる。また、日本電気 がインテル に発注して製造された、PC-9800シリーズ アーキテクチャ専用のCPU、80386SL (98) もある。80386SL (98) にはi386SLロゴの下にPC-98ロゴも入っており、PC9800 NECと打刻されている。通常版にはPC9800 NECの代わりにISAと打刻されている。
80376
80376 (英語版 ) は、組込機器用のマイクロコントローラ である。80386SXに基づいているものの、リアルモード を実装しておらず、ブート時からプロテクトモード で動作する。[ 6]
80386EX
80386EX (英語版 ) は、フルスタティック設計の80386SXコアとした組込機器用のマイクロコントローラ 。クロック、システムマネージメント、タイマーカウンター、ウォッチドッグタイマー 、同期/非同期シリアル 入出力、パラレル入出力、DMA コントローラ、DRAM リフレッシュ、JTAG 検査ロジックなどの周辺回路を混載し、フットプリントと消費電力とコストの低減を図っている。[ 7]
RapidCAD
80386ピン互換の486DX相当プロセッサだが、プロセッサ・シグネチャは386系を示すx3xx (0340) を返す[ 3] 。FPU内蔵のため、数値演算コプロセッサのソケットにはダミーを挿して使う[ 8] 。
IBM製
Intel製80386には存在しない独自のCPUキャッシュを搭載した。また、RDMSR
・WRMSR
命令が実装されていた[ 9] 。
IBM 386SLC
386SL (386SX) ベースのIBM 改良版。内部32ビット、外部データバス16ビットのまま、内蔵キャッシュ8Kを搭載。IBM PS/2 などに搭載。インテル は80386からセカンドソース を廃止したが、IBMはインテルとの提携により、80486 までは製造ライセンスを持っていた。名称の「C」はCacheの略とも言われる。
IBM 486SLC
IBM 386SLCの改良版。内蔵キャッシュ16Kを搭載。内部32ビット、外部データバス16ビットのまま、内蔵キャッシュ16Kにより486SXと同レベルの性能を実現。ThinkPad などに搭載。名称こそ486SXに類似するものの、486SXのIBM改良版ではなく、コアは386SL (386SX) ベース である。
IBM 486SLC2
IBM 486SLCのダブルクロック版。内部32ビット、外部データバス16ビット、ダブルクロックのまま、内蔵キャッシュ16Kを搭載。PS/V 、ThinkPad などに搭載。比較的後年までCPUアクセラレータ にも使われた。サードパーティではSusTeen のWinMasterシリーズの一部の下位機種に搭載されたことがある[ 10] 。
Blue Lightning
IBM486SLCシリーズの32ビット版に相当する製品群の通称。いくつかの種類があり、最大で3倍速のものも登場した。製品によって386DXベースとも486SLベースとも言われる[ 11] 。
影響
32ビットCPUとして登場したものの、当初のPC市場にはその機能を活用できるOSは存在しておらず、単に高速なx86 CPUとして、主に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およびメモリの駆動クロックの差が実効性能に反映されるため、これは都合の悪い処理をピンポイント的に繰り返した際の話にすぎない。
Microsoft Windowsなど
80386用に改良されたOSとして以下が登場した。
Microsoft Windows (Windows)
Windows386 2.1 (リアルモード用16ビットアプリケーション を前提とした16ビットOSだが、OS自体は80386のプロテクトモードを活用するようになった)
Windows 3.0 (80286相当のプロテクトモードに対応した16ビットアプリケーションを前提とした16ビットOSであるが、OS自体はエンハンスドモード動作時に32ビットの仮想86モードを活用している)
Windows NT (OS自体を32ビット化)
OS/2
OS/2 2.0 (OS自体を32ビット化。MVDMに仮想86モード を使用する)
NetWare
NetWare386 (MS-DOS から起動し、80386のプロテクトモードを使用できる)
TownsOS
富士通FM TOWNS用(MS-DOSにDOSエクステンダを組み合わせたもの。80386のプロテクトモードを使用。4GBリニアな論理アドレス空間を活かしたマルチメディアデータの取り扱いを可能にした)
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ビットオペレーティングシステム環境を実現するだけの機能や性能を持ちえるに至ったからに他ならない。2000年代 末にはWindows がOS市場の殆どを占めたことに加え、PC-UNIX が伝統的なUNIX と同等の機能と信頼性を備えたことで、80386から始まったIA-32 を利用した方が圧倒的にコストパフォーマンスが高くなったため、ハイエンド用途やレガシーソフトウェアの利用を除いてIA-32 がSPARC を駆逐するにまで至っている。
その後の状況
80386で実装された32ビット命令(のちのIA-32 命令)は、登場から30年以上が経過したが、上位互換を保ったCPUがインテルから提供され続けている他、AMD 、VIA が発売しているx86系のさまざまな互換CPUにおいても継承され続けており、多くのパーソナルコンピュータと多くのサーバで採用され続けている。80386の命令アーキテクチャは、ARMアーキテクチャ と並び、これまでに最も普及した命令アーキテクチャと言える。80386以降のIA-32 プロセッサでは基本命令の追加はあまりなく、MMX 、SSE 、SSE2、SSE3などのSIMD 命令の追加が主であった。
脚注
注釈
^ ただし、同一クロック周波数・どちらもリアルモードでも386より286の方が高速である。386をプロテクトモードにすると(MS-DOSで使っていても拡張メモリマネージャを使うためにはその必要がある)さらにその差は開く。そのためかインテルは16MHz以上の286を出さなかった。逆に286のセカンドソーサや286互換CPUメーカーは、16MHz以上、果てはメーカーによっては25MHzという高速の286を製造・販売した。
^ セグメント方式#x86 を参照。
^ ただしスタックポインタ(ESP)はインデックスとして使用できない。
^ 64KBを超えるアクセスには予めセグメントリミットの変更が必要。リアルモード を参照。
^ 80486以降はCR3の下位ビットに新たなフラグも設定された。
^ うち2本は予約されているのみで、機能は無い。
^ なお80486ではさらにTR3-TR5が追加されている。
^ 詳細はen:Intel_80286 を参照。
^ 例えば80286用に作られたソフトウェアがプロテクトモードからリアルモードに戻るときの外部ハードウェア機構を利用することで、CPUをリセットしつつも、OSは処理を続行することができる(ただし復帰処理の際にDXレジスタが保存されるか否かは機種によって異なる)。また、PC-98ではメモリアドレス0000:0486に保存される[ 3] 。
出典
関連項目
生産終了
現行
その他 マイクロ アーキテクチャ
P5
P5ベースのコア
0.90 μm 0.60 μm 0.35 μm 0.25 μm
P6
P6ベースのコア
0.50 μm 0.35 μm 0.25 μm 180 nm 130 nm 90 nm 65 nm
NetBurst
NetBurstベースのコア
180 nm 130 nm 90 nm 65 nm
Core
Atom
Atomのマイクロアーキテクチャ
参考 45 nm 32 nm 22 nm 14 nm 10 nm Intel 7
Nehalem
Sandy Bridge
Sandy Bridgeベースのコア
32 nm 22 nm
Haswell
Skylake
Cypress Cove
Sunny Cove
Willow Cove
Golden Cove (+Gracemont)
Raptor Cove (+Gracemont)
Redwood Cove (+Crestmont)
Redwood Coveベースのコア
Intel 4 Intel 3
Lion Cove (+Skymont)