つれづれ日記 2014年8月

予定

毎日


2014年8月28日 (木曜日)

06:13:13 # Life テストコードを書こうかなと思ったけど mips abi がよくわからないのでお勉強。 $at というアセンブラ用のテンポラリレジスタというのが存在するのかな? MIPS ABI Historyを読んでちょっとうっときた。 o32, n32, n64 とかの経緯がすごい。 disassemble 結果のレジスタ名がr0-r31 ではないので何かと思ったら名前がついているらしい。 ABI documentからレジスタ情報メモ。nptl tls とかはどうなってるのかな。 レジスタの数はまったく32 ではないというのとPCが32とは別であるあたりがARMとは違う漢字がする。

$0 zero
$at AT
$2..$3 v0-v1 戻り値用
$4..$7 a0-a3 パラメータ渡し用
$8..$15 t0-t7 テンポラリレジスタ、関数呼び出しで破壊される。
$16..$23 s0-s7 関数呼び出しで保存されるレジスタ
$24..$25 t8-t9 テンポラリレジスタ、関数呼び出しで破壊される。
$26..$27 kt0-kt1 OS用
$28 gp global pointer / context pointer (PIC関数呼び出しで破壊される)
$29 sp stack pointer
$30 s8 関数呼び出しで保存されるレジスタ
$31 ra return address 関数から戻るべきアドレス

pc プログラム・カウンタ
hi
lo
	

2014年8月26日 (火曜日)

17:21:05 # Life qemu linux-user のユニットテスト。 今日ランチでQemuのユニットテストについて話題があって、linux-user のテストって一つくらいしかないというようなことをいってたので、調べてみた。 tests/tcg にそれっぽいテストがあって、arm, i386, mips の hello world が。 test-mmap とか testthread とかがあるので全くないってことはないような気がする。 testthread i386 で通るけど、armでビルドして実行したら即死亡した。

$ ./testthread 
thread1: 0 hello1
thread2: 0 hello2
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
	

2014年8月25日 (月曜日)

06:54:00 # Life なぜqemuのuser-mode Linuxエミュレーションのシグナルハンドラーは動かないのか。 qemuにはシステムエミュレーションとは違う、 Linux ELFバイナリを直接実行してくれるモードがあって、それがシステムコールを適切にホストのシステムコールに変換するという結構面白い手法をとっています。 システムエミュレーションは比較的精度が高くて安定して動くんですがlinux-userモードはいまいちシグナルハンドラ周りが動かないのでした。 例えばSIGSEGVのハンドラをsigactionで登録してからヌルポインタのデレファレンスをするとハンドラが呼び出されずにそのまま終了コード-11で終了します。 シグナルハンドラ周りのソースは qemu.git/linux-user/signal.c にあります。 つらつらと眺めてみると今年の3月に a7ec0f98e3a37a4d31c832cfa14dc2c1c0890421 linux-user: Don't allow guest to block SIGSEGVとかいう変更が入っていてそれをrevertすると無限にsigsegvでループするようになりました。 どうもこのコードは仮想CPUのハンドラのシグナルハンドラに入る設定はうまくできるけど実際のCPUで実行されているコードにそのまま戻っているのでkill()で送信されたシグナルを受信するのはうまくできるけどCPU命令の結果発行されるシグナルはうまく処理できないっぽいということがわかりました。多分SIGBUSとかも無限ループする。

19:53:28 # Life Debian testing でchromeのアルファベットのフォントが全部ひらがなになってしまう。 言ってることの意味がわからないと思うけど、fonts-droidパッケージがインストールされているとどうもひらがなで表示されるそうな。アルファベットが全く読めないとURLバーが全く解読不能になるので使いにくい。意外とURLバーって読んでるんだなぁ。

2014年8月18日 (月曜日)

20:37:45 # Life sigactionというカオス。 libc の sigaction って結構いろいろやっていて、linux kernel の rt_sigaction に渡すときにはフラグがかわっていたりする。 だいぶカオス。 SA_ONSTACKがSA_STACK にかわっていて、 なにもなければ SA_RESTORER が追加されている。 man sigactionのSA_RESETHANDあたりのドキュメントと合わせて読むと混乱するにちがいない。 まぁ、システムコールを直接叩くことなんて普段ないからまぁあまり気にならないかも。 SA_RESTORER (0x04000000), これひょっとして違う意味で使われているのではないか。

2014年8月3日 (日曜日)

10:02:40 # Life 昔のC++コードを再度コンパイルしようとしてコンパイルが通らない。 なんかC++11の実装周りとかが変わってるのかな。 chrono あたりがmicroseconds を返すか nanosecondsを返すかがかわってるっぽいのとBoost関連がライブラリ以前は必要としていなかった気がするんだけど、boost::system ライブラリをリンクするのが必要になってるっぽい。

12:11:30 # Life Macbook air 2013 camera. 02:00.0 Multimedia controller: Broadcom Corporation Device 1570がカメラなんだけどLinuxドライバが存在しないのが知られている。 どうするのがよいのかねぇ。 ubuntu bug, kernel bug.


Junichi Uekawa

$Id: 201408.html.ja,v 1.7 2014/08/30 05:22:22 dancer Exp $