まずは練習として、printf()の処理をデバッガで追ってみた。入門書ではおなじみのハロー・ワールドであるが、単なるprintf()であってもその先には様々な処理があり、最終的にはシステムコールが呼ばれているということがわかる。
Linuxのような汎用OSでは、printf()の先にデバイスドライバがいきなり接続されているようなことは無く、システムコールによりアプリケーション・プログラムはOSカーネルと分離されている。
そしてその間には、システムコール命令によるソフトウェア割込みの発行がある。これは、資源の操作の権限を分離したいためだ。汎用システムではユーザがアプリケーションを作成し実行する。そのアプリケーションにバグがあったとき、アプリケーションが何でもできてしまっては、システムに重大な悪影響を及ぼす可能性がある。このため資源にアクセスする権限はOSカーネルのみが持ち、アプリケーションは資源の操作をOSカーネルに依頼するようなソフトウェア構成になっている。
なおシステムコールの発行を共通APIにして移植性を高めることにも目的があるという考えもあるが、これはAPIの定義による恩恵であり、システムコールを割り込みベースにすることで実行権限を分離することによる恩恵ではない。
また解析はひとつのツールだけで完結するものではなく、GDBによる動的解析、objdumpによる逆アセンブル結果やreadelfの出力、バイナリエディタによる機械語コード表示などを見比べながら行われる場合が多い。このため本章ではGDB以外のツールについても言及した。GDBでの解析結果に疑問が出たときの調査手段として参考になればと思う。
ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ
坂井弘亮著
秀和システム 3,200円
C言語の入門書では、"Hello, World"と出力するプログラムを最初に作るのが定番です。"Hello, World"は、たった7行の単純なプログラムですが、printf()の先では何が行われているのか、main()の前にはいったい何があるのか、考えてみると謎だらけです。本書は、基礎中の基礎である"Hello, World"プログラムを元に、OSと標準ライブラリの仕組みをあらゆる角度からとことん解析します。資料に頼らず、自分の手で調べる方法がわかります。
Copyright © ITmedia, Inc. All Rights Reserved.