tkd2017の勉強ブログ

日々の勉強をアウトプットするブログ

[ふつりな 2版] 第2章 Linuxカーネルの世界

www.high-novice.com

  • P.26〜P.35

2.1 オペレーティングシステム

あらためて本書の目的を確認。Linux世界を構成する次の3つを理解する。

  • ファイルシステム
  • プロセス
  • ストリーム

ところで「Linux世界」とは何か? それはOSのこと?

OS とは何か。具体的な名前を挙げればWindowsやmacOS、Linuxがあるが、厳密な範囲は決まっていない。

Linuxに限っていえば、シェルや各種GNUコマンド、基本ライブラリなどが含まれている。ただ厳密にいえばOSではなくディストリビューションと呼ばれているが。

本書の考える「Linux世界」とは、カーネルが作り出す世界のこと。

カーネルとはKernel、つまりOSの核のこと。本来、Linuxとはカーネルの名前。Linuxカーネルを核として各種ソフトウェアをパッケージして作られるのがディストリビューションという立ち位置になる。

[vagrant@localhost hello]$ ls /boot/
System.map-3.10.0-693.5.2.el7.x86_64  grub                                     initrd-plymouth.img
config-3.10.0-693.5.2.el7.x86_64      grub2                                    symvers-3.10.0-693.5.2.el7.x86_64.gz
efi                                   initramfs-3.10.0-693.5.2.el7.x86_64.img  vmlinuz-3.10.0-693.5.2.el7.x86_64

vmlinuzがカーネル本体を含んでいるファイル。本体を取り出したい場合は次のブログなどを参考に。

aoking.hatenablog.jp

カーネルの重要な役割のひとつがコンピュータのハードウェアを取りまとめること。

ちなみに「ハードウェア」と「デバイス」はほぼ同義語だが、コンピュータに接続する周辺機器のことを特にデバイスと呼ぶ。

カーネルが各種デバイスを制御するといってもデバイスによって操作方法は異なる。そこでデバイスドライバ(単にドライバとも呼ぶ)というデバイスを操作するためのソフトウェアを提供することで、カーネルがさまざまなデバイスを操作できるようになる。

デバイスと直接やりとりするのはカーネルですので、普通のプログラムが操作したい場合はカーネルに仕事を依頼するという形になる。そのためのしくみが システムコール

Linuxの具体的なシステムコールは次のようなものがある。

  • open
  • read
  • write
  • fork
  • exec
  • stat
  • unlink

システムコールといっても特別な何かというわけではなく、普通の関数と同じように使用できる。

n = read(fd, buf, sizeof buf);

昔システムコールを調べたときに、関数と何が違うんだろう? と悩んだ覚えがある。→ システムコール - Wikipedia

というわけで、「プロセス」や「ストリーム」を理解するためには、それを操作するシステムコールを使ってみるのが一番。システムコールこそがLinuxカーネルの核心。

2.2 ライブラリ

システムコール以外にもさまざまな関数が提供されている。関数を収録しているものをライブラリと呼び、ライブラリに収められている関数を特に ライブラリ関数 と呼ぶ。

現実の図書館が本を貸してくれるのと同じように、ライブラリは関数を貸してくれる。貸してもらう作業を リンク (Link)と呼ぶ。

ライブラリ関数は、内部でシステムコールを呼んでいるものもあれば、ライブラリ関数だけで完結しているものもある。また、システムコールとライブラリ関数の区別は実はあいまい。昔はシステムコールだったものも今はライブラリ関数として実装しているものがあったり、逆もあったりする。

両者の違いが役に立つのは、manページを参照するとき。システムコールは2、ライブラリ関数は3ですので、同じ名前のものがある場合は少し意識する必要がある。

Linuxに用意されているライブラリで特に重要なライブラリが 標準Cライブラリ 、通称libc。

[vagrant@localhost ~]$ ls -l /lib64/libc.so.6
lrwxrwxrwx. 1 root root 12 Oct 28 11:03 /lib64/libc.so.6 -> libc-2.17.so

libcは標準規格で定められた仕様であるため、実装は別に存在する。Linuxで普通使われているのは GNU libc (略してglibc)といって、GNUプロダクトの一部。

/lib64配下には、ほかにもlibmやlibdlなどのファイルが存在し、標準Cライブラリの一部となっている。

最後に「API」のお話し。APIとシステムコールを同じ意味だと勘違いしている人もいるらしく、「それは違うよ!」と注意喚起している。

APIはプログラミングするときの呼び出し口(インタフェース)であり、システムコールは前述したようにカーネルにデバイスの操作を依頼する窓口。

今日はここまで。