1.3 カーネルとシェル
Kernel and Shell
カーネルはハードウェアを抽象化しプロセスを管理する。シェルはユーザーとカーネルの間に立ち、コマンドを解釈して実行する。
システム構造
@startuml
!theme plain
skinparam backgroundColor #FEFEFE
rectangle "ユーザー" as User #FEF3C7
rectangle "ユーザー空間" as Userspace #DBEAFE {
rectangle "アプリケーション\n(firefox, vim, python)" as Apps
rectangle "シェル\n(bash, zsh)" as Shell
rectangle "ライブラリ\n(glibc)" as Lib
}
rectangle "カーネル空間" as Kernelspace #FECACA {
rectangle "システムコール\nインターフェース" as Syscall
rectangle "プロセス管理" as Process
rectangle "メモリ管理" as Memory
rectangle "ファイルシステム" as FS
rectangle "デバイスドライバ" as Driver
}
rectangle "ハードウェア\n(CPU, RAM, Disk, NIC)" as HW #E5E7EB
User --> Shell
Shell --> Apps
Apps --> Lib
Lib --> Syscall
Syscall --> Process
Syscall --> Memory
Syscall --> FS
Process --> Driver
Memory --> Driver
FS --> Driver
Driver --> HW
@enduml
図1: Linuxシステムの層構造
Linuxシステムはカーネル空間とユーザー空間に分離される。カーネルは特権モードで動作し、ハードウェアに直接アクセスできる。ユーザープログラムはシステムコールを通じてカーネルの機能を利用する [1]。
カーネルの役割
| 機能 | 説明 |
|---|---|
| プロセス管理 | プロセスの生成・終了・スケジューリング |
| メモリ管理 | 仮想メモリ、ページング、メモリ保護 |
| ファイルシステム | VFS抽象化、ext4/xfs/btrfs等のサポート |
| デバイス管理 | ドライバによるハードウェア抽象化 |
シェルの役割
@startuml
!theme plain
skinparam backgroundColor #FEFEFE
actor ユーザー as User
participant "シェル\n(bash)" as Shell
participant "カーネル" as Kernel
participant "プログラム\n(ls)" as Prog
User -> Shell : コマンド入力\n"ls -la"
Shell -> Shell : 構文解析
Shell -> Kernel : fork()
Kernel -> Prog : execve("/bin/ls")
Prog -> Kernel : システムコール\n(read, write)
Kernel --> Prog : 結果
Prog --> Shell : exit
Shell --> User : 出力表示
@enduml
図2: シェルによるコマンド実行の流れ
| シェル | 特徴 |
|---|---|
| bash | 最も普及、POSIX互換、多くのディストリビューションの標準 |
| zsh | 高機能な補完、プラグイン拡張(oh-my-zsh) |
| fish | ユーザーフレンドリー、構文ハイライト標準 |
# 現在のシェルを確認
echo $SHELL
# 利用可能なシェル一覧
cat /etc/shells
出典
[1] Love, R. (2010). Linux Kernel Development, 3rd Edition. Addison-Wesley.
[2] man bash - GNU Bourne-Again SHell.
[2] man bash - GNU Bourne-Again SHell.