2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

"カーネルは最終的にCで書かれているが、それはCがアセンブリに届く言語だからである。"

UNIXとは、設計思想である。
その中心にあるカーネル(kernel)は、抽象化されたインターフェースでありながら、
極めて具体的なハードウェア制御の責務を負っている。

この章では、UNIXカーネル(特にLinuxやBSD系)におけるアセンブリコードの役割、
その記述の必要性、構造的配置、Cとの境界、そして思想的意義にまで踏み込む。


カーネルの設計とアセンブリの位置

UNIX系カーネルは一般に、以下の層に分かれている:

  • アプリケーション層(ユーザー空間)
  • システムコール層(C言語)
  • カーネル本体(C言語 + 部分的アセンブリ)
  • アーキテクチャ依存部(アセンブリ多め)
  • ブートストラップ・初期化処理(ほぼアセンブリ)

このうち、アセンブリが排他的に支配している領域が存在する。


ブートストラップ:最初の1命令はCでは書けない

CはOSが存在する世界で成立する言語であり、
OSを構築する文脈には適さない。

従って、最初の命令は常にアセンブリで書かれる。

Linux x86の例:arch/x86/boot/header.S

.code16
_start:
    cli
    xor ax, ax
    mov ds, ax
    ...
    jmp main

この段階では:

  • セグメント設定
  • 割り込み禁止
  • スタック構築
  • ブートローダとの連携

といったハードウェア初期化の厳密な操作が求められる。


割り込みとアセンブリ:制御の境界点

UNIX系OSは、ハードウェア割り込み・例外・システムコールを全て
「アセンブリで定義された入口」から処理を開始する。

例:x86上のシステムコールハンドラ

.global syscall_entry
syscall_entry:
    push %rax
    push %rcx
    push %r11
    ...
    call common_syscall_handler

この構造により:

  • 割り込みコンテキストの保存
  • ユーザ空間との切り替え
  • カーネル空間への制御転送

正確に・高速に・安全に処理される。


カーネルコンテキストスイッチとアセンブリ

プロセスの切り替えは、単に関数を変えるだけではない。

  • レジスタ状態
  • スタックポインタ
  • ページディレクトリ(MMU)
  • タイマ割り込みリセット

など、完全な状態遷移が発生する。

例:Linux __switch_to() の一部(x86_64)

mov %rsp, TASK_THREAD_STACK(%rdi)  ; 現在のスタック退避
mov TASK_THREAD_STACK(%rsi), %rsp  ; 次のタスクのスタック復元
jmp __switch_to_asm

この部分は最も低レベルなプロセス間制御であり、Cでは表現が不可能に近い。


アセンブリは“構造の継ぎ目”に現れる

UNIXカーネルにおけるアセンブリの出現箇所には法則がある:

構造 なぜアセンブリか
ブート Cが動作不能な段階であり、CPUの物理制御が必要
割り込み処理入口 自動で呼び出されるハード制御、状態保存が重要
システムコール入口 ユーザー空間からの境界遷移を最短距離で捌く
コンテキスト切替 クロス関数・クロススレッド間の論理断裂点
特権レベル切替 カーネルモード ↔ ユーザーモードの物理遷移

→ アセンブリは「表現の限界」ではなく、
**「構造の境界を扱うための必然」**として存在する。


アセンブリにおける“無”の責任

Cで書かれたコードは、コンパイラが最終的に変換してくれる。
しかしアセンブリでは:

  • 命令列の整合性
  • レジスタの使用規約(ABI)
  • 割込みフレームの一貫性
  • MMU/CR3などCPU内部構造への直接操作

すべてが人間の責任で構成される。

これはつまり、**アセンブリとはOS設計における“信仰告白”**でもある。


UNIXの“設計美”を支えるもの

UNIXは「小さく、美しく、完結した構造」を標榜してきた。

しかしその基盤には:

  • アセンブリによって表現された“最小構造の初期化”があり、
  • Cによって書かれた“中庸で保守可能なロジック”があり、
  • ユーザ空間への明示的な“跳躍構造”がある。

このトライアングルの均衡が、UNIXの動的かつ透明な設計美を支えている。


結語:アセンブリはUNIXの沈黙の設計言語である

カーネルの多くはCで書かれている。
だが、カーネルが起動し、割り込みを処理し、プロセスを切り替えるその瞬間は、常にアセンブリが動いている。

アセンブリはそこに記述としては現れないが、構造の前提として存在する。

"Cが構造を表現するなら、アセンブリは構造を成立させる重力である。UNIXとは、その重力を美しく支配した設計だった。"

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?