selmertsxの素振り日記

ひたすら日々の素振り内容を書き続けるだけの日記

ふつうのLinuxプログラミング読書会 (第2章)

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) #<= ここに書いてある