Linux Kernel Conference 2004

最新Linuxデバイスドライバ開発応用- 新時代のドライバ / カーネル・モジュール開発 -株式会社デバイスドライバーズ
info@devdrv.co.jp
日高亜友2004/10/14

Device Drivers Limited1

確認：デバイスドライバ
n

デバイス入出力システムコール処理の流れ
アプリケーション
ユーザ・ライブラリ

ユーザ空間

システムコール・ライブラリ
トラップ
システムコール・インタフェイス

デバイスドライバ

システム空間モジュール

カーネル
ハードウェア
2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited2

確認：ローダブル・モジュール
スタティックリンクのドライバ

ローダブルモジュールのドライバ

アプリケーション

アプリケーション

カーネル

カーネル

デバイスドライバ

ローダブル
モジュール

ハードウェア

2004/10/14

Linux Kernel Conference 2004

ダイナミッ
クロードIF

ハードウェア

Device Drivers Limited

3

最新Linuxデバイスドライバ開発応用n

現状と問題点n

対応策
デモンストレーション
今後の見通しnn

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

4

現状と問題点n

ハードウェア進化への対応
nnnプロセッサ技術の進化
バスとドライバの進化

カーネル2.6の功罪
nn

2004/10/14

カーネル2.6のセールスポイント
カーネル2.6の問題点

Linux Kernel Conference 2004

Device Drivers Limited5

プロセッサ技術の進化：用語(1)n構成による分類nn
nn

UP (Uni Processor)
SMP (Symmetric Multi Processor)
ASMP (Asymmetric Multiple Processor)

実装技術
n

SMT (Simultaneous Multi-Threading)n Intel Hyper-Threadingnn
2004/10/14

CMP (Chip Multi Processor)
VLIW (Very Long Instruction Word)
Linux Kernel Conference 2004

Device Drivers Limited

6

プロセッサ技術の進化：用語(2)nマルチプロセッサ・アーキテクチャ分類nnn

UMA (uniformed memory access)
NUMA (non- uniformed memory access)
NORMA (no-remote memory access)n shared nothing, cluster, grid computer

2004/10/14

memorycpu1 cpu2

memorycpu3 cpu4

cpu5 cpu6
memorycpu7 cpu8
memoryLinux Kernel Conference 2004

Device Drivers Limited7

プロセッサ技術の進化
n

CPUアーキテクチャの進化n

ムーアの法則の継続
n 増加したトランジスタ数の使い道は？

n

UPからCMPへ
n 既存リソースの活用

互換性!?
nVLIWは？
n Transmeta vs. Intel ia64

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

8

マルチプロセッサ技術の進化予測n

今はどこにいるか？
NUMA
SMP
SMT/HT
CMPUP

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

9並列処理による性能向上
nnUP
nマシン語、uOPレベル（デコーダと演算器の仕事）n

スーパースカラー

VLIW
nn

コンパイラレベル（コンパイラの仕事）

マルチプロセッサnn

2004/10/14

ソースコードレベル（プログラマの仕事）
OSはサポートするだけLinux Kernel Conference 2004

Device Drivers Limited

10

バスとドライバの進化n

新しいバス規格
nn
n
n

SATA
PCI-Express
802.11xUWB (wireless USB)n

現状のドライバ実装
nnn
n

レガシーデバイス
ブロックIO, Storage
非HotPlug対応
非PowerManagement

デバイスドライバ、カーネル・モジュールの開発負担
2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

11

現状と問題点n

ハードウェア進化への対応
nnnプロセッサ技術の進化
バスとドライバの進化

カーネル2.6の功罪
nn

2004/10/14

カーネル2.6のセールスポイント
カーネル2.6の問題点

Linux Kernel Conference 2004

Device Drivers Limited

12

カーネル2.6の功罪n

カーネル2.6のセールスポイントn

マルチCPU対応の強化とスケジューラの改良
n NUMA, O(1)スケジューラ, プリエンプショ
ン・カーネルnn

メモリ管理の改良
ブロックIOの改良
n IOスケジューラ

nn

ネットワーク機能強化
他プロジェクトのマージ
n uclinux, SELINUX, oprofiler, …

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited13

カーネル2.6の功罪(2)nカーネル2.6の問題点
n

作り手側のメッセージ（情報）ばかりが強調されていて、ユーザ側開発者の立場に立ったメリット、デメリットが見えて来ないLinuxを取り巻く環境
ユーザ開発者
カーネル開発者

2004/10/14

Linux企業

Linux Kernel Conference 2004

エンドユーザ

Device Drivers Limited

14

ユーザ開発者にとってのメリットn

HZ(jiffies)の変更
nn

ドライバ周りの整理と改良
nnjiffiesが64bitになってオーバーフローしなくなった
USB, サウンド, IPV6, …

SYSFSの恩恵

パワーマネジメントの恩恵
n スケジューラの選択とチューニング（ができる）
n VLM/dm, IPV6, 機能強化と新機能
n2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

15

ユーザ開発者にとってのデメリットn

HZ(Jiffies)の変更
n

HZ=100→1000:チックカウントが１０倍に増えた！
n jiffies間隔: 10ms→1ms
n 遅いCPUの採用は想定しない

n2.4以前へのバックポートが保証されない
バックポートに関するLKMLでの議論
2.6を業務で使っている人はどの位いますか？

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

16

ユーザ開発者にとってのデメリット
n

モジュール・コンパイル手段の変更
nn

簡単では無くなった

sysfsの強要
nprocfs →sysfs

パワーマネジメント対応プログラミング
n スケジューラが安定しない
n マルチプロセッサ対応サービスの不足
nn2004/10/14

2.6に限ったことではないが…
Linux Kernel Conference 2004

Device Drivers Limited

17

問題点の整理と課題n

マルチプロセッサの普及
nn

レガシー資産の蓄積と新デバイス対応
nnプログラムの書き直しが必要

デバイスドライバ開発の負担

カーネル2.6nn

2004/10/14

カーネルのマルチCPU対応と、ドライバの対応は別ユーザ開発者の連係が必要
Linux Kernel Conference 2004

Device Drivers Limited18

最新Linuxデバイスドライバ開発応用n

現状と問題点n

対応策

n

デモンストレーション
今後の見通しn

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

19

対応策
n

まずはコードを書くこと
nn

カーネル2.6のドライバ・モジュール

プログラミングのヒント
n
n
n

n

2.6のドライバを書いた人はいますか？

シリアル処理とパラレル処理
マルチプロセッサ対応プログラミング
ユーザモードとカーネル・モード

カーネル2.6機能の使いこなしnn

2004/10/14

sysfs / kobject / libsysfs / udev
IOスケジューラLinux Kernel Conference 2004

Device Drivers Limited

20

カーネル2.6のモジュール
nモジュール・フォーマットの変更
n*.o → *.kon

コンパイル・リンク方法の変更
ロード方法の変更（新しいmodule_init_tools）

nn

なぜ変更されたかnnn2004/10/14

実装上の問題 （implementation problems）
初期化の問題 （initialization problems）
削除に関する問題 （removal problems）

Linux Kernel Conference 2004

Device Drivers Limited21

カーネル外モジュール用Makefile(1)#TARGET:= hello.ko
all: ${TARGET}

カーネル・ツリー

KBUILD_VERBOSE値
デフォルトは‘0’（サイレント・モード）

hello.ko: hello.c
make -C /usr/src/linux-`uname -r` M=`pwd` V=1 modules
clean:
make -C /usr/src/linux-`uname -r` M=`pwd` V=1 clean
obj-m:= hello.omake
オプション
カーネル・ツリー

clean-files := *.o *.ko *.mod.[co] *~2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited22

カーネル外モジュール用Makefile(2)#TARGET:= hello.ko

参照: Documentation/kbuild/*.txt

all: ${TARGET}
hello.ko: hello1.c hello2.cmake -C /usr/src/linux-`uname -r` M=`pwd` V=1 modules
clean:
make -C /usr/src/linux-`uname -r` M=`pwd` V=1 clean
obj-m:= hello.ohello-objs := hello1.o hello2.oclean-files := *.o *.ko *.mod.[co] *~2004/10/14

Linux Kernel Conference 2004

hello.koを構成する
複数のオブジェクト・モジュール

Device Drivers Limited

23

対応策
n

まずはコードを書くこと
nn

プログラミングのヒントnnnn

カーネル2.6のドライバ・モジュール
シリアル処理とパラレル処理
マルチプロセッサ対応プログラミング
ユーザモードとカーネル・モード

カーネル2.6機能の使いこなしnn

2004/10/14

sysfs / kobject / libsysfs / udev
IOスケジューラ
Linux Kernel Conference 2004

Device Drivers Limited

24

プログラミングのヒントn

シリアル処理からパラレル処理へ
nnn

パラレル処理とシリアライズ、操作の遅延
taskletとtask_queue

排他制御
nn

SpinLockとAtomic操作
マルチプロセッサ(SMP)とHyperThreading(HT)カーネル・スレッドn ユーザモードとカーネルモードn

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

25

シリアル処理とパラレル処理n

マルチスレッド化→パラレル化
AAB

BCCD

D
従来のモジュール
2004/10/14

マルチスレッド化

Linux Kernel Conference 2004

Device Drivers Limited26

スケジュールと遅延実行n

なぜスケジュール、遅延実行するか
nn

優先順位に応じたグルーピングを行って、リソースをバランス良く共有する

カーネル2.6のサポート
nnn

softirqtaskletworkqueue(schedule_task)
n 従来のtask_queueをカーネル2.5で実装し直したn
2004/10/14

カーネルスレッドLinux Kernel Conference 2004

Device Drivers Limited

27

遅延実行: taskletnsoftirq(ソフトウェア割込み）の汎用的な実装
n

割り込みコンテキストの遅延実行
ソフトウェア割り込み(softirq) で実行

n

制限事項：

n

n リソースを待てない
n スリープできない
n ユーザ空間にアクセスできないn スケジューラを起動できない
n セマフォが使えない(SpinLockかatomic操作を使う）

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

28

遅延実行: workqueuen

汎用workqueuennn

システム全体でキューとカーネルスレッドを共有
ユーザエントリの関数の実行が遅れる可能性

専用workqueuennn

専用のカーネルスレッドが割り当てられる
自由にスケジュール可能
特定モジュールが固有のworkqueueを利用
n AIO, BlockIO, …

n
2004/10/14

ドライバ・モジュールがGPLである必要
Linux Kernel Conference 2004

Device Drivers Limited

29

排他制御: SpinLocknn

Atomic操作

2004/10/14

マルチプロセッサで機能する一種の「セマフォ」
シングルプロセッサでは何もしない
CPU0
while (lock != 0);

Atomic操作

CPU1
while (lock != 0);lock=1;

lock=1;

Critical Section

Critical Section

lock=0;lock=0;Linux Kernel Conference 2004

Device Drivers Limited30

SpinLock（２）nSpinLockの実装パターン（模式的な概略）

カーネル2.4

Intel HT推奨

HTスケジューラ

while (lock != 0) ｛while (lock != 0) ｛while (lock != 0) ｛asm(“PAUSE”);

if (condition);schedule();｝2004/10/14｝

Linux Kernel Conference 2004｝

Device Drivers Limited31

SpinLockとHyper Threadingn

SpinLockは万全か？
nnn

記述が簡単、後付けでコーディングできる
取り合えず書いておいても弊害はない
必ずループするn 常時ダーティなメモリアクセス（遅い：キャッシュされない）
n Test and Set命令の頻発による負荷

n

HyperThreadingの問題とスケジューラnn2004/10/14

HT専用スケジューラ
monior/mwait 命令
Linux Kernel Conference 2004

Device Drivers Limited

32

排他制御: Atomic操作n

ループせずに排他制御する切り札
nn

Atomic操作をセマフォとして使う
nn

CPU間で同期を取るために使用できる事が保障されている(Lock命令)
SMPとUPのコードの同一性

SpinLockとの使い分けnn

2004/10/14

2.6のプリエンプティブ・カーネルの登場
SpinLockがプリエンプションを引き起こす

Linux Kernel Conference 2004

Device Drivers Limited

33

Atomic操作（２）プログラム例

natomic̲ta; /* atomic̲set(&a, 1); */Atomic操作で、if (atomic̲read(&a) == 0)
return BUSY;
if (atomic̲dec̲and̲test(&a)) { /* a == 0 */critical();atomic̲inc(&p‑>live)

Atomic値を１減じてその結果の値が‘0’ならばTrue(1)を返す。

} else {atomic̲inc(&p‑>live)
reurn BUSY;Linuxデバドラ本の解説は間違い}

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

34

Atomic操作（3）nAtomic操作関数
atomic_inc_and_test +1して検査

atomic_set

セット

atomic_read

読み出しatomic_add

加算atomic_sub

減算

atomic_inc

インクリメント

atomic_dec

デクリメント

2004/10/14

atomic_dec_and_test -1して検査
atomic_add_and_test 加算して検査
atomic_sub_and_test 減算して検査
atomic_test_and_inc
atomic_test_and_dec

用意されていない!

test_and_set_bit

ビットを立てる

test_and_clear_bit

ビットクリアLinux Kernel Conference 2004

Device Drivers Limited

35

SpinLockとAtomic操作
n

典型的な処理の例
SpinLock

Atomic判定？
成功
失敗

状態調査
処理可能？
成功処理
失敗

Atomic変数復帰

処理
SpinUnLock
2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited36

カーネルスレッドn

ユーザモードカーネルスレッド
アプリケーション

アプリケー
ション

カーネルモード

スレッド

スレッド

スレッド

スレッドは、
2004/10/14

スレッド

スレッド

スケジューリングの単位
プロセッサ割り当ての単位

Linux Kernel Conference 2004

Device Drivers Limited37

カーネルスレッド(2)PID TTYSTATTIME COMMAND

1 ?

S

0:04 init [3]

2 ?

SW

0:00 [keventd]

3 ?

SW

0:00 [kapmd]

4 ?

SWN

0:00 [ksoftirqd̲CPU0]

5 ?

SW

0:48 [kswapd]

6 ?

SW

0:32 [bdflush]

7 ?

SW

0:00 [kupdated]

8 ?

SWN

0:10 [mdrecoveryd]

13 ?

SW<0:04 [raid1d]

14 ?

SWN

0:11 [raid1syncd]

15 ?

SW<0:00 [raid1d]

935 tty1

S

0:00 ‑bash

2540 ?

SW

0:00 [kth̲sleep]

2004/10/14

Linux Kernel Conference 2004

# ps ax の表示例

テスト用に作成したカーネルスレッド

Device Drivers Limited

38ユーザモードとカーネルモード
n

IO処理の高速化
ユーザアプリケーション
バッファ

バッファ

制御アプリケーション
ユーザモード

バッファ
ドライバ

ドライバ

HardwareHardware2004/10/14

カーネルモードLinux Kernel Conference 2004

ドライバ

ドライバ

HardwareHardwareDevice Drivers Limited39

カーネルモード処理の例
n

ネットワークパケット処理の例
パケットキャプチャドライバ

FIFOまたはリング
バッファネットワークデバイス
2004/10/14

Linux Kernel Conference 2004

ファイル
IO
ドライバストレージデバイス
Device Drivers Limited

40

対応策
n

まずはコードを書くこと
nn

プログラミングのヒントnnnn

カーネル2.6のドライバ・モジュール
シリアル処理とパラレル処理
マルチプロセッサ対応プログラミング
ユーザモードとカーネル・モード

カーネル2.6機能の使いこなしnn

2004/10/14

sysfs / kobject / libsysfs / udev
IOスケジューラ
Linux Kernel Conference 2004

Device Drivers Limited

41

sysfs / kobject / udev / libsysfs
n

sysfs
n

n

kobjectnnsysfsの構成要素

udev
n

n

システム、デバイス、バス、ドライバを管理する新しい仮想ファイルシステム

従来のdevfsを置き換える「仮想デバイスノード・ファイル・システム」

libsysfsn

2004/10/14

sysfsにアクセスするライブラリ（udevで使用）
Linux Kernel Conference 2004

Device Drivers Limited42

IO スケジューラn

デバイスIOのスケジューリング
nnelevator = as(anticipatory) 予測スケジューラ(デフォルト)elevator = deadline IO待ちを最小限にする
n ファイルIO、データベース処理

nelevator = cfq (Complete Fair Queuing disk I/O scheduler )n マルチメディア用、レイテンシの押さえ込みnnelevator = noop

IOスケジューラの動的な変更

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

43

まとめ：新時代のプログラミング
根本的には設計段階から考慮する
n パラレル処理とシリアル処理の使い分け
nnnn

リソースを複数個持たせて同時実行
beforeイメージ・ベースのコーディング

SpinLock→Atomic操作の使い分け
nn

ループするだけでは勿体無い…
lockプレフィックス：asm()でオリジナル関数も…

カーネルスレッドの活用
n カーネル内モジュールでの処理
n2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited

44

最新Linuxデバイスドライバ開発応用n

現状と問題点対応策

n

デモンストレーションn

今後の見通しn

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited45

デモンストレーションn

ソースの公開http://www.devdrv.co.jp/download/LKC/
ご自身の責任においてご利用下さいますようお願い致します。

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited46

最新Linuxデバイスドライバ開発応用n

現状と問題点対応策
デモンストレーションn

今後の見通しnn

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited47

今後の見通しn

カーネル2.7は（当分）無い
nn
n
n

n

Linusが2.7の検討よりも2.6の安定化を優先すると考えている(おそらく）2.6は進化し続ける（おそらく）2.4の進化は止まる
CMPが出ると世の中が変わる

Hackする事！
nn

2004/10/14

とにかくテストしてみる
とにかくコードを書く
Linux Kernel Conference 2004

Device Drivers Limited48

ありがとうございました。

2004/10/14

Linux Kernel Conference 2004

Device Drivers Limited49