JTAG ICE
JTAG ICEと言われるたびに、JTAGデバッガってあのデバイス自体は通信してるだけだから、InCircuitでもEmulatorでもないよねとか言うのだけど、
http://www.ss-technologies.co.jp/service/products/index.html
http://www.kmckk.co.jp/jet/index.html
その筋の専門家達がJTAG ICEと呼んでるから間違ってるのは僕のほうなのだった。
以下に、JTAG ICEがJTAG ICEであるという僕なりの解釈について書く。
まず、JTAGデバッガなんて使わないという人のために簡単にJTAGの仕組みについて書こう…と思ったが、全然詳しくないのであまり信用しないでね。
JTAGは実際にはレジスタがいくつか見えてるシリアルのプロトコル、であって、実際にはただの通信プロトコルである。
この通信を使って何をどのレジスタに書けば何が起こるかという詳細までは決まってないので、各CPUメーカーがそこらへんを拡張してブレーク貼ったりできるようにしてる。
どういうコマンドがあるかはあんま公開されてないが、ARM7TDMIはマニュアルに書いてある(らしい http://optimize.ath.cx/ARM7/debug.htm)
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0210c/DDI0210B.pdf の Appendix Bあたり。
そういうわけで、USBでJTAG ICE(と呼ばれる物体)を繋いで、Windows上のデバッガからプログラムをbreakすると、大体以下のようなことが起こる。
- デバッガがドライバインターフェースを使ってUSB経由でbreakに対応するなんらかのコマンドをJTAG ICEに送る
- JTAG ICEがそのコマンドをCPUのJTAGインターフェースに対応する信号に変換してCPUに送ってCPUのJTAG上のレジスタを書きかえる
- レジスタの書き換えに応じてCPUがブレークする
なので、JTAG ICE(と呼ばれる物体)は、実際にはプロトコルの変換しかやってなくて、「USBシリアル変換」みたいなノリで、「USB JTAG変換」とでも呼ぶべき物体であった。
では、何故これを「JTAG ICE」と呼ぶか、という本題に入ろう。
まずは、"ICE"、の部分。
JTAG ICEを使ったデバッグでは、実際にプログラムを実行しているのは、CPU本体であって、実際には何もエミュレートしていない(実装によってはデバッガ側でエミュレートしてるのもありそうだが)。
つまり、"In Circuit Emulator" というより、"In Circuit 実機"とでも呼ぶべきであろう。
いや呼ぶべきだ。
(完)
だが、ちょっと待ってほしい。実機とエミュレータの違いは何であるかを、はっきりと説明できる人はいるだろうか。実際、よく考えると、実機とエミュレータの違いは非常に曖昧である。
実機
- RAM上にある命令をデコードする
- デコード結果と、なんらかのCPU仕様とを照らしあわせ、それに対応した動作を行う
- RAM上にある命令をデコードする
- デコード結果と、なんらかのCPU仕様とを照らしあわせ、それに対応した動作を行う
ソフトウェアとハードウェア実装の違い、というのもあるが、それも明確な区別は無い。マイクロコードを使って、ハードウェア内でソフトウェア的な処理を行なったり、IA32ELやGodsonのようにソフトエミュレーションを支援するハードウェアを積んだCPUもある。
つまり、実機とエミュレータは同じようなものと考えるべきではないか。そう考えれば、実機も、一種のエミュレータと考えられるだろう。
仕様に完璧に従った理想CPUがあると考え、それをハードウェアで高速にエミュレートしたものを、我々は「実機」と呼んでいるにすぎないのである。CPUのエラッタというのは、「本来なら理想CPUの動作を完全にエミュレートすべきでしたが、ハードウェアエミュレータの実装に問題があり、一部完全なエミュレーションを実現できませんでした」というように、まあ、なんか、そんな解釈をすれば、色々と捗るのではないか。
つまり、ICE = In Circuit Emulator というのは、回路(ハードウェア)で実現したエミュレータであって、つまり世の中のすべてのCPUはICEだったというわけである。
はー納得。これで疑問は半分解決した。
続いて、なぜ、あのプロトコル変換してるだけの物体を、「JTAG ICE」と呼ぶか、という問題だが、これは、「テレビ」や「ラジオ」を考えれば納得できるのではないだろうか。
「テレビ」や「ラジオ」は、主に、ブロードキャストするための仕組み全般をいうのであって、いわゆる家電の「テレビ」や「ラジオ」は、その一部でしかない。しかし、あれをわざわざ「テレビ放送受信機」や、「ラジオ波受信機」とか呼ぶ人は、あんまいないだろう。
つまり、われわれ人間は、一番近いインターフェース部分を「それ全体」と認識してしまう傾向があって、まあ、僕も小さいころは、ディスプレイをパソコンだと思っていたし、まあ、そういう傾向はあると言える。
こう考えると、
- In Circuit Emulator と、それと通信するJTAGプロトコルがあり、
- それらを使ったデバッグ技術を「JTAG ICE デバッグ」と呼び、
- 「USB JTAG変換」が「JTAG ICE デバッグ」のインターフェースとして存在し、
- 人間はインターフェースをそれ全体と認識してしまう
- つまり、「USB JTAG 変換」は、「JTAG ICE デバッガ」だ!!
というように考えてもよいのではないだろうか。