Debugging the Linux kernel with JTAG(翻訳)

気になる記事があったのでざっくり翻訳
JTAGを使ってのLinuxカーネルのデバッグ方法についての記事

原文はこちら
http://www.eetimes.com/design/embedded/4207333/Debugging-the-Linux-kernel-with-JTAG



JTAGによるLinuxカーネルのデバッグ

Alexander Sirotkin
8/29/2010 1:31 PM EDT

Linux関連の話題としてLinuxカーネルのトラブルシューティングのためのデバッガの使用は技術的なものだけではありません、それは政治的なものです。
Linuxは主にx86プラットフォーム上で開発されており、それはJTAGデバッグ機能を持ちません。そしてソフトウエアのみのカーネルデバッガは複雑で信頼性に欠けます。
このため、そして他の理由でLinus Torvaldsは、Ingo Molnarが2.6.26バージョンへよりスリム化したKGDBを得るために管理するまでの長い間KGDB(Linux kernel debugger)パッチをLinuxのメインツリーに包含することに反対していました。
政治的な問題はさておき、ほとんどの開発者が私に同意してくれると信じます、そう少なくとも組み込みの世界においてはカーネルデバッガは多くのタスクのための必携ツールです、BSP (board support package) の開発は最も典型的な例でしょう。

幸いにもx86の世界と比較して組み込みプラットフォームは新たな挑戦だけでなく問題に対処するため良いツールを紹介してくれる。それはJATAGデバッガです。
JTAGデバッガは使いやすく、信頼性があり、ソフトウエアデバッガでは使用できない、いくつかの素晴らしい機能を提供し、あらゆる論争から自由です。
そしてそれは常にオリジナルのKGDBといった、侵襲的なLinuxカーネルのパッチに関連付けられています。

私はJTAGデバッグの話題は、経験豊富な組み込みシステム開発者としてのあなたにとって新しいものではないことを前提としています。
あなたは、おそらく過去にウインドリバーのオンチップデバッグのようなものを使用したことがあるでしょう。


JTAGは、あなたの友達です
JTAG(ジョイントテストアクショングループ)は、当初、製造後の回路基板をテストするための手段として開発されました、しかし今日ではより一般的に組み込みシステムのデバッグに使われています。
時にはインサーキットエミュレータ(ICE)と呼ばれるJTAGアダプタは、ターゲットCPUの内部のオンチップデバッグモジュールへのアクセスに使用されます。
それは、特に、CPUの停止、レジスタとメモリの検査、コードのシングルステップ実行、ブレークポイントを定義することが可能です。

ほとんどのJTAGデバッガが、現在ではLinuxをサポートしているにもかかわらず、もしあなたが低コストのデバイスの買物をしているなら、私はそのデバイスがLinuxをサポートしているかをたずねることお勧めします、即ちメモリ管理機構(MMU)、Linuxのバイナリーフォーマットそしてロード可能なモジュールのサポートです。
もしそのデバイスがリモートGDB(GNU debugger)プロトコルをサポートしているなら、あなたはそれがどのように動作しているかを確認することができます。



文字のキャスト
私はこの記事でARM上でどのようにLinuxカーネルをデバッグするかを示すために私のFemtoLinuxプロジェクトの設定を使用するつもりです。
そのため、最初に設定に関して記述するのは有益なことです。

このプロジェクトの目的はLinuxシステムコールの遅延とオーバーヘッドを減らすことです。
そしてそれはVxWorks5.5のモノシリックなアプリケーションを再設計なしにLinuxに移植するためです。
ご想像通り、この種の低レベルのLinuxカーネルハッキングはJTAGなしでは、ほとんど不可能です。

開発のために我々はEmbedded ArtistsのLPC3250ボードを使います。
それは、ARM926コアとNXP CPUを元にした非常に便利なプラットフォームです。
ハードウエアの仕様が印象的であることは、この資料の範囲内では特に興味を引くことではありません。しかしながら、私がこのボードについて気に入っているのは、良く考え抜かれ特に開発者のニーズ合わせて設計されているところです。
USB経由の電力などの機能がUSBシリアルブリッジと組み合わされて、明確に示されています。

当然、ボードは、デバッグと完全なLinuxサポートのための20ピンJTAGインタフェースを備えています。
USB JTAGアダプタとして、我々は、 Tin Can ToolのFlyswatterを使います。これはかなり基本的なデバイスですが、しかしそれを発見する前にかなり私を驚かせました。
私は100ドル未満で、完全に機能するJTAGデバッガを取得することが可能であることは思いもしませんでした。

私は1つの理由からTin Can Toolがこの低価格デバイスを導入できたと思います、それは彼らがデバッグソフトにまったく投資していないということです。
彼らはオープンソースソフトウエアパッケージである、OpenOCDとGDBに頼っています、それはこの記事の中で最も重要な部分、すなわちJTAGデバッグ用ツールを私たちにもたらします。



JTAG用のソフトウェアツール
この記事の範囲では、OpenOCD -on-chip debugger(OCD)は、デバッガとの間で動作するミドルウエアとして考えることができます。つまりGDBインスタンスとJTAGアダプターとの間です。
それはJTAGデバッグに限ってはそれ以上のことを行います。OpenOCDはGDBコマンドをUSBコマンドに変換します、そしてそれはJTAGアダプターに送られます。
OpenOCDはリモートgdbserverプロトコルを実装します。それはGDBクライアントのためのgdbserverインスタンスであることを示します。そしてそれはLinuxで動作するアプリケーションの代わりにLinuxカーネルそのものをデバッグするために発生します。
OpenOCDはARM7、ARM9、XScaleそしてCoretex-M3をサポートしています、そしてそれはあなたがもしMIPSやPowerPCを使用しているなら、あなたは別の通常は高価なJTAGデバッグを探す必要があることを示しています、例えばAbatron BDI3000のような。
OpenOCDはかなり多くのJTAGアダプタで動作します、特にFT2232をベースにしたものです。
(訳注)
http://www.tincantools.com/product.php?productid=16134
によれば、OpenOCDは既にCoretex-A8, A9に対応しているようです。BeagleBoardやPnadaBoardでもいけそうです。

FT2232は、Future Technologies Devices Internationalが製造した非常にポピュラーなチップで、 多くのTin Can Tools' FlyswatterのようなローエンドJTAGアダプタで使用されています。

GDBのサポートに加えて、OpenOCDはtelnetのコマンドラインインターフェースで使える広範なリストをもっています。
それはをターゲット状態のコマンド、メモリアクセス、フラッシュプログラミング、ARM固有のコマンド、JTAGの低レベルコマンドなどを含みます。

OpenOCDは網羅的なドキュメントが付属しています、それは全てのコマンド、設定、デバイスサポートとそれ以上のことを詳細に説明しています。
私はそれを読むことをお勧めします。



GDB is in the house
セットアップのパズルの最後の部分は、GDB、またはGNUのデバッガです。
それは、Linuxを含むUNIXシステムの標準と広く使われているデバッガです、そしてそれはほとんどの導入を必要としません。
それは、プログラムトレース、変更、およびデバッグのための大規模な機能を提供しています。
フルGDBのマニュアルは、この記事の範囲を超えていますので、JTAGと組み込みのデバッグのために関連するものだけを取り上げます。

最も一般的なGDBは、単一のアプリケーションとして使用されますが、クライアントサーバモードも持っています。
このモードでは、GDBクライアント、別の言葉で言うとフロントエンドとGDBサーバは1つのマシン(通常はホストPC)で動作します。
バックエンドは別の(通常は組み込みターゲットシステム上で)動作します。

GDBサーバはアプリケーションを制御するために使用されます、そしてGDBクライアントはユーザインターフェースです。
これらは、両方ともGDBのTCPベースのリモートプロトコルを使用して通信します。

この設定はあなたが組み込みLinuxアプリケーションをデバッグするときに通常使用するものです。
JTAGデバッグの場合には、OpenOCDデーモンとJTAGアダプタは、gdbserverをシミュレートする一方、GDBのクライアントは同じままです。

GDBの一つの重要な欠点は、グラフィカルユーザーインタフェース(GUI)の欠如です。
ほとんどの人はデータディスプレイデバッガ(DDD)、GDBのGUIラッパーを使用します。

個人的に非常に遅い応答時間(現代の基準)そして無骨なインターフェースのため、このプログラムは好きではありません。

幸いにもより良い代替手段があります、すなわちInsightです。
DDDとは異なり、Insightはラッパーではなく、GUIを含んだGDBのバージョンです。
詳細は以下を参照 http://sourceware.org/insight/faq.php for more about Insight
メリットは、GUIが非常に良く使いやすくなることです。
しかし欠点があります - それがGDBを組み込まれているとして、あなたはおそらく、ターゲットCPUのアーキテクチャのためにそれをコンパイルする必要があります
一方DDDでは、クロスコンパイラツールチェインから外部GDBのバージョンを使用できます。



OpenOCDの設定
もし私が説明したすべてのソフトウェアをインストールしてカーネルをコンパイルしたと仮定すると
デバッグの開始前の最後のステップはOpenOCDの設定をすることです。
もし運が良ければOpenOCDは既にあなたのJTAGアダプターとボードの設定ファイルを含んでいるかもしれない、そうであれば"うまく動作"するかもしれない。
実際にFlyswatterとLPC3250のケース場合と同様です(私だけCPUTAPIDパラメータを変更する必要がありました)、しかしあなたのケースは異なるかもしれない。

設定の完全な説明については、OpenOCDのドキュメントを参照して下さい。
私は例として私の設定を使用して基本的なコマンドだけを説明します。
デフォルト値の定型コードを省略し、私の設定ファイルは、リスト1のようになります。

画像

リスト1



最初の部分はインターフェースの設定で、あなたが使用するJTAGアダプタのタイプを定義しています。
"interface"コマンドは使用すべきドライバの識別子です。
私の場合はFT2232で、ft2232_vid_pidコマンドはベンダーIDとFT2232デバイスのプロダクトIDを指定します。

残りはターゲットボードの設定コマンドです。
"jtag newtap"コマンドはチェーン内のJTAG TAPを定義します。
あなたはset_TARGETNAMEと"target create"コマンドと共にあなたのPC用に少なくとも1つは設定することが必要です。

ここでは、実際のJTAGデバッグセッションがどのようなものかを示します。
図1にあるように、LPC3250ボードは20ピンのJTAGケーブルを通じてFlyswatterと接続します。そして両方のデバイスはUSB経由でLinuxPCに接続されています。
LinuxはOpenOCDデーモンおよびInsight GDBのクライアントを実行しています。

画像

図1


Debug session:

1. JTAGアダプタの電源を入れます
2. ボードの電源を入れます
3. usbfsをマウントします(もしまだマウントされていないなら): sudo mount -t usbfs none /proc/bus/usb
4. OpenOCD daemonを起動します: sudo bin/openocd -f flyswatter.cfg -f lpc3250.cfg
5. Insight(あるいは他のGDB互換の)デバッガを起動します: arm-unknown-linux-gnueabi-insight vmlinux
6. ターゲット設定 (ポート3333はOpenOCDによりデフォルトで使用されます、設定ファイルで変更可能です):
Target: Remote/TCP
Hostname: localhost
Port:3333
7. ターゲットに接続します。

あなたは、非圧縮のカーネルイメージvmlinuxを準備する必要があります、それはデバッグシンボル付きでコンパイルされたものが望ましい。
言い換えれば、CONFIG_DEBUGとCONFIG_DEBUG_INFOのカーネルビルドパラメータを有効にする必要があります。

もし正常に接続できたなら、あなたはLinuxカーネルをデバッグするためにグラフィカルなデバッガーインターフェースを使用することが出来ます。
あなたは、アセンブリとソースコード(私は特に低レベルのデバッグ用の混在アセンブリ/ Cモードが好きです)の両方でシングルステップ実行することができます
ブレークポイントの設定、メモリとレジスタのチェック/変更そしてあなたが通常アプリケーションをデバッグするように一般的にカーネルをデバッグできます。
図2のスクリーンショットはInsightのメインウインドウです。
画像


図2



もちろん、あなたがコマンドラインインターフェイスを好む場合、コンソールウィンドウも同様に使用可能です。
すべての標準的なGDBコマンドに加えて、monitorコマンドを使用してOpenOCDに直接JTAGコマンドを送信することができます。たとえば、リスト2に示されているアームのregコマンドを使用して、すべてのバンクレジスタをチェックすることができます、あるいはリスト3に示すようにarm926ejs cache_infoコマンドを使用してキャッシュに関する情報を表示することができます。
(サポートされているコマンドの完全なリストについてはOpenOCDのマニュアルを参照してください。)
画像


リスト2


画像

リスト3


私はこれまでに解説したことの説明では、あなたが静的にリンクされたカーネルイメージをデバッグするに興味があることを前提としています。
これはほとんどの時間も同様です、JTAGは、初期の初期化のデバッグに最も有効であり、このコードはもちろん、静的にリンクされています。

しかしながら、時にはあなたはドライバや他のロード可能なカーネルモジュールをデバッグすることを望むかもしれない。
ここでの問題はあなたがinsmodやmodprobeコマンドでモジュールをロードした後で、GDB/Insightはこのモジュールのシンボルを認識しないということです。
シンボル名が何であるか、それらがどこに再配置されているかをデバッグに指示するのはあなたの責任です。

あなたは、/proc/modulesファイルを読み取ることによって、各モジュールのベースアドレスを見つけることができます。
例えば、あなたが私のシステムで、nfsモジュールがアドレス0xf8716000に再配置されていることがわかります。

cat /proc/modules
nfs 271912 1 - Live 0xf8716000
...

オフセットは、最後の列に表示されます。あなたがオフセットを知れば、次のコマンドを使用して、このモジュールのシンボルテーブルをロードするためにGDBに指示することができます。

add-symbol-file nsf.ko 0xf8716000

終了したら、カーネルとモジュールのデバッグを続行することができます。



A good start
この記事では、JTAGによるLinuxデバッグへの決定的なガイドを意味しません、しかし私はそれが始めるためにあなたに十分な情報を与えることを願っています。
Linuxでの通常のケースとして、私がここで解説したほとんどに対して代替手段があります。

たとえば、もしあなたが自分でシステムを構築するのに時間を費やすことに不本意でお金が問題でないなら、Wind River Workbench On-Chip Debuggingは良いオプションです。
これは現在の組み込みシステムで使用されているすべてのプロセッサをサポートしており、素晴らしい統合開発環境が付属しています。
言うまでもなく、それは、VxWorksとLinuxの両方をサポートしています。

別の若干安価なオプションはAbatron BDI3000です。
Abatronはまた、関連するすべてのプロセッサをサポートし、リモートのGDBプロトコルをサポートする任意のクライアントで使用することができます。
私がこの資料に記載したのとほぼ同じ方法です。
主な違いは、それはむしろUSBインタフェースよりもイーサネットを持ち、GDBサーバーエミュレーションソフトウェアを実行することです。
それはデバイスの中にOpenOCDと同等のものを持ち、非常に便利です。

もしあなたが、Eclipseベースの統合環境を好むが、ウインドリバーOCDを買う余裕はない場合、あなたはLinuxScope-JTD(JTAGターゲットデバッガ)のアドオンソフトウエア製品を買うことができます。
これはAbatronのプローブでの使用に最適化されているEclipse IDEのデバッガです。

Sasha Sirotkinは現在、組み込みARM、MIPS、およびPowerPCシステムのためのFemtoLinuxのシステムコールのオーバーヘッドを向上させるフェムトLinuxプロジェクトに取り組んでいます。

Resources:
1. FemtoLinux, www.femtolinux.com
2. EmbeddedArtists, www.embeddedartists.com
3. Tin Can Tools, www.tincantools.com
4. OpenOCD, http://openocd.berlios.de/web/
5. Insight, http://sourceware.org/insight/
6. LinuxScope-JTD, www.ultsol.com/mfgs_comp_linuxscope.htm, or www.linuxscope.com/
7. Wind River OCD, www.windriver.com/products/OCD/
8. Abatron BDI3000, www.abatron.ch/products/bdi-family/bdi3000.html

この記事へのコメント

この記事へのトラックバック