はじめに
Intel Quark microcontroller D1000(コードネーム:Silver Butte)に搭載されたプロセッサー・コア、いわゆるCPU部分については「33 MHz 32-bit Harvard architecture tailored for MCUs(さかきけい意訳:MCUに適合させた 33 MHz 32-bit ハーバード・アーキテクチャー)」であるとされており、それがIntel Quarkであるとか、IA-32やPentium互換であるといった記載がありません。なぜそうかというと、このプロセッサー・コアはIA-32ではないからです。
Intel Corporationは用途に合わせる形で、従来固守してきたIA-32ではない別種の命令セット・アーキテクチャーを生み出しました。
このメモではその内容について簡単に解説したいと思います。
IA-32とは
Intel Itanium(コードネーム「P7」)用に新たな64-bitの命令セット・アーキテクチャー(ISA)を導入した際に、これを「IA-64」と命名しました。そして、これまでのi8086で定義された命令フォーマットとその仕様を上位互換で発展させた命令セット・アーキテクチャー(ISA)のことを「IA-32」と呼びました。
IA-32といえば32-bitのアーキテクチャーであるという認識も一部でなされていますが、Intelのドキュメントではi386に到達する前の16-bitのアーキテクチャーも含めてIA-32と呼んでいます。これは、IA-64の対語としてIA-32が定義されたという事実を知っていれば、そう不思議ではないでしょう。
Intel Quark microcontroller D1000のアーキテクチャーとIA-32との差異
概要
Intel Quark microcontroller D1000のプロセッサー・コアは、IA-32ではありません。IA-32からMicrocontroller Unitとして不要と判断された部分が取り外されています。また、ハーバード・アーキテクチャーを採用し、コードとデータのバスが分離されています。コード・バスは128-bit、データ・バスは32-bitと、それぞれの用途に合わせて別のbit幅となっています。
このことからわかるように、データ・バスしか接続されていないメモリーはプログラム・コードを実行するためには使用することができません。同様に、コード・バスしか接続されていないメモリーはデータの読み書きをするためには使用することができません。
IA-32とIntel Quark microcontroller D1000で異なる点
リアル・モードとプロテクト・モードの省略
IA-32に存在するリアル・モードおよびプロテクト・モードという区分がありません。常に32-bitモードで動作します。
セグメントの省略
IA-32に存在している「セグメント」が省略されています。これによって関連するレジスターが削除されています。
ページング(MMU)の省略
i386から導入されたページングが省略されています。
コントロール・レジスターの省略
プロテクト・モードとリアル・モードといった区分の省略と、ページング(MMU)の省略に伴ってコントロール・レジスター(CRn
レジスター)が削除されています。
浮動小数点演算ユニットの省略
浮動小数点演算ユニットが省略されています。また、#ND
も予約扱いのため、ソフトウェア・エミュレーションも行えないようです。
I/Oポートの省略
IA-32の特徴の1つである、メモリー用のアドレス空間とは別に存在する「I/Oポート」が省略されています。
一部命令の省略
マイクロコードによる制御が必要になる命令と省略された機能に関する命令が省略されています。
PUSHA
POPA
XCHG
LODS
、STOS
、SCAS
、CMPS
などIN
などOUT
など
Pentium(コードネーム「P5」)までに存在した命令のうち、省略された命令の一覧を以下に閉じて列挙します:
AAD
AAM
AAS
ARPL
BOUND
BSF
BSR
CLD
CLTS
CMPSB
CMPSD
CMPSW
CMPXCHG
CMPXCHG8B
CPUID
DAA
DAS
ENTER
ESC
IN
INS
INSD
INTO
INVD
INVLPG
JCXZ
JECXZ
LAHF
LAR
LDS
LEAVE
LES
LFS, LGS
LGDT
LLDT
LMSW
LOADALL(only for 80286、80386、80486)
LODSB
LODSD
LODSW
LOOP/LOOPx
LOOPD, LOOPccD
LOOPW, LOOPccW
LSL
LSS
LTR
MOV to/from CR/DR/TR
MOVSB
MOVSD
MOVSW
OUT
OUTS
OUTSD
POPA
POPAD
PUSHA
PUSHAD
RDMSR
RDTSC
RETF
RSM
SAHF
SCASB
SCASD
SCASW
SETcc
SGDT
SLDT
SMSW
STD
STOSB
STOSD
STOSW
STR
VERR
VERW
WAIT
WBINVD
WRMSR
XADD
XCHG
XLAT
一部プリフィクスの省略
マイクロコードによる制御が必要になるプリフィクスおよび仕様の変更に伴って使用できなくなったプリフィクスが省略されています。
- アドレス・サイズ・プリフィクス
REP
/REPE
/REPZ
REPNE
/REPNZ
- セグメント・オーバーライド・プリフィクス
- 分岐ヒント・プリフィクス
また、オペランドのサイズをセグメントの設定とは逆転させるオペランド・サイズ・プリフィクスは、常時32-bit固定モードとなったため16-bit化するためのプリフィクスへと意味が変化しました。
フラグ(EFLAGS)の変更
フラグ(EFLAGS)もIA-32と比較して変更が入っています。両者を比較する表を以下に示します:
31 – 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
IA-32 | 0 | ID | VIP | VIF | AC | VM | RF | X | NT | IOPL | OF | DF | IF | TF | SF | ZF | 0 | AF | 0 | PF | 1 | CF | |
D1000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | OF | 0 | IF | TF | SF | ZF | 0 | 0 | 0 | 0 | 1 | CF |
ここからわかるようにCPUID命令は存在しない模様です(CPUID命令の存在を示すIDフラグが0固定になっています)。
割り込みベクターと例外
IA-32の割り込みベクターと例外と比較して、Intel Quark microcontroller D1000では機能が削減された分だけ予約に置き換えが行われています:
ベクター | 名称 | タイプ | エラー・コード | 内容 | |
---|---|---|---|---|---|
D1000 | IA-32 | ||||
0 | #DE | フォルト | なし | ゼロ除算 | ← |
1 | #DB | トラップ | なし | デバッグ例外 | ← |
2 | 予約 | NMI | |||
3 | #BP | トラップ | なし | ブレークポイント(INT3 ) |
← |
4 | #OF | トラップ | なし | 予約 | オーバー・フロー |
5 | #BR | フォルト | なし | 予約 | 境界 |
6 | #UD | フォルト | なし | 不正命令 | ← |
7 | #NM | フォルト | なし | 予約 | コプロセッサー非提供 |
8 | #DF | アボート | あり | ダブル・フォルト | ← |
9 | フォルト | なし | 予約 | コプロセッサー・セグメント・オーバーラン | |
10 | #TS | フォルト | なし | 予約 | 不正タスク・セグメント |
11 | #NP | フォルト | あり | Not Present | 非提供(P = 0)のセグメント |
12 | #SS | フォルト | なし | 予約 | スタック・フォルト |
13 | #GP | フォルト | あり | 一般保護例外 | ← |
14 | #PF | フォルト | なし | 予約 | ページ・フォルト |
15 | なし | Intel予約 | ← | ||
16 | #MF | フォルト | なし | 予約 | 数値フォルト |
17 | #AC | フォルト | なし | 予約 | アライメント・チェック |
18 | #MC | フォルト | あり | マシン・チェック(非IA) | マシン・チェック |
19 | #XM | フォルト | なし | 予約 | SIMD浮動小数点例外 |
20 – 31 | Intel予約 | ← | |||
32 – 255 | 割り込み | なし | 非同期割り込み要求 | - |
その他の変更
INT
命令のオペランド値が3の場合、INT3
と同様に扱います。- 割り込みディスクリプター(Interrupt Descriptor Table : IDT)の扱いが、セグメントの廃止に伴って割り込みゲートとトラップ・ゲートのみのサポートとなります。
IN
命令およびOUT
命令をサポートしない関係で、これに伴ってIO Privilege Level(IOPL)の概念もありません。入出力はMemory Mapped IO(MMIO)を使用して行わなければなりません。
IA-32とIntel Quark microcontroller D1000のレジスター・セット
これらの変更に伴ってIA-32と比較してIntel Quark microcontroller D1000では大幅にレジスターが減っています。
まずはIA-32のレジスター・セットの図を以下に示します(一部テスト系等を除く):
そして同じレイアウトのまま、Intel Quark microcontroller D1000で削減されたレジスター・セットの図を以下に示します:
この図が示すように、多くの管理用のレジスターが省略されており、全体として非常にすっきりとしています。
まとめ
このようにIntel Quark microcontroller D1000のプロセッサーは、IA-32ではありません。つまりはIntel DX4系(コードネーム「P24C」あるいは「P24D」)でも、従来のIntel Quark Core系(コードネーム「Lakemont Core」)でもありません。
Microcontroller Unitとして必要な機能を厳選してIA-32から機能を取捨選択して1から設計された新たなプロセッサーです。
ハーバード・アーキテクチャーの採用を前提とした割り切った各種仕様(I/Oポートの省略、特権制御の省略、プロテクト・モードの省略など)、マイクロコードによる実行が必要な命令の省略(PUSHAやPOPA命令などおよびREPなどの各種繰り返しプリフィクスなど)、リアルタイム制御に必ずしも必要ではないページング(MMU)の省略など、IA-32の設計思想を捨てて、MCUとして必要な構成に組み替えています。IA-32から引き継いだのは命令フォーマットのみと考えた方がわかりやすいかもしれません。
実に実用本位に振り切った設計だと感じます。
参考資料
- Intel® Quark™ Microcontroller D1000: Reference Manual
- Intel® Quark™ Microcontroller D1000: Product Brief
関連記事
更新履歴
2015年11月19日
- 一部表現を改めました。
- 省略された命令の一覧を加えました。