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バーって読んでるんだなぁ。

Junichi Uekawa

$Id: dancer-diary.el,v 1.94 2009/10/21 14:02:48 dancer Exp $