検索
連載

OSのシステムコールの呼び出しとは&バイナリエディタの使い方main()関数の前には何があるのか(4)(3/3 ページ)

C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、printf()内のポインタ経由での関数呼び出しが行き着く先にあるシステムコールの呼び出しとバイナリエディタの使い方について。

Share
Tweet
LINE
Hatena
前のページへ |       

連載第2〜4回のまとめ

 まずは練習として、printf()の処理をデバッガで追ってみた。入門書ではおなじみのハロー・ワールドであるが、単なるprintf()であってもその先には様々な処理があり、最終的にはシステムコールが呼ばれているということがわかる。

 Linuxのような汎用OSでは、printf()の先にデバイスドライバがいきなり接続されているようなことは無く、システムコールによりアプリケーション・プログラムはOSカーネルと分離されている。

 そしてその間には、システムコール命令によるソフトウェア割込みの発行がある。これは、資源の操作の権限を分離したいためだ。汎用システムではユーザがアプリケーションを作成し実行する。そのアプリケーションにバグがあったとき、アプリケーションが何でもできてしまっては、システムに重大な悪影響を及ぼす可能性がある。このため資源にアクセスする権限はOSカーネルのみが持ち、アプリケーションは資源の操作をOSカーネルに依頼するようなソフトウェア構成になっている。

 なおシステムコールの発行を共通APIにして移植性を高めることにも目的があるという考えもあるが、これはAPIの定義による恩恵であり、システムコールを割り込みベースにすることで実行権限を分離することによる恩恵ではない。

 また解析はひとつのツールだけで完結するものではなく、GDBによる動的解析、objdumpによる逆アセンブル結果やreadelfの出力、バイナリエディタによる機械語コード表示などを見比べながら行われる場合が多い。このため本章ではGDB以外のツールについても言及した。GDBでの解析結果に疑問が出たときの調査手段として参考になればと思う。

書籍紹介

ハロー“Hello,World” OSと標準ライブラリのシゴトとしくみ

ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ

坂井弘亮著
秀和システム 3,200円

C言語の入門書では、"Hello, World"と出力するプログラムを最初に作るのが定番です。"Hello, World"は、たった7行の単純なプログラムですが、printf()の先では何が行われているのか、main()の前にはいったい何があるのか、考えてみると謎だらけです。本書は、基礎中の基礎である"Hello, World"プログラムを元に、OSと標準ライブラリの仕組みをあらゆる角度からとことん解析します。資料に頼らず、自分の手で調べる方法がわかります。


注文ページへ


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る