2009年09月14日

DWARF はソースレベルデバッギングのための情報をオブジェクトファイル中に保持する際のデータフォーマットです。

ソースレベルデバッガが最低限必要とする情報として、ソースコード中のプログラム行の位置と、対応するマシン命令アドレスの表があります。特にコンパイラによる高度な最適化が入ってくると、1つの行から不連続なアドレスにマシン命令が生成されるようになってくるので、デバッグ情報が無ければ、どこのアドレスにブレークポイントを張れば良いのか、ステップ実行の時にどこで止めれば良いのか、などが全くわからなくなってしまいます。

この対応表は非常に巨大なものに成り得るので、DWARFは対応表をそのまま持つのではなく、行番号プログラム(line number program)によって対応表を生成するという仕様になっています。これは、JVMの仮想機械語のようなバイトコードプログラムとなっています。具体的には、ソースコードのファイル名、行/列番号、命令アドレスなどを状態とする有限状態機械を定義し、その仮想機械のバイトコード列(= 行番号プログラム)をデバッグ情報として保持します。

続きを読む

2009年09月10日

この記事ではgcc 4.4.0を使用しています。もっと新しいgccの場合はこちら。

2013年06月27日 ARMのNEONのSIMD命令をgccのオートベクタライズの最適化で使う方法

AndroidのSDKのgoldfishのCPUをcortex-A8に置き換えてNEONのSIMD命令を試す(その2) のときにはarm_neon.hに定義されているintrinsicsを使ってNEONのSIMD命令を生成させました。この方法だとNEONの命令について詳細を知っていなければなりませんし、なによりもそのプログラムがNEONに依存したものになってしまいます。

今回はコンパイラの最適化の機能を使ってNEONのSIMD命令を生成させるコツを紹介します。

続きを読む

2009年09月08日

ARM のリアルタイムトレースで、ETM と ETB という似たような用語が存在し、それぞれがどのようなものなのかイマイチ理解していなかったのですが、辻先輩に軽くレクチャーしていただいたので忘れないうちにメモしておきます。

(ただし、これはあくまでも私が理解したところなので、間違いが多分にあるかと思いますし、特にレビューを受けてもいない文章です。文責は私にあります。)

リアルタイムトレースとは、プログラムの実行中の PC の動きや、データアクセスの際のアドレスやアクセスタイプ (R/W) などをキャプチャーする機能のことです。基本的には CPU に負荷をかけずに済むので、実際にプログラムを動作させた時の CPU の状態遷移をそのまま見ることができます。(遅くなるものもあるそうです。)

組み込みではリアルタイム性が重要なプログラムが多いので、トレースは非常にデバッグの役に立つ機能です。弊社の PARTNER-Jet は、1 GB の大容量トレースを難なくこなし、QProbe という解析ツールと連携することもできます。(Model 40 の場合。)

ETM (Embedded Trace Macrocell) は、CPU (ARM CORE) のバスを監視し、トレース信号を外部に直接出力するためのユニットです。ETM はたくさん線が必要なのですが、チップの線は高価 (未確認ですが、1本線が増えるたびに、単価が0.5円上がるという話も) ですし、接続するためのプローブも単価が高いものになります。

ETB (Embedded Trace Buffer) は、その名の通り、ARM SoC 内の超高速メモリです。直接信号を出力するのではないため、トレースデータを取りこぼすこと無くためて置くことができます。ただし、SoC 内のシリコンには限りがあるのでそれほど大容量にはできませんし、JTAG 経由でデータを吸いだす必要があります。特別なプローブが必要無く、JTAG のみで済むというのはメリットでもあります。

簡単ですが、以上を図にまとめると、以下のようになるかと思います。

リアルタイムトレース説明図

2009年09月04日

これまで2回に渡ってDalvikVMのインタープリタの部分でFPU命令を使って高速化する変更方法を紹介しました。

残りのCの部分で書いてある部分もコンパイルオプションを変えればFPU命令を使うようになるはずです。ソースをながめてみるとsetjmpの部分でFPUレジスタが退避されていなかったので、そのソース修正も合わせて紹介します。

続きを読む

2009年09月02日

前回はDalvik VMのインタープリタのfloatの四則演算だけFPU命令を使うように修正してみました。今回はdoubleの四則演算でもFPU命令を使うように修正します。今回の修正で私が即席で作った速度測定プログラムをエミュレータで実行したところ、約260msecかかっていたものが約85msecにまで短縮できました。これは結構効果がありそうです。

続きを読む

2009年08月31日

AndroidのDalvik VMではJavaのバイトコードから変換されたDXコードというものをインタープリタで実行しています。DXコードの中には浮動小数点演算を行うための命令もあるのですが、現状のDalvik VMではFPU命令を使わずにすべてソフトウェアによる浮動小数点演算のライブラリを呼び出しています。

Android SDKのシミュレータでは実はkernelとqemuはVFPが有効になっているのでFPU命令を使うことができます。そこでインタープリタのコードの浮動小数点の四則演算の部分をFPU命令を使うように書き換えて少し高速化してみました。

続きを読む

2009年08月28日

デバッガの開発は、UI レベルから JTAG レベルまで、非常に幅広いレイヤーの知識が必要です。そのため現在の PARTNER の開発は分業化が進んでいて、それぞれの領域を1 人から数人の担当者が開発する形になっています。

デバッガの肝の一つとして、ELF バイナリに入ってるデバッグ情報の解析があるのですが、そこらへんはほぼ全て社長と佐藤さんが行ってきたそうです。

私は入社してから今まで、ほぼずっとシミュレータ周りの開発をしてきましたので、どちらかというと PARTNER のコア部分とは少し離れた位置にいます。

しかし、デバッガベンダーに勤めていながら、全くデバッグ情報の解析について知らないというわけにもいかないので、少しずつ勉強していく過程をメモしていこうかと思います。

続きを読む

2009年08月26日

前回はgoldfishのカーネルをcortex-A8向けにリビルドしてemulatorで起動するところまでを紹介しました。

ここで一気にユーザーランドもcortex-A8用にリビルドしてみたいところですが、単純にコンパイルオプションを変えただけではうまくいきませんでした。アセンブラで書いてある所などは書き換えが必要になりそうです。

そこで、今回はまだユーザーランドはarmv5te用のままで使用し、NDKを使って一部の共有ライブラリだけをcortex-a8用にコンパイルし、そこでNEONのSIMD命令を試してみることにします。

続きを読む

2009年08月24日

前回はgoldfishのCPUをarm1136に置き換えました。今度はarmv7アーキテクチャのcortex-A8への置き換えに成功したのでその方法を紹介します。

armv7だとNEONのSIMD命令とかThumb2とか色々と面白そうです。

続きを読む

2009年08月21日

いつもいつもマイナーなネタですいません。

プログラミング言語 C 第2版の、奇妙な記述が気になりました。
「付録 C 変更点の要約」より引用。

・誰もが好きなつまらぬ変更:8 と 9 は 8 進数ではない。(p.328)

あまりにもさらっと書かれていますが、意味不明です。当たり前では ?

実は当たり前ではなくて、UNIX のアセンブラでは、8 と 9 は、8 進数の 10 と 11 として扱われていたんですね… いやはや。

「UNIX Assembler Reference Manual, Dennis M. Ritchie」
http://www.tom-yam.or.jp/2238/ref/as.pdf
An octal constant consists of a sequence of digits; ‘‘8’’ and ‘‘9’’ are taken to have octal value 10 and 11.

UNIX v6 以前のアセンブラの奇妙な習慣が、K&R の第1版まで脈々と続いていたわけです。UNIX と C の歴史は、こういうのがけっこう多いです。

2009年08月19日

PowerPCにはCPUのクロックサイクルでカウントアップされるタイムベースレジスタというカウンタがあります。これを利用して簡単にプログラムの2点間の時間を計測することができます。

ある関数を複数の方法で実装して、どちらが速いかを比較する場合に便利です。

手軽に使えるようにソースコードを一つのヘッダファイルにまとめてみました。

続きを読む

2009年08月17日

MIT の教育システムは本当にすごいですね。

xv6 という、MIT の OS の講義のために、UNIX v6 を ANSI C で書き直して、x86 マルチプロセッサシステムに移植したものが存在することを、ひらさんの twitter で知りました。

wikipedia がよくまとまっています。Lions 本のように、読みやすくソースコードが編集された PDF へのリンクもあります。OS のソースコード全部で、たったの 75 ページと、非常にコンパクト。

http://en.wikipedia.org/wiki/Xv6

他にも MIT は、初級計算機科学の講義のために書かれた SICP (日本語訳 : 計算機プログラムの構造と解釈)などでも非常に有名です。(こちらは Scheme でプログラムが書かれています。)どちらも講義資料 full text が全て無料で読めるというのが、なんとも太っ腹ですね。

私がけっこう前から、のんびりと pre K&R C のコンパイラを趣味で書いてる動機の一つとして、最小限の変更で UNIX v6 を x86 の上で動くようにしたいというのがあるのですが、既に完全 ANSI C リライトまでやられていたとは… いやはや、脱帽です。

続きを読む

2009年08月14日

ARM11のCP15にパフォーマンスモニタがあり、そのサイクルカウンタを利用して簡単にプログラムの2点間の時間を計測することができます。

計測用の関数を手軽に使えるようにソースコードを一つのヘッダファイルにまとめてみました。

ある関数を複数の方法で実装して、どちらが速いかを比較する場合に便利です。

続きを読む

2009年08月12日

山本先輩からコラムを1本いただきました。ありがとうございます。




元々、ミステリーが好きでよく本を読んでいたのですが、最近本の読み方が大きく変化しました。
実際には、物理的な本は読まずに、T-01A(ドコモのWindowsモバイル携帯)を使って読書しています。

T01-A続きを読む

2009年08月10日

C99 の規格が成立してから 10 年が経つわけですが、VC++ 2008 では ANSI C89 (ISO C90) までしか対応しておらず、C99 は未対応のようです。

次期の VC++ 2010 でも状況は変わらないようです。(ベータ版のマニュアルですが。)

http://msdn.microsoft.com/ja-jp/library/02y9a5ye(VS.100).aspx

やはり C# や .NET をプッシュする Microsoft 的には、OS の根幹を支える C++ はともかく、いまさら C はどうでも良いという扱いなのでしょうか。KMCでは、現在でも C はバリバリの現役なので、少し寂しいところです。

ちなみに VC++ にも、GCC と同様に独自の拡張機能が含まれており(ただし、GNU C のような派手な (?) 拡張は存在せず、独自の解釈的な拡張が多いようです)、/Za で ANSI C/C++ と互換性の無い機能を無効にできるそうです。(GCC の -ansi -pedantic 相当。)

「/Za、/Ze (言語拡張機能の無効化)」
http://msdn.microsoft.com/ja-jp/library/0k0w269d.aspx
「Microsoft C/C++ の拡張機能」
http://msdn.microsoft.com/ja-jp/library/34h23df8.aspx

VC++ の拡張機能を有効にする /Ze オプションは、VC++ 2008 で付けると「cl : コマンド ライン warning D9035 : オプション 'Ze' の使用は現在推奨されていません。今後のバージョンからは削除されます。」という警告が出ます。

記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード