wolfmasa's blog

フロンターレとプログラミング関係の話題を、気が向いたときにつぶやくブログです。

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

★★★★☆

きっかけ

なぜか地元の図書館にあったので、手にとってみたのだが、

タイトルと中身のギャップが半端ない!!

手にしていると、多くの人から「今更ハロー・ワールド?」と言われるのだが、これはれっきとしたOS、システムコール、標準ライブラリ(glibc等)のソースコードを読み、アセンブラデバッグをする、低レベルでハードな本である。

この手の本は多分あまり売れないこともあって、あまり種類は多くないが、1冊がとても濃密なので、過去のいくつか読んでみたがとても勉強になった。

Inside Linux Software オープンソースソフトウェアのからくりとしくみ

Inside Linux Software オープンソースソフトウェアのからくりとしくみ

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

読んだ中でパッと思い出すのはこの辺り。

今回の本は、それのどれとも微妙に違って、

という豪華な(?)内容になっている。本当に丁寧に説明してあって、素晴らしい入門書であると思う。

各章の感想

第1章 ハロー・ワールドに触れてみる

まずはビルドするところから。最初はビルドするだけで一苦労なので、これは地味に大切なこと。

あと、デバッグのやり方にも言及しており、その流れでアセンブラに突入。

ソフトランディングを期待していると、いきなり低レベルな世界に放り込まれた感じで面食らうが、説明は懇切丁寧なのでちゃんと読んでいけば置いていかれることはない。

第2章 printf()の内部動作を追う

printfを追っていくことで、その先のシステムコールの存在を解説する。

概念的にはみんな理解していることだが、実際に追っていくと想像以上に階層化されていたり、単純な仕組みだったりして、意外に発見が多い。

第3章 Linuxカーネルの処理を探る

システムコールの存在をキーに、今度はOS側のソースを使って解説する。

さらりとOSのカーネルの解説を始めるが、これも結構慣れていないと敷居が高く感じるもの。

実際にやりそうな流れで解析を説明しているようで、実は結構効率的に説明してくれているので、それほど混乱せずに説明についていくことができる。

OSとは何かということについても触れ始めており、この辺りで徐々に作者のこだわりが見え隠れするのが面白い。

第4章 ライブラリからのシステムコール呼び出し

共有ライブラリの仕組みなどを解説。

glibcのソースなども当然解説するのだが、あまり考えたことのない動的ライブラリについても仕組みを説明してくれる。

第5章 main()関数の前と後

プロセスの起動について、まずはデバッガを使ってアプリ側から、次にカーネル側から説明をする。

Binary Hacksにもあったが、main関数の前や後など、普通あまり考えたことはない。

システムコールについても、write以外を説明することで理解を深めてもらう工夫がある。

第6章 標準入出力関数の実装を見る

どちらかというとOSの仕組みの話。さらりと流す。

第7章 コンパイルの手順と仕組み

この後の実行バイナリの話のために、前提となるコンパイルとリンクの説明をする。

ここだけではないが、要所要所でobjdumpやreadelfなどのツールの使い方も丁寧に紹介してくれるのが良い。

コンパイラについては、個人的には他でも読んだことある内容だったので、それほど驚きはない。

第8章 実行ファイル解析

実行ファイル、ここではELFについて解説。

txtやdataの説明や、セグメントとセクションの話などがあった。

第9章 最適化

アセンブラを紹介していると、こんな説明もできるのかという章。

実際に最適化をして、どう変化するかと一緒に紹介してくれる。

O0/O1/O2などそれぞれに対して、有効となる最適化オプションは色々あるが、オプションの名前くらいだけで詳細に踏み込まないのも良い。

第10章 様々な環境と様々なアーキテクチャ

ARMなどでビルドしてみたりする。

ごめんなさい。興味がないので飛ばしました。。。

第11章 可変長引数の扱い

可変長の引数を、なぜか章を割いて説明。

x86の例だと思うが、解析しながら説明しているのだが、そりゃそうだよなーという感じではあった。

第12章 解析の集大成―システムコールの切替えを見る

まとめのような章。