コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

カーネルとユーザーランド

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

カーネルとユーザーランド

このレッスンで分かること

  • OS は カーネル空間ユーザー空間 という 2 つの世界に分かれています
  • カーネルだけがハードウェアを直接操作でき、アプリは システムコール 経由で依頼します
  • この分離があるおかげで、1 つのアプリの不具合が OS 全体を巻き込まないという安定性が生まれます

カーネルとユーザーランド とは

カーネルとユーザーランド。本レッスンでは、カーネルとユーザーランド の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

2 つの空間の役割

CPU には 特権レベル と呼ばれる階層があり、Intel/AMD x86 では「リング 0」(最高特権)から「リング 3」(最低特権)まで用意されています。OS のカーネル本体は リング 0 で動き、メモリの任意の番地を読み書きしたり、I/O ポートに直接アクセスしたりできます。一方、アプリやシェルは リング 3 で動き、自分に割り当てられたメモリしか触れません。

この分離があるおかげで、ブラウザがクラッシュしても OS 全体は無事ですし、悪意あるプログラムが他人のファイルを勝手に読むこともできません。

図解

diagram (will load when visible)

ユーザー空間で動くプロセスはハードウェアに直接触れません。必ずカーネルに依頼し、カーネルが代わりに操作します。

ユーザーランドとは

「ユーザーランド」はカーネル以外のすべてを指す広い言葉で、シェル、コマンドラインツール、システムデーモン、デスクトップ環境、ライブラリなどが含まれます。Linux ディストリビューションが千差万別になるのは、カーネル(Linux)は同じでもユーザーランド(GNU 系か Alpine の musl 系か、apt か yum かなど)が違うからです。

空間権限クラッシュ時の影響
カーネル空間Linux カーネル、ドライバリング 0カーネルパニック、即停止
ユーザー空間bash、Chrome、systemdリング 3プロセス単体の終了で済む

具体例

Python で open("a.txt").read() を呼ぶと、内部では下記のように 2 つの空間を行き来します。

Python

with open("a.txt") as f: text = f.read()
  1. ユーザー空間の Python ランタイムが read() を呼ぶ
  2. C 標準ライブラリ(glibc)の freadread 関数が呼ばれる
  3. syscall 命令(x86 なら int 0x80 / syscall)で CPU が リング 3 → リング 0 に切り替わる
  4. カーネル空間に入り、ファイルシステムドライバがディスクからバイトを読む
  5. カーネルがユーザー空間のバッファにバイトをコピーし、リング 3 に戻る

ユーザーから見れば単なる関数呼び出しですが、内部では特権切替えが起きています。

トレードオフ

  • 空間の切替えは 数十 ~ 数百ナノ秒 のコストがあります。高性能サーバーがシステムコール回数を減らすために io_uringepoll を使う理由はここにあります
  • 「すべてをカーネルに入れれば速い」というアプローチを モノリシックカーネル(Linux 等)と呼びます。一方、必要最小限だけカーネルに残す マイクロカーネル(Mach、Minix)は安定性で勝りますが、メッセージ通信のコストでやや遅くなります

よくある誤解

  • 「カーネル空間と物理メモリは同じ」は誤解で、両方とも 仮想メモリ の上にあります。違うのはアクセス権だけです
  • 「root 権限ならカーネル空間で動く」も誤解で、root プロセスもユーザー空間で動きます。ただしカーネルに対して特権操作を依頼できる権利が増えるだけです

やってみよう

Linux なら strace -c ls を実行してみましょう。ls という単純なコマンドでも、openatreadwritemmap といったシステムコールが何百回も呼ばれていることが見えます。

よくある質問

Q. カーネルパニックとは何ですか?

A. カーネル空間(リング 0)で回復不可能なエラーが発生したとき、OS が安全のためにシステムを強制停止させる状態です。ユーザー空間のアプリがクラッシュしてもプロセスが終了するだけで済むのとは対照的に、カーネル空間の致命的なエラーはシステム全体を道連れにします。Linux では「Kernel panic」、macOS では「カーネルパニック画面(再起動を促す黒画面)」として現れます。

Q. システムコールはなぜコストが高いのですか?

A. ユーザー空間(リング 3)からカーネル空間(リング 0)へ切り替わる際、CPU はレジスタの保存・復元、特権レベルの変更、アドレス空間の検証などを行います。この切替えに数十〜数百ナノ秒かかるため、システムコールを大量に発行するとボトルネックになります。io_uringepoll といった仕組みはシステムコール回数を減らすことで高いスループットを実現しています。

Q. root 権限を持つプロセスはカーネル空間で動くのですか?

A. いいえ、root プロセスもユーザー空間(リング 3)で動きます。root 権限が与えるのは「カーネルに対して特権操作を依頼できる範囲が広がる」ということであり、カーネル空間に入るわけではありません。カーネル空間で動くのはカーネル本体とデバイスドライバのみです。

次のレッスン

次は システムコールの仕組み で、システムコールの内部動作(呼び出し規約、レジスタ渡し、コンテキストスイッチなど)を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. カーネルとユーザーランド の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. カーネルとユーザーランド とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン