2章: Linuxカーネルの世界
最初に
本資料は、学習者が本を元にサマリーを書いたものです。 分量はものすごく減っていますし、間違ったことを書いている可能性もあります。なので、気になった人は直接本を読んで頂けると幸いです!!
知識として学べること
Linux世界とカーネル
Linuxとは何かと聞かれたとき、OSと答える人が多い。けれども、OSとは厳密な定義がなく、Linux世界 = OS とは言い難い。本書では、Linux世界とは カーネル が作り出した世界であると捉えて話を進める。
カーネルのコードは、/boot
下にあるので簡単に確認できる。
# amazon linuxのカーネル $ ls /boot/ | grep vm vmlinuz-4.9.77-31.58.amzn1.x86_64
カーネルのお仕事は、コンピュータを構成する全てのハードウェアとソフトウェアを管理すること。なので、デバイスやデバイスドライバの取扱いもカーネルのお仕事と言って良い。
カーネルにお仕事をさせるための手段としてシステムコールというものが存在する。macOS上でシステムコールについて確認する方法として、dtruss
というコマンドが存在する。
# vscodeのdtruss結果 $ sudo dtruss -c -p 85439 kevent(0x7, 0x7FFF59C8AE60, 0x0) = 1 0 read(0x1F, "\001\0", 0x10000) = 882 0 write(0xB, "\0", 0x1) = 1 0 write(0x1F, "\001\0", 0x30) = 48 0 write(0xB, "\0", 0x1) = 1 0 select(0x8, 0x700004AB7E20, 0x0, 0x0, 0x700004AB7EA8) = 1 0 ... CALL COUNT psynch_cvwait 2 read 14 psynch_mutexdrop 15 psynch_mutexwait 15 write 19 kevent 21 select 21
上記のシステムコールが、vscode上でちょいちょいコードを書いてみたりした結果、実行されたものである。read, write, select等々はmanコマンドで確認することができる。
ライブラリ
Linuxで使う関数をまとめたものをライブラリと呼ぶ。任意のライブラリに用意されている関数をライブラリ関数と呼ぶ。
システムコールはカーネルに仕事をさせるものであるが、
ライブラリ関数は必ずしもそうでない。例えば strlen()
などは、システムコールを利用しない。
libc
ライブラリの中でも、標準Cライブラリが特に重要。
printf()
などが格納されている。
PRINTF(3) BSD Library Functions Manual PRINTF(3) NAME printf, fprintf, sprintf, snprintf, asprintf, dprintf, vprintf, vfprintf, vsprintf, vsnprintf, vasprintf, vdprintf -- formatted output conversion LIBRARY Standard C Library (libc, -lc) #<= ここに書いてある