システムコールIF
  プロセス管理
  スレッド管理
  スケジューラ
  時計
  割込処理
  同期処理
  シグナル
  プロセス間通信
  メモリ管理
  ファイルシステム
  デバイスドライバ
  ネットワーク

  モノリシックK
  ソースツリー

 システムコールインターフェイス
 ・時間の計算
 ・APとカーネル
 ・カーネルのユーザコンテキスト
 ・2.6で、vsyscallのために glibc と gdb を変更
 ・カーネルのプロセス空間へアクセス時の、処理データのチェック
 ・カーネルのプロセス空間へアクセス用関数

 プロセス管理
 ・プロセスの作成と破棄、および外界への接続(入力と出力)の処理
 ・管理するためのデータ構造を用意
プロセス毎にそのプロセスを管理するためのデータ構造を用意
生成の際に、メモリ領域を割り当て、優先度を設定
プロセスID(pid)、プロセスループID、セッションID
実行優先度、プロセス空間情報、利用中のファイルに関する情報
 ・プロセスの生成、実行を管理
プログラムを実行している状態、psで表示
 ・プロセスは独立して動作
カーネル上で各プロセスは独立して動作
プロセス間通信を利用して、複数のプロセスが連携して動作可能
 ・プロセスの状態は2つ
実行可能プロセス
実行中のプロセス~プロセススケジューラ~実行待ちプロセス
待機状態プロセス
 ・プロセスとして実行されるプログラムのモード
特権モード(カーネルモード、スーパーバイザモード)
非特権モード(ユーザモード)
カーネルのサービスが必要な場合、システムコールを発行

 スレッド(コンテキストと同意)管理
 ・一種のプロセスとして実装
プロセススケジューラから見た場合、スレッドとプロセスは同じ存在
 ・スレッド間でプロセス空間を共有する。
メモリ共有
スレッド同士で関係情報を保持する。
 ・マルチスレッドアプリケーション
スレッドをいくらでも発生できる。
カーネルスレッド(コンテキスト)は概ね1つ
他のスレッドが動いては困る場合は、排他制御を行う。
 ・2.6の、POSIXスレッド
NPTL(Native Posix Thread Library)へ変更(旧 Linux Threads は廃止)
futex(fast userspace mutex)を使用
 ・2.6の、futex 追加
プロセスに対して待ち合わせと起床の機能を提供
待ち合わせが無い時はシステムコールを発行しない。
 ・2.6の、epoll 追加
ファイルディスクリプタのI/O待ち合わせ処理を効率化

 プロセススケジューラ
 ・プロセスがCPUを共有する方法を制御するスケジューラーもプロセス管理の一部
 ・プロセスの実行時間を決める。
どのプロセスへどのくらいの実行時間を割くかを決める。
 ・2.4までのランキュー(実行プロセスを管理するキュー)は1つ
タイムスライス(平均割当時間)を使い切ったプロセスがある場合、
全てのプロセスの優先度を再計算
その間CPU毎の平行処理が行えない(プロセス切替時にCPUの競合発生)
再スケジュールにプロセス数に比例した時間がかかる、性能低下
 ・オーダーワンスケジューラ 「O(1)」
CPU毎にランキューを準備し、CPUの競合をなくす。
ユーザとの対話的プロセスへの対応強化
プロセスの切替を起こりやすくする。
優先的にスケジューリングを行う。

 時計
 ・時間の計算
割込処理自体を応答性が必要な部分と必要でない部分に分ける方式
 ・ハードウェアのカレンダ
起動時にxtime変数へ反映
BIOSで設定
 ・内部時計とHWカレンダの同期
# hwclock オプション
 ・タイムスタンプカウンタ
Intel x86 CPU、TSC(タイムスタンプカウンタレジスタ)
 ・時刻の取得
 ・タイマーリスト
「登録した一定時間後にコールバックされるパンドラ」を登録する仕組み
タイマーリスト操作関数
プロセススケジューリングとタイマーリスト機能の組合わせ
 ・インターバルタイマー
絶対時間指定タイマー
タイマーリストを利用
システムが経過した絶対時間でシグナルを発生
実行時間指定タイマー
 ・POSIXタイマー
 ・workqueue

 割込処理
 ・伝統的UNIXの方式(割込レベル)とは少し異なる方針で実装
割込処理自体を応答性が必要な部分と必要でない部分に分ける方式
マルチプロセッサ対応
HW割込みコンテキスト
遅延割込み処理(SW割込みパンドラ又は、tasklet)
プロセッサ間割込み
 ・NMI
割込み禁止が出来ない
特殊用途に使用

 同期処理
 ・出力等のプロセス実行中に、他のスレッドが働いては困るときに使う排他制御
クリティカルセクション(排他制御を行う区間)
 ・プロセスコンテキスト同士の排他処理
 ・カーネルの割込みコンテキストでのクリテカルセクション保護
スピンロック仕様

 シグナル
 ・プロセスへ非同期事象を伝える。
 ・シグナルの種類
 ・リアルタイムシグナル
 ・シグナル処理
 ・デフォルト動作
 ・waitシステムコール

 プロセス間通信
 ・プロセス管理で行う、信号、パイプ、又はIPCプリミティブを介した通信
  (含む、外界への接続(入力と出力))

 メモリ管理
 ・物理メモリと仮想メモリを用いてデータを管理する。
 ・各プロセスに対して、物理メモリに対応した仮想アドレスを割当てる。(大容量化が可能)
 ・各プロセスに対して固有の仮想アドレスを割り振る。(独立したメモリ空間)
 ・仮想記憶
アドレス変換を行う。
カーネル空間のレイアウトを行う。
実ページの管理を行う。
動的メモリ割当てを行う。
プロセスの仮想記憶の実現を行う。
ページの回収処理を行う。
 ・2.6での追加機能
bioインターフェース、rmap(revers map)、
HugeTBL追加、NUMA (Non Uniform Memory Access)

 ファイルシステム
 ・記憶装置上のデータに対してファイルという形式を通して一貫したアクセス手順を提供
全てのファイルはルートからのツリー状へまとめ、管理
 ・ファイル
カーネル内のデータ構造をファイルとして扱える。
デバイスをファイルとして扱える。
 ・ファイルのデータ型
 ・データ構造
 ・プロセスとiノード間の階層構造
 ・ファイルへのアクセス
 ・キャッシュ機構
 ・仮想ファイルシステム(VFS)
 ・ファイルのデータ型  ジャーナリング(ログ)ファイルシステム
 ・ext3 動作
 ・2.6での追加機能
XATTR、quata (ユーザのファイル使用量の制限)v2サポート、
ブロックデバイス関連の変更
2T以上のHDD対応
LVM2 (Logical Volume Manager)を追加
request queue のロックをデバイス単位に行う。

 デバイスドライバ
 ・デバイス制御のために、カーネルに埋め込まれる。
 ・ファイルシステムの要求に応じて、実際の入出力処理を行う。
 ・ドライバモデル
2.6から、デバイスドライバに共通な処理を抽象化
2.6から、管理情報を、sysfs 経由で取得できる。
 ・ACPI ドライバ
2.6で、多くの機能が使用可能となる。
 ・サウンドドライバ
2.6から、ALSA を追加
 ・USBドライバ
2.6から、USB 2.0 を追加
 ・コンソールドライバ
2.6から、複数のキーボードとDISPを接続可
 ・フレームバッファデバイス
vesafb

 ネットワーク
 ・OSI参照モデルとTCP/IPの階層モデル
 ・階層モデルでのAPI(アプリケーションインターフェース)
隣り合う階層間で、APIを提供
上位層は直下の層のみのAPIを使用
下位層は直上の層のみのAPIを使用
 ・TCP/IPプロトコルスタックの階層
 ・TCP/IPプロトコルスタックの特徴
 ・ネットワーク実装の全体図
 ・ネットワーク(Berkeley ソケットインターフェース)実装
 ・ソケットへのプロトコル登録・削除
sock_register プロトコル登録関数
sock_unregister プロトコル削除関数
struct net_proto_family を登録
 ・ソケット専用システムコール
 ・ソケットAPIを、glibc によるラッパーとして実装
 ・ソケットが管理する送受信データ
 ・sockfs
 ・struct sk_buff
 ・NICとカーネルのインターフェース
 ・IPv4通信
 ・IPv4ソケット作成
 ・ルーティング仕組み
 ・ルーティング処理
 ・受信処理 (関数の流れ)
 ・送信処理 (関数の流れ)
 ・IPヘッダチェックサム
 ・リアセンブル処理
 ・ARP解決
 ・ICMP
 ・UDP
 ・IPv6スタック
実装面から見た基本的な構造は、IPv4と同じ
 ・パケットフイルタリング
Netfilter (Iptables)
 ・NAT
Netfilter (Iptables)

 モノリシックカーネル(Linux:monolithic kernel)
 ・Linuxカーネルコード
機能毎に大まかに分類
 ・様々なサービスを提供するルーチンを内部に用意する。
 ・周辺機器の種類や、ファイルシステムの種類が増えると肥大化する。
 ・複数の機能部品が依存しあい、変更に手間取る。
 ・システムメモリ領域を共有化すると、一部の障害が全体障害につながる。
 ・機能部品のモジュール(基本単位)化
モジュール同士の独立性を高める。
モジュール間の通信をサブルーチンの呼び出しで行う。
モジュール間の依存関係を整理、不要な場合、アンロード
モジュールの性能、カーネルコア内のサブルーチンと比較で、差はほとんど無い。
 ・ダイナミックローディング
システム動作中に動的にモジュールをロード、アンロード
アンロード、メモリ節約
ロード、テストが容易
ネットワーク
ファイアウォール
SCSI
サウンド

 カーネルソースツリー
 ・基本機能
init/   起動、初期化処理
ipc/   プロセス間通信、system V
 ・ipc、共有メモリ、セマフォ、メッセージ
kernel/    カーネル基本機能
mm/    メモリ管理
 ・アーキテクチャ依存部
arch/各種CPUアーキテクチャ依存したコード
 ・入出力(i/o)
block/    ブロックi/o
drivers/    デバイスドライバ
fs/仮想fs/各種fs    ファイルシステム
net/    ネットワーク
sound/    サウンド
 ・セキュリティ
crypto/    暗号処理
security/    セキュリティ
 ・ライブラリ、ツール
Documentation/
include/    カーネルヘッダファイル
lib/    カーネル内ライブラリルーチン
scripts/    コンパイルツール
usr/    カーネル内ツール