brand new note

インフラエンジニアを目指す大学院生のメモ

Linuxシステムコール基本リファレンスを読む

はい、買ってきました。最近ブックオフと図書館ばかり使ってたので本屋で新書を手にすると気分いいですね。あまりリファレンスをガッツリ読むのも時間効率が悪いんですが、勉強の仕方も分からないのでひたすら順番に疑問をメモしながら読み始めてます。なんも分かんないので目次の時点で80個くらい感想が出てきてます。

f:id:frazz:20180506195822j:plainf:id:frazz:20180506195552p:plain


OS理論の入り口によさそう

linuxシステムコールの説明といえばその一言に尽きますが、システム内部をプロセス、ファイル入出力、メモリ関連、時刻関連などのパーツに分解し章立てしており、その中でどのようなシステムコールが存在し、それぞれがどのように動作するのかを説明しています。

詳しく言うと、本の前半はそもそもシステムコールがなんなのかの説明と、範囲の広くて重要な「プロセスの話」「ファイル入出力の話」でほぼ埋まっています。逆にそれ以外の機能については覚える量が少ないので後半に回ってるんだな、というイメージです。

最後の方では実際のシステムコールを用いて、簡易的なコマンドの実装を行うことができます。もちろんC言語でです。

カーネルやりたいとか、OSの中身を知りたいとかいう場合には興味深い書籍なのではないかと思います。(もちろん他の書籍とも併読された方が用語の理解は進むと思いますが...)

実は「30日でできるOS自作入門」(でしたっけ?)があったら欲しかったな。。。と思って本屋を眺めていたんですが、こちらもOS理論の入り口を見るためには良い(何より新しい)書籍かなと思って手に取った次第です。


straceしながら横に本を置く

買った後から気付いたんですけど、これがなかなか勉強になります。順番に読んでもボリュームが大きいので、個人的にはstraceしながら本を横に置いて勉強するのと、最後のコマンド実装を最初のほうでやっちゃうのがおすすめです。いかに簡単に手を動かすかがとっかかりとしては重要かもしれません。

straceはコマンドを指定して、中でどんなシステムコールが使われているかを見るコマンドです。いわばコマンドの解剖です。例えばnetstatコマンドが内部的にどう動いているか、解剖結果をファイルに書き込んでみましょう。

strace -o nets.txt netstat -s
more nets.txt


execve("/usr/bin/netstat", ["netstat", "-s"], [/* 48 vars */]) = 0
brk(NULL)                               = 0x555d7f954000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f56204a1000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=81583, ...}) = 0
mmap(NULL, 81583, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f562048d000
close(3)                                = 0
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300j\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=155744, ...}) = 0
mmap(NULL, 2255216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f562005a000


なんか出てきますね。読むと、一番最初に書かれているのがexecve()システムコールです。これは指定したプログラムを実行するシステムコールなので、まず最初に /usr/bin/netstat を開いてnetstat -s を実行してるのかーとかが分かるわけです。

次にbrk()システムコールが使われていますね。ここではヒープ領域の割当が行われています。自分も勉強中なんで曖昧ですけど、おそらく「netstatを実行するのに必要と思われるメモリ領域をオーバーしちゃったらこのメモリアドレスから使い始めてくださいね」って言ってます。たぶん。

要するに、このわけのわからない出力がこの本さえあれば大体読めるようになるんですよ。それはもう深海生物の生態を観察するような気分になれますよ。


簡易的なコマンドの実装が可能

重ね重ねになりますが、本の最後にはシステムコールを使ってコマンドを簡易的に実装することができる章が設けられています。もちろんそれもC言語なので、学校でプログラムの基礎をやったとか、linuxチョットデキルとか、そういう自分みたいな立場の人にはちょうどいいと思います。

ここではソースについては公開しませんが、簡易echoコマンドとかを実際に写してみるとけっこう理解が深まりますね。writeシステムコールでechoするためにどうコードを書いたらいいかとか、printfがバッファ付き関数といわれる所以とか、ひとつでもやるだけでそういうのがちゃんと分かります。

amazonでも買えます

Linuxシステムコール基本リファレンス ──OSを知る突破口 (WEB+DB PRESS plus)

Linuxシステムコール基本リファレンス ──OSを知る突破口 (WEB+DB PRESS plus)

そもそもがちょっと難しいテーマなのであれですが、linuxの基本とCの基本のところが読み書きできて、疑問をひたすら書き起こしながら読むのであれば、けっこうわかりやすいと思います。PCの中身が気になる方、ぜひどうでしょう。