OS・実行環境

カーネル

OSの中核。ハード制御やプロセス管理を担う。

概要

カーネル(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.6LTS2026年12月
6.1LTS2026年12月
5.15LTS2026年10月
5.10LTS2026年12月
5.4LTS2025年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段階に分けます:

  1. ハードウェア割り込みハンドラ(Top Half): 割り込みが入ったときに即座に実行される短い処理。レジスタクリア・データ取得のみ行う
  2. ソフト割り込み・ワークキュー(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使用

関連用語

参考リンク