« Linuxでqemuネットワークを設定する-udevの設定英語の留守メッセージ »

qemu がSEGFAULT

2005/08/06

  23:49:37 by , Categories: Freesoftware and Open Source Software

Link: http://savannah.nongnu.org/bugs/index.php?func=detailitem&item_id=13776

Emulator qemuをつかって

オプションの依存関係をよく理解しないまま、互いに矛盾するオプションをしたらwarningが表示されるわけでもなく、何となく動作する。いざ、その機能を使おうとすると、SEGFAULTを起こすというわけ。
実際に指定したのが、
qemu -hda win2k.img -redir tcp:10022::22
のような指定。実は、-redirオプションは、-user-netオプションに依存したオプションなのだが、このことをhelpやマニュアルにはあまり親切に書いてあるわけではない。
それより、fault toleranceのことを考えてないことが重大。リンク先のBug Trackにも同様の問題が報告されているが、添付されているpatchはSEGFAULT発生場所での対症療法にとどまっている。

実際の所、起動時のオプション解析および初期化部分の水際で、ちゃんと整合性チェックをすることのほうが、より大切だと考えた。

そこで、ソースコードをダウンロードして、修正にかかったわけだが、おもわず「ぐぅ」となってしまった。

main(int argc, char **argv)関数が714行もある。オプション解析と初期化が渾然一体となって、メンテナンスしにくいこと請け合いである。しかも、オプションの指定が有ったかどうかは、各オプションごとに動的変数やグローバル変数で保存、ないしは処理分岐しているような感じになっている。

当初の、オプション判定部と初期化部の間に依存関係をチェックする部分を挿入すればいいだろう、というあまい見通しはもろくも崩れ去った。

というわけで、これからこの700行overをclean upすることにしたいと思う。
よくあるのは、オプション名、初期化関数ポインタ、指定されたかどうかのフラグ、依存関係を示すフラグなどを構造体に収めて、指定されたオプションごとに構造体を検索して処理するようなスタイルである。オプションの処理は起動時に一回だけ行われる処理であるので、これも「あり」というように考える。

処理の実体部分では、これはCPUのキャッシュミスのペナルティが大きいので、あえて大きなSWITCH-CASE文にすることがある。CPUの投機実行や分岐予測のおかげでロス無く処理できるからである。

Trackback address for this post

Trackback URL (right click and copy shortcut/link location)

No feedback yet


Form is loading...