3秒でわかる
OS の中心で、CPU やメモリ、ディスクといった資源を管理するプログラム。アプリはカーネル越しにしかハードウェアへ触れません。
もう少し詳しく
どういうものか
カーネルは OS の中核部分で、CPU 時間の割り当て、メモリの割り当て、ファイルシステム、ネットワーク、デバイスの操作といった資源管理を一手に引き受けるプログラムです。アプリケーションは自分でディスクへ書き込むことはできず、システムコールという窓口を通じてカーネルに依頼します。
CPU には特権レベルがあり、カーネルは強い権限で動くカーネルモード、アプリは制限されたユーザーモードで動きます。この線引きがあるおかげで、ひとつのアプリの暴走が機械全体を巻き込まずに済みます。
なぜ必要か
複数のプログラムが同時に動く環境では、誰かが調停しないと成り立ちません。二つのアプリが同じメモリ領域を使えば内容が壊れますし、片方が CPU を独占すれば他は止まります。カーネルはこの取り合いを裁く立場にいます。同時に、ハードウェアの違いを吸収する役割もあり、アプリはディスクの型番を知らずにファイルを読み書きできます。
具体例
Linux で今動いているカーネルを確かめる操作は次のとおりです。
uname -r # 5.15.0-91-generic カーネルのバージョン
uname -a # 種別や<a href="/glossary/architecture" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">アーキテクチャ</a>まで表示
lsmod | head # 読み込まれているカーネル<a href="/glossary/module" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">モジュール</a>
dmesg | tail # カーネルが出した最近のメッセージ
# アプリが出しているシステムコールを覗く
strace -c lsstrace の出力に並ぶ openat や read、write が、アプリからカーネルへの依頼そのものです。
つまずきやすいところ
「Linux」という語をカーネルの意味で使う場合と、ディストリビューション全体の意味で使う場合が混在しています。厳密には Linux はカーネルの名前で、Ubuntu などはそのカーネルにシェルやコマンド群を組み合わせた配布物です。
カーネルとファームウェアの区別も曖昧になりがちです。電源投入直後に動いて OS を起動するのは BIOS や UEFI といったファームウェアで、カーネルはその後に読み込まれます。
もうひとつは、カーネルパニックとアプリのクラッシュの混同です。アプリが落ちてもカーネルは動き続けますが、カーネル自体が続行不能になると機械ごと止まります。
似た用語との違い
| 用語 | 位置づけ |
|---|---|
| カーネル | 資源を管理する OS の中核 |
| シェル | 人の入力をカーネルへの依頼に変える外側の殻 |
| システムコール | アプリがカーネルに仕事を頼むための窓口 |
覚え方
kernel は果実の「核」です。周りの果肉にあたるシェルやコマンド群を全部剥がしても、機械を動かす芯として残るのがこの部分だと考えると位置づけを取り違えません。