概要
カーネル(Kernel)はオペレーティングシステムの中核を成すソフトウェアです。ハードウェアリソース(CPU・メモリ・I/O・ストレージ)を管理し、アプリケーションに対してシステムコールを通じて統一的なインターフェースを提供します。また、プロセス管理・メモリ管理・割り込み処理・ファイルシステム・ネットワークスタックなどのOSの基本機能を実装しています。
組み込み分野で最も広く使われるカーネルはLinuxです。組み込みLinuxは汎用Linuxカーネルを組み込み向けに設定・最適化したもので、産業機器・IoTゲートウェイ・スマートホーム・車載インフォテインメントなどに普及しています。RTOSのカーネルはLinuxカーネルとは設計思想が大きく異なり、リアルタイム性・小フットプリントを優先しています。
歴史・背景
OSカーネルの設計は1960〜70年代のメインフレーム時代から発展してきました。1969年のUnix(AT&Tベル研究所)はカーネル・シェル・ユーティリティを分離した設計が原点です。
1991年、Linus Torvaldsがx86向けに「Linuxカーネル」を公開しました。当初は趣味プロジェクトでしたが、GNUツールチェーンと組み合わせてGNU/Linux(「Linux」)として急速に普及しました。
組み込み向けには1990年代後半からARMポートが進み、2000年代にはiPod・Zaurus・Nokia N900などへの採用が進みました。2007年のAndroid(Google)はLinuxカーネルをベースとし、組み込み・モバイル分野でのLinux普及を決定的にしました。
2011年の「ARM mess」問題(ボード固有コードの氾濫)をきっかけにデバイスツリーへの移行が進み、カーネルとHW設定の分離が達成されました。現在のLinuxカーネルは6.x系が最新で、3ヶ月ごとにメジャーリリースが行われています。
技術仕様
カーネルの設計種別
| 種別 | 説明 | 例 |
|---|---|---|
| モノリシックカーネル | OS機能が全て1つのカーネル空間で動作 | Linux、組み込みLinux |
| マイクロカーネル | 最小限の機能のみカーネル空間、残はサーバープロセス | QNX、Minix |
| ハイブリッドカーネル | モノリシック+マイクロの中間 | Windows NT、macOS XNU |
| エクソカーネル | HW管理のみ担い、OSサービスはライブラリが提供 | 研究レベル |
| RTOSカーネル | プリエンプティブスケジューラ中心の超軽量カーネル | FreeRTOS、Zephyr |
Linuxはモノリシックカーネルですが、ロード可能カーネルモジュール(LKM: Loadable Kernel Module)で動的にドライバ・機能を追加できる設計になっています。
Linuxカーネルの主要サブシステム
Linux カーネル主要コンポーネント:
┌──────────────────────────────────────────────────────┐
│ System Call Interface │
├──────────────────────────────────────────────────────┤
│Process│Memory│File│Network│Device│Security│IPC │
│Manager│ Mgmt │Sys │Stack │Drivers│(LSM) │ │
├──────────────────────────────────────────────────────┤
│ Architecture-specific code │
│ (ARM / ARM64 / RISC-V / x86 / MIPS) │
└──────────────────────────────────────────────────────┘
- プロセス管理: タスク・スレッドの生成/終了・CPU スケジューリング(CFS: Completely Fair Scheduler)
- メモリ管理: 仮想メモリ・MMU・ページアロケーター・スラブアロケーター
- ファイルシステム: VFS(Virtual File System)・ext4・btrfs・overlayfs・UBIFS等
- デバイスドライバ: キャラクタデバイス・ブロックデバイス・ネットワークデバイス
- ネットワーク: TCP/IPv4/IPv6・Unix Domain Socket・netfilter
- 割り込み管理: ハードウェア割り込みの受付・ハンドラへのディスパッチ
カーネル設定(Kconfig)
Linuxカーネルはkconfigで何万ものオプションを設定できます。組み込み向けには必要最小限に削ることで数MB単位の最適化が可能です:
# カーネルビルドの基本手順(ARM64向け)
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
# ベース設定を選択
make defconfig # アーキテクチャ標準設定
make bcm2711_defconfig # ボード向けデフォルト設定
# GUI設定
make menuconfig # TUIメニュー
make xconfig # GUIメニュー
# ビルド
make -j$(nproc) Image dtbs modules # カーネル・DTB・モジュール
# モジュールインストール
make INSTALL_MOD_PATH=${ROOTFS} modules_install
カーネルバージョンとLTS
Linuxカーネルのバージョン体系はメジャー.マイナー.パッチ(例:6.6.28)です。LTS(Long Term Support)カーネルは2年以上のサポートが提供され、組み込み製品での使用に適しています:
| バージョン系 | LTSか | EOL目安 |
|---|---|---|
| 6.6 | LTS | 2026年12月 |
| 6.1 | LTS | 2026年12月 |
| 5.15 | LTS | 2026年10月 |
| 5.10 | LTS | 2026年12月 |
| 5.4 | LTS | 2025年12月 |
動作原理
システムコールインターフェース
アプリケーション(ユーザー空間)はシステムコールを通じてカーネル機能を利用します。ユーザー空間とカーネル空間は分離されており、システムコールで権限を切り替えてカーネルコードを実行します:
/* ユーザー空間のCコード */
#include <unistd.h>
#include <fcntl.h>
int fd = open("/dev/spidev0.0", O_RDWR); /* open() システムコール */
/* カーネル内でSPIドライバのopenハンドラが呼ばれる */
uint8_t tx[] = {0x01, 0x02};
write(fd, tx, sizeof(tx)); /* write() システムコール → SPIドライバのwrite() */
割り込み処理の2段階構造
Linuxカーネルはハードウェア割り込みの処理を2段階に分けます:
- ハードウェア割り込みハンドラ(Top Half): 割り込みが入ったときに即座に実行される短い処理。レジスタクリア・データ取得のみ行う
- ソフト割り込み・ワークキュー(Bottom Half): 時間のかかる処理を割り込み文脈の外(プロセス文脈)で遅延実行
/* Linuxドライバの割り込みハンドラ例 */
static irqreturn_t my_interrupt(int irq, void *dev_id) {
struct my_dev *dev = dev_id;
/* Top Half: レジスタ読み取りのみ(高速) */
dev->rx_data = readl(dev->base + DATA_REG);
/* Bottom Half: 処理はワークキューにスケジュール */
schedule_work(&dev->rx_work);
return IRQ_HANDLED;
}
/* Bottom Half: プロセス文脈で実行 */
static void rx_work_handler(struct work_struct *work) {
struct my_dev *dev = container_of(work, struct my_dev, rx_work);
process_received_data(dev->rx_data);
}
モジュールの動的ロード
# カーネルモジュールの操作
modprobe w1-gpio # GPIOワイヤー1ドライバをロード
lsmod # ロード済みモジュール一覧
modinfo w1-gpio # モジュール情報
rmmod w1-gpio # アンロード
# 自分で書いたカーネルモジュールのビルド
# Makefile:
obj-m += my_driver.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
用途・ユースケース
産業制御・エッジ機器
Linuxカーネルは豊富なドライバとリアルタイム拡張(PREEMPT_RT)により、産業用制御機器のOSとして採用されています。PLC代替・モーションコントローラ・産業用HMIで使われています。
ネットワーク機器
OpenWrt・pfSense・VyOSなどのルーター/ファイアウォールOSはLinuxカーネルをベースにしており、netfilter/iptables・tc(Traffic Control)によるパケット処理を行います。
車載IVI(インフォテインメント)
AGL(Automotive Grade Linux)はLinuxカーネルをベースとした車載IVI向けディストリビューションです。Honda・Toyota等が参加しています。
エッジAI
TensorFlow Lite・ONNXRuntimeなどのAI推論ライブラリはLinux上で動作し、NVIDIA Jetson・Raspberry Pi等でエッジAI処理を行います。
実装・開発のポイント
カーネルドライバの開発
/* 最小構成のカーネルモジュール例 */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("My Name");
MODULE_DESCRIPTION("Minimal kernel module example");
static int __init my_driver_init(void) {
pr_info("my_driver: loaded\n");
/* デバイス初期化・割り込み登録等 */
return 0;
}
static void __exit my_driver_exit(void) {
pr_info("my_driver: unloaded\n");
/* リソース解放 */
}
module_init(my_driver_init);
module_exit(my_driver_exit);
procfsとsysfsによるデバッグ
カーネル内部の状態確認に/procと/sysが有用です:
# プロセス情報
cat /proc/meminfo # メモリ使用状況
cat /proc/interrupts # 割り込み統計
cat /proc/net/dev # ネットワーク統計
# デバイス情報
ls /sys/bus/i2c/devices/ # I2Cデバイス一覧
cat /sys/class/gpio/gpio17/value # GPIO値確認
# カーネルログ
dmesg | grep "my_driver" # ドライバログ確認
dmesg -w # リアルタイムログ監視
ソースコードの調査
Linuxカーネルは3000万行以上のコードを持ちます。ソースを読む際は以下のツールが役立ちます:
# ctagsでシンボル定義ジャンプ
make ARCH=arm64 cscope tags
# ハードウェアモデルのドライバ探し
grep -r "bosch,bme280" drivers/
# → drivers/iio/pressure/bmp280.c
他技術との比較
Linuxカーネル vs RTOSカーネル
| 項目 | Linuxカーネル | RTOSカーネル(FreeRTOS等) |
|---|---|---|
| コードサイズ | 数十〜数百MB | 数KB〜数十KB |
| MMU必須 | 原則必須 | 不要 |
| リアルタイム性 | ソフト(PREEMPT_RTで改善) | ハード対応 |
| 機能範囲 | フルOS(FS・ネットワーク・プロセス等) | スケジューラ・IPC中心 |
| 起動時間 | 数秒〜 | ミリ秒〜 |
| ドライバ数 | 数万のドライバ収録 | ベンダー提供HAL使用 |