Linux Kernel Conference 2003

最新Linuxデバイスドライバ
開発手法

株式会社デバイスドライバーズ
2003/10/9

Device Drivers Limited

info@devdrv.com

1

最新Linuxデバイスドライバ開発手法n

プログラミング・テクニックn

デバッグツール
パフォーマンス・ツール
カーネル2.6のトピックス

nn

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited2

プログラミングテクニックnSpinLockとAtomic操作
n

マルチプロセッサ(SMP)とHyperThreading(HT)taskletとtask_queuen /procファイルインタフェイスn2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

3

SMP / マルチプロセッサシステムn

なぜマルチプロセッサシステムを使うかnnnn

少しでも速い処理をさせたい
コスト性能(3.2GHzより2.4GHz×2)
Pentium4に付いてくる(HyperThreading)
SMP vs. HyperThreading vs. Dual Coren 長期的にはHyperThreading→Dual Coreへの流れn

マルチプロセッサシステムの特徴
nn

2003/10/9

多量の重いアプリケーション処理用リソースはふんだんにある場合が多い
Linux Kernel Conference 2003

Device Drivers Limited4

SpinLock（１）nnAtomic操作

2003/10/9

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

Atomic
操作

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

lock=1;

Critical Section

Critical Section

lock=0;lock=0;Linux Kernel Conference 2003

Device Drivers Limited

5

SpinLock（２）nSpinLockの実装パターン（概略）カーネル2.4

Intel HT推奨

カーネル2.6

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

schedule();｝｝;｝

Prescott以後で対応？
2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

6

Hyper Threadingn

2.4.18以降何が変わったか？
nnn

カーネルのスケジューリング
SpinLockの命令は変わったか？

SpinLockは万全か？
nnn

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

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

7

Atomic操作（１）n

ループせずに排他制御する切り札
nnAtomic操作をセマフォとして使う
nn

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

SpinLockとの使い分けnn

2003/10/9

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

Linux Kernel Conference 2003

Device Drivers Limited

8

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デバドラ本の解説は間違い!

}

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

9

SMP / HT時代のプログラミング
nSpinLock→Atomic操作への切り替え
nn

ループする時間に他の仕事をさせる
lockプレフィックス：asm()でオリジナル関数も…

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

リソースがふんだんにある場合根本的には設計段階から考慮する
n カーネル2.6の採用
n2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited10

taskletとtask_queue
ntaskletnn

割り込み時の実行をスケジュールされたルーチン

task_queue(schedule_task)n2003/10/9

空き時間での実行をキューイングされたルーチン

Linux Kernel Conference 2003

Device Drivers Limited

11

taskletnBH(ボトムハーフ）
としての実装nn

割り込みコンテキストの中で実行
制限事項：
n リソースを待てない
n スリープできない
n ユーザ空間にアクセスできないn スケジューラを起動できない

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

12

task_queuenschedule_task
nnn

スケジュール後非割り込み処理ですぐ実行される処理効率は悪くない

Immediate_taskn

直後のBHで直ぐに実行される（割り込み中）n

キューイング処理では一番速い

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

13

/proc ファイルシステム
n/proc/以下のパラメータ・ファイルnn

ソケットや/devデバイスノードの代わりnnn

自由に「無秩序に」使える
システムコール・インタフェイス
サンプル・コード（デモ）補足：カーネル2.6以降はsysfsと棲み分け

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

14

最新Linuxデバイスドライバ開発手法n

プログラミング・テクニックn

デバッグツールn

パフォーマンス・ツール
カーネル2.6のトピックス

n2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited15

デバッグツールn

kdb –静的デバッグ

nkgdb – リモートデバッグn

JTAGデバッガ – ハードウェアデバッグ

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

16

kdb (Built-In kernel debugger)
http://oss.sgi.com/projects/kdb/
n パッチ組込みカーネルデバッガ
n アセンブラレベルのデバッグ
nngcc -S オプションでアセンブラリストを出力する工夫マニュアルやドキュメントが整備されていて紹介サイトが多い
n シリアル・コンソールの工夫！
n

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

17

kdb+シリアル・コンソールn

別マシンからリモート接続する意義
nn
n
n

n

マルチ画面
コントロール+a
カットアンドペースト
キーで呼び出しデバッグ履歴の保存
Kdbのコンソール・キーボード操作の安定

補足：カーネル2.6ではUSBドングル接続が使用可能

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

18

kdb+シリアル・コンソール のデモ環境
2台のPCをシリアルケーブルで115200bps接続
n Develop側で端末エミュレーションソフトを起動
n LANでも接続nTest側

2003/10/9

Develop側

Linux Kernel Conference 2003

Device Drivers Limited

19Kdb＋シリアルコンソールの設定
n/boot/grub/grub.conf

default=0
timeout=10
serial ‑‑unit=0 ‑‑speed=115200 ‑‑word=8 ‑‑parity=no ‑‑stop=1
terminal ‑‑timeout=10 serial console#splashimage=(hd0,1)/boot/grub/splash.xpm.gz
title Red Hat Linux (2.4.20+KDB on SerialConsole) from kernel.org
root (hd0,1)
kernel /boot/vmlinuz‑2.4.20‑kdb ro root=LABEL=/ console=ttyS0,115200n8r
initrd /boot/initrd‑2.4.20‑kdb.img

そのほかに/etc/inittab, /etc/securetty, /etc/sysctl.confの修正が必要

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited20kdbの代表的なコマンドCommandUsageDescription‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
md<vaddr>
Display Memory Contents
mdr<vaddr> <bytes>
Display Raw Memory
mds<vaddr>
Display Memory Symbolicallymm<vaddr> <contents>
Modify Memory Contents
id<vaddr>
Display Instructions
go[<vaddr>]
Continue Executionrd
Display Registersrm<reg> <contents>
Modify Registers
ef<vaddr>
Display exception framebt[<vaddr>]
Stack traceback
btp<pid>
Display stack for process <pid>bta
Display stack all processesps
Display active task list
sections
List kernel and module sections
lsmod
List loaded kernel modules
rmmod<modname>Remove a kernel modulebp[<vaddr>]
Set/Display breakpoints
bl[<vaddr>]
Display breakpoints
bpa[<vaddr>]
Set/Display global breakpoints
bc<bpnum>Clear Breakpointss[<#steps>]
Single Stepssb
Single step to branch/call

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

21kgdb (linux kernel source level debugger )nn

http://kgdb.sourceforge.net/
Cソースコードレベル・デバッガn

カーネル全体と、テストモジュールをframe pointer optionで再コンパイルする必要があるn 例）

gcc –g –fomit-frame-pointer -DKERNEL …

n

2台のPCをシリアルケーブルとLANで接続n

Develop側ではgdbをフロントエンドとして起動n

デバッグする同じカーネルを双方に入れておく
Develop側からroot権限でrshを実行できるようにする

nn 実は結構大変な作業。
デバッグを行う実験ネットは分離する必要。

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited22

kgdb のデモ環境
2台のPCをシリアルケーブルで115200bps接続
n Develop側でgdbをリモート・モードで起動
n LANでも接続
nTest側

2003/10/9

Develop側

Linux Kernel Conference 2003

Device Drivers Limited23

kgdbの設定カーネルパッチを当てる
n リモートからroot権限でrshが使える
nnn

最近のディストリビューションでは難しい場合も設定ファイル
nnnn2003/10/9

rsh-serverのインストール/etc/pam.d以下/etc/xinetd.d以下/etc/hosts.equiv
Linux Kernel Conference 2003

Device Drivers Limited

24gdbの代表的なコマンド
Ctrl-C

ブレーク（中断）q(uit)

終了

r(un) [param]

アプリケーションの実行

l(ist) [func]

ソースの表示p(rint)

変数の表示

x [/形式 アドレス]

メモリの表示h(elp)
bt, whe(re)バックトレース表示b(reak) [行番号 ¦ 関数]

ブレークポイントの設定

i(nfo) b(reak)

ブレークポイントの表示d(elete ) [ブレーク番号]

ブレークポイントの削除

n(ext)

関数の中に入らない（同じレベル）s(tep)

関数の中に入るf(inish)関数の終りまで実行

c(ontinue)
2003/10/9

ヘルプ

継続・実行

Linux Kernel Conference 2003

Device Drivers Limited25

補足：kdbとkgdbの使い分けn

http://kgdb.sourceforge.net/whichdebugger.html

n

kdb
n

Kernelモジュール、ドライバのデバッグ用

nアプリケーションのデバッグにも使える
独自インタフェイスでアセンブラ・レベル

n

n

kgdb
n

大規模Kernelモジュール､ドライバの開発用

nアプリケーションのデバッグとは別環境
強力なgdbフロントエンドとソースコード・デバッグn2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

26

JTAGデバッガ
n

JTAG経由でCPU内蔵のデバッグ機能を使用
nn

サポート・ソフトウェアによる豊富な機能
n
n
n

n

対応CPUが限定される
ソースコード・デバッグ
ブレークポイントトーレスバック

gccとLinux MMUのサポート
n

2003/10/9

カーネルからアプリケーションまでソースデバッグ
Linux Kernel Conference 2003

Device Drivers Limited

27

JTAGデバッガ（続き）
独ロータバッハ社製JTAG Debuggerシリーズ
n 対応CPUnnn

ARM, MIPS, PPC, SH, H8, i186, 各種DSP, FPGA

提供機能

n

ハードウェアデバッグ
ソフトウェア・シミュレータ
ROMエミュレータ

2003/10/9

Linux Kernel Conference 2003

nn

Device Drivers Limited

28

JTAGデバッグ・デモ
nDevice Drivers社製 組み込みLinuxボード
nnnnnnnn

2003/10/9

AMD Au1100 400MHz (MIPS32アーキテクチャ）
128MB RAM(最大256MB), 8MB Flush ROM
CF Type2 × 2, UART × 3, IrDA
LAN, USB Host/Target
内蔵LCDコントローラ
GPIO
名刺２枚サイズ
低消費電力
Linux Kernel Conference 2003

Device Drivers Limited

29

最新Linuxデバイスドライバ開発手法n

プログラミング・テクニック
デバッグツールn

パフォーマンス・ツールn

カーネル2.6のトピックス

n2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited30

パフォーマンスツール
nKernprof (Kernel Profiling)nn

Lockmeter (Linux kernel lock-metering)nn

SpinLockメータ

PerfCtr(memory profiling tool)nnn

カーネル・プロファイリング

カーネル・プロファイラ
Hardmeter=メモリ・プロファイリング

Oprofilen

2003/10/9

システムワイド・プロファイラ
Linux Kernel Conference 2003

Device Drivers Limited31

Kernprof
http://oss.sgi.com/projects/kernprof/n カーネル内ルーチンのプロファイラ
nn

カーネルパッチ＋kernprofコマンド

出力結果(gmon.out)をgprofで処理可能
n i386, ia64をサポート
nn

他のアーキテクチャ用は個別に移植されている
n PowerPC, ARMn

現在は2.4.20用が最新版
n カーネル2.6対応作業中2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited

32

Lockmeter
http://oss.sgi.com/projects/lockmeter/n Kernel Spinlock Metering for Linuxnn

SpinLockの利用状況のレポート

カーネルパッチ＋lockstatアプリケーション
n i386, ia64, Alpha, Sparc64, mips64をサポート
nnn

2003/10/9

カーネル2.6対応作業中
公開版では2.4.18 / 2.5.17が最新版となりメンテナンスされてない→実験研究用
Linux Kernel Conference 2003

Device Drivers Limited33

PerfCtr とhardmeternnn

http://user.it.uu.se/~mikpe/linux/perfctr/
PerfCtr – カーネルパッチ形式のモニタドライバ
nx86ファミリ向け(P6-Xeon, K7, K8, Geode, C3)nローダブル・モジュールまたは組み込み形式

n

アプリケーション・ライブラリの提供と多数の派生プロジェクト

hardmeter, xhardmeter – パッチ＋アプリケーションn

http://sourceforge.jp/projects/hardmeter/
Pentium!!!以降のCPUのパフォーマンス・レジスタを使用

n

メモリ・プロファイリング

nn キャッシュメモリの利用状況をレポートn
2003/10/9

IPA2002年度「未踏ソフトウェア創造事業」の成果
Linux Kernel Conference 2003

Device Drivers Limited

34

Oprofiler
http://oprofile.sourceforge.net/
n システムワイド・プロファイラ
nn

アプリケーションデーモン＋ローダブルモジュール
カーネル・パッチは不要！

nモジュールはカーネル2.6からサポートされている

nni386, ia64, Alpha, Athlon, Hammerをサポート
nnn

2003/10/9

豊富な実行時オプション
独自のGUI(Qt対応）
Gprof互換のフォーマッタ(opgprof)
Linux Kernel Conference 2003

Device Drivers Limited

35

最新Linuxデバイスドライバ開発手法n

プログラミング・テクニック
デバッグツール
パフォーマンス・ツールn

カーネル2.6のトピックス

nn

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited36

sysfsとkobjectn

新しいドライバ・モデルの導入
nnn/sys以下に論理接続・物理接続
PnP, hotplugとの連携

新しいモジュール・フォーマット
n.o → .kon

複雑になったコンパイル・リンク手順
n modpostの登場
n Russelの新しいmodule-init-tools

2003/10/9

Linux Kernel Conference 2003

Device Drivers Limited37

hotplugnPnPとhotplugの違い
nn

PnP, hotplugできないデバイスが例外扱いになる

hotplugは広範囲なサポートへn

現在：n USB, IEEE1394, Network, PCI(CardBus), IBM Channeln開発中：
n Dock, Input, PCI(ext.), SCSI, Memory, CPU, IDEndevfs → udevへの交代
n2003/10/9

devfsはudevに置き換えられていずれ無くなるLinux Kernel Conference 2003

Device Drivers Limited

38

パワーマネジメントn

ACPIの本格的サポート
n

S1, S3, S4をサポート
n - On - Standby - Suspend - Hibernate - EmergencynUsbほか、関連デバイスドライバの書き換え

hotplugとの連携
n sysfsとの連携
nn

2003/10/9

完全なパワーマネジメント実現の目的

Linux Kernel Conference 2003

Device Drivers Limited39

補足資料：システムコール
n

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

ユーザ空間

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

デバイスドライバ

2003/10/9

システム空間カーネル

Linux Kernel Conference 2003

Device Drivers Limited40

補足資料：ローダブル・モジュール
スタティックリンクのドライバ

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

アプリケーション

アプリケーション

カーネル

カーネル

デバイスドライバ

デバイス
ドライバ

ハードウェア

2003/10/9

Linux Kernel Conference 2003

ダイナミッ
クロードIF
ハードウェア

Device Drivers Limited41