最終更新:

【仕組み解説】Linuxカーネルはどうやってコンピュータを動かしているのか — OS の心臓部を図解


Linuxカーネルのレイヤー構造 ユーザー空間 アプリ シェル ライブラリ システムコール(open / fork / read / write ...) カーネル空間 プロセス管理 fork / exec スケジューラ メモリ管理 仮想メモリ ページング ファイルシステム VFS / ext4 inode デバイス ドライバ カーネルモジュール CPU メモリ ディスク NIC / GPU
Linuxカーネルのレイヤー構造
ひよこ ひよこ

Linuxカーネルってよく聞くけど、そもそもカーネルって何なの?

ペンギン先生 ペンギン先生

カーネルは「OSの心臓部」だよ。アプリケーションハードウェアの間に立って、CPUやメモリ、ディスクなどのハードウェア資源を管理してくれる中核プログラムなんだ。カーネルがいないと、アプリは直接ハードウェアを操作しなきゃいけなくなって、大混乱になるよ

ひよこ ひよこ

ユーザー空間とカーネル空間っていう区別があるって聞いたけど、なんで分かれてるの?

ペンギン先生 ペンギン先生

セキュリティと安定性のためだよ。カーネル空間はハードウェアに直接アクセスできる特権モードで、ユーザー空間は普通のアプリが動く制限されたモード。もしアプリが自由にメモリやディスクを触れたら、他のアプリのデータを壊したり、OS自体をクラッシュさせたりできちゃうからね。この境界を越えるときに使うのが「システムコール」なんだ

ひよこ ひよこ

システムコールってどういうもの?

ペンギン先生 ペンギン先生

アプリがカーネルに「これやって!」とお願いするための窓口だよ。たとえばファイルを開くときの open()、プロセスを作るときの fork()、データを読むときの read() とかがシステムコールだね。アプリはこの窓口を通さないとハードウェアに触れない仕組みになっているんだ。Linuxには400以上のシステムコールがあるよ

ひよこ ひよこ

プロセス管理ってどういうことをしてるの? fork とか exec って何?

ペンギン先生 ペンギン先生

プロセスは「実行中のプログラム」のことで、カーネルはこれを生成・管理・終了させる役割を持ってるよ。fork() は今のプロセスをコピーして子プロセスを作る仕組みで、exec() はそのプロセスの中身を別のプログラムに置き換える仕組み。たとえばターミナルでコマンドを打つと、シェルが fork() で自分のコピーを作り、exec() でコマンドのプログラムに差し替えて実行するんだ。さらにスケジューラがCPU時間を各プロセスに公平に配分してくれるから、複数のアプリが同時に動いているように見えるんだよ

ひよこ ひよこ

メモリ管理はどうなってるの? 仮想メモリとかページングとか聞いたことあるけど…

ペンギン先生 ペンギン先生

プロセスには「仮想メモリ空間」という自分専用のメモリ領域が与えられるよ。実際の物理メモリとは別のアドレスを使っていて、カーネルがページテーブルで変換してくれるんだ。メモリは「ページ」という4KBの小さなブロック単位で管理されていて、これをページングと呼ぶよ。物理メモリが足りなくなったら、あまり使われてないページをディスクに退避させる「スワップ」という仕組みもある。だから物理メモリ以上のメモリを使えるように見えるんだね

ひよこ ひよこ

ファイルシステムの管理もカーネルがやってるの? VFS とか ext4 って何?

ペンギン先生 ペンギン先生

そうだよ。Linuxには VFS(仮想ファイルシステム)という抽象化レイヤーがあって、ext4 でも XFS でも NFS でも、アプリからは同じ open() / read() / write() で操作できる仕組みになっているんだ。ext4 はLinuxで一番よく使われるファイルシステムで、ファイルの実体は「inode」という管理情報と実際のデータブロックで構成されてるよ。inode にはファイルサイズ、パーミッション、タイムスタンプ、データブロックへのポインタが入ってるんだ

ひよこ ひよこ
ペンギン先生 ペンギン先生

そう、デバイスドライバハードウェアを操作するためのカーネル内のプログラムだよ。ネットワークカードGPUUSBデバイスなど、あらゆるハードウェアにはドライバが必要なんだ。面白いのは「カーネルモジュール」という仕組みで、ドライバを再起動なしに動的に読み込んだり取り外したりできること。lsmod コマンドで今ロードされてるモジュール一覧が見られるし、modprobe で追加もできるよ

ひよこ ひよこ

カーネルモジュールがあるから、全部のドライバを最初から入れなくていいってこと?

ペンギン先生 ペンギン先生

そのとおり!必要なときだけモジュールをロードすればいいから、カーネル本体をコンパクトに保てるんだ。これはLinuxカーネルが「モノリシックカーネル」でありながら柔軟性を持っている理由の一つだね。ちなみにLinuxカーネルソースコードは3000万行以上あって、世界中の開発者が協力して開発している、人類最大級のオープンソースプロジェクトでもあるんだよ

ひよこ ひよこ

3000万行ってすごい…! カーネルのバージョンアップでも互換性は保たれるの?

ペンギン先生 ペンギン先生

Linuxカーネルには「ユーザー空間のABIは壊さない」という厳格なルールがあるよ。つまりシステムコール互換性は維持されるから、古いアプリでも新しいカーネルで動くんだ。これはLinus Torvalds自身が強く守っているポリシーで、カーネル内部はどんどん変わっても、外から見える部分は安定しているのがLinuxの強みだね