🏢

カーネルとはなんぞや?という話

に公開

みなさんこんにちは、ウタです。

低レイヤーのプログラムをいじっていると「カーネル」という単語をよく目にします。

カーネル・サ◯ダースじゃないよ

とても重要な概念ではあるのですが、知らなくてもプログラム自体を全然動かせるので勉強を後回ししていました。ただ、最近このカーネル周りでつまづくことが増えてきたのでがっつり記事にしていこうと思います。

カーネルとは

まず、カーネルとは全てのPCの根幹となるソフトウェアです。
例えば、OSが違えば使用可能なツールやアプリが異なってきますが、カーネルはそれらとは違いどんなPCにも入ってるコアの役割を担っているソフトウェアです。(もちろんOSによって多少機能に差があったり、名前が少し変わったりもしますが、総じてカーネルと呼ばれています。)

つまりカーネルとは

  • 車におけるエンジン
  • 人間における心臓
  • レストランにおけるキッチン

なのです。
カーネルがとても特別なソフトウェアという点は理解できましたか?

何をやってるの?

じゃあ、カーネルは何をやっているソフトウェアなのかを話して行きましょう。
カーネルの業務を一言で表現するなら「ソフトウェアとハードウェアの橋渡し」が簡潔かなと思います。

ソフトウェアとハードウェアとは近い関係にありながらも互いに違う言語を使用します。そのため中間に翻訳者がいないとプログラムを実行できません。

C言語でHello Worldと出力する時の流れを例に見てみましょう。

  1. プログラムを実行
write(1, "Hello World\n", 12);
  1. カーネルが受け取る情報
fd = 1                    // ファイルディスクリプタ1番(stdout)
buffer = "Hello World\n"  // 出力したいデータ
count = 12               // バイト数
  1. カーネル内部の動き
// ① ファイルディスクリプタ1番が何を指すか確認
// → 標準出力(通常はターミナル/画面)

// ② 権限チェック
// → このプロセスは画面に出力する権限があるか?

// ③ デバイスドライバ呼び出し
terminal_driver_write("Hello World\n", 12);
  1. ハードウェアの制御
④ 画面ドライバがハードウェアに命令
// → VGAカード/GPU に文字データ送信
// → 各文字を画面の座標に描画
// → 'H' → ピクセル操作、'e' → ピクセル操作... 'd'まで続く

このようにプログラムをカーネルが機械語に通訳・変換して、ハードウェアに渡す流れとなっています。

カーネルの主な機能

カーネルの概要がわかってきたところで主な機能について紹介します。
一つずつで1記事書けるくらいのボリュームになってしまうので、ざっくり箇条書きしていきます。

1. プロセス管理

// 複数のプログラムを同時実行
fork();  // 新しいプロセスを作成
wait();  // 子プロセスの終了を待つ
  • マルチタスク:複数のプログラムを並行実行
  • スケジューリング:どのプログラムをいつ実行するか決定
  • プロセス間通信:プログラム同士のデータ交換

2. メモリ管理

malloc(1024);  // メモリ確保要求
free(ptr);     // メモリ解放
  • 仮想メモリ:各プログラムに独立したメモリ空間を提供
  • メモリ保護:他のプログラムのメモリに勝手にアクセスできない
  • スワッピング:RAM不足時にディスクを使用

3. ファイルシステム管理

open("file.txt", O_RDONLY);  // ファイルを開く
read(fd, buffer, size);      // ファイルを読む
close(fd);                   // ファイルを閉じる
  • ファイル操作:作成、読み書き、削除
  • ディレクトリ管理:フォルダ構造の維持
  • 権限管理:誰がどのファイルにアクセスできるか

4. デバイス管理

  • デバイスドライバ:キーボード、マウス、ディスプレイなどの制御
  • 入出力制御:ハードウェアとの通信を管理

こうやってみるとプログラムを書く上でカーネルの存在が必要不可欠であるのがよくわかりますね。

sudoと何が違うの?

ここまで調べて僕がなんかsudoっぽいなと思いました。
ただ、sudoとカーネルは全く別のものです。以下比較表です。

項目 カーネル sudo
役割 ソフトウェアとハードウェアの橋渡し 一時的に管理者権限でコマンドを実行するツール
動作 コンピュータが起動している限りずっと稼働 コマンド実行時のみ
レベル システムの最も深い部分(カーネル空間) ユーザー空間で動作するプログラム
権限 全てのハードウェアに直接アクセス可能 カーネルに「管理者として実行して」とお願いする

PC全体の関係性を建物にまとめるとこんな感じ

🏢 10階:あなたのプログラム
   9階:sudo
   8-2階:その他システム機能
   1階:システムコール
━━━━━━━━━━━━━━━━━━━━━━━━━━━
🏗️ 基礎:カーネル(建物全体を支える土台)
━━━━━━━━━━━━━━━━━━━━━━━━━━━
🌍 地面:ハードウェア(物理的な大地)

sudoよりもカーネルの方がより「根幹」に当たるということが再度認識できますね。
sudoコマンド利用することによりPC内部を弄り回せますが、カーネルを変更することは基本的には出来ない&推奨されておりません。カーネルは根幹部分であるが故に1ユーザーが簡単に立ち入っていい領域ではないのです😊

【おまけ】カーネルはクラウドサーバーにも存在している?

カーネルがハードウェアとソフトウェアの橋渡しなのであれば、AWSのようなクラウドサーバーには存在していないのではないかと僕は疑問に思ったので再度調査しました。

結論、これらのサーバーにもカーネルは存在しています。
そもそもクラウドサーバーといえど「仮想化」されているだけで、実際には遠くに物理のサーバーがあるわけです。その物理サーバーのカーネルが動いているのでクラウドサーバーでもカーネルは動いています。

カーネルの存在を証明する手段としては、SSHでログインしてuname -rすると、カーネルバージョンが見えます。

まとめ

この記事では、カーネルについて以下のポイントを説明しました:

  • カーネルは全てのコンピュータの根幹となるソフトウェア
  • 主な役割はソフトウェアとハードウェアの橋渡し
  • プロセス管理、メモリ管理、ファイルシステム管理、デバイス管理が主な機能
  • sudoは一時的な権限管理ツール、カーネルは常時稼働する基盤

カーネルは普段意識することは少ないですが、プログラムを実行するたびに裏で働いている縁の下の力持ちです。低レイヤープログラミングを学ぶ上で、この基礎知識があると理解が深まるはずです。

Discussion