9月版 ユーザー空間でのデバイスドライバ作成に道開ける


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2007/10/1

linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。2007年8月のLKMLでどんなことが起きたのか見てみましょう。

Kernel Summitを経て2.6.23リリースへ進む

 8月にLinusがリリースしたLinuxカーネルを見てみましょう。次の4つの-rcリリースが出ました。

バージョン 日付
2.6.23-rc2 8月4日
2.6.23-rc3 8月13日
2.6.23-rc4 8月28日
2.6.23-rc5 9月1日
8月中にリリースされた-rcリリース

 この時期はいつもより若干頻繁にリリースしたように見えるのは、9月の第1週にKernel Summitがあった関係でしょうか。そこまでに一区切りさせようという意図もあったのかもしれません。なお、Kernel Summitの作業環境はカーネルハック向きではなかったようで、この期間中はリリースはありませんでした。

 8月も2.6.23-rc2のリリースに際して、Linusが相変わらず大規模なマージを行っていることに対し、議論が起こりました。基本的に「大きな変化はrc1までのマージウィンドウで導入し、それ以降は安定化を目指す」という方針が示されているのですが、実行となると方針どおりではありません。

 これまでずっとAdrian Bunkが担当していた-rcリリースに対するリグレッショントラッキングは、5月の2.6.21以降、Michal Piotrowskiが担当しています。Linux Kernel NewbiesのKnown Regressions Wikiページと連携してリグレッションをトラッキングし、担当者に修正を促すメールを出す形式にしたようです。

 リグレッションがWikiページの上で明確化されたという部分は進歩ですが、まだまだ手作業による部分も多く残っています。そこで、どのようにbugzillaと連携すべきかなどの点で、Andrew MortonやLinusを交えて議論がありました。「技術ですべてが解決できるわけではない、運用が大切なのだ」「いや、しかし、すでに存在する技術は活用すべきだ」と結論は出たものの、当面はWikiとメールを併用しての運用が続きそうです。

 Kernel Summitの影響で、rc5からrc6の間は間隔が空いていたのですが、発現しやすいバグが2つ発見されました。1つは、ネットワーク関連でのNULLの確認漏れによりカーネルパニックが発生する問題です。もう1つは、ata_piix関連でのNULL終端漏れのバグです。

 最新版を追跡しているユーザーの中には、これらに痛めつけられた人も多いかもしれません。しかしテストをしないと発見されないバグなので、めげずに-rcリリースのテストを続けていってほしいものです。

関連リンク:
Linux Kernel NewbiesのKnown Regressionsのサイト
http://kernelnewbies.org/known_regressions/

UIO:ユーザー空間でデバイスドライバ作成が可能に

 UIOがLinux Kernel 2.6.23-rc1でマージされました。UIOはユーザー空間でドライバを作成するための仕組みです。Hans-Jürgen Kochの提案したパッチで、Greg K-H経由でマージされています。

 私見になってしまいますが、カーネル開発には、ユーザー空間にない次のような各種のハードルがあるため、カーネル開発ができる技術者は限られてしまいます。

  1. Linux Kernel APIのみを使った生のC言語での開発を強いられ、ユーザー空間で活用できる各種共有ライブラリどころか、標準Cライブラリの関数すら利用できない。なおかつ、Linux Kernel APIは頻繁に変更されるので、カーネル本体の開発を追いかけていないと開発に支障が出る

  2. Makefileの書き方、Kconfigファイルなど、Linux Kernel独自のビルドシステムを理解する必要がある

  3. ドライバ開発では、バグがあればデッドロックやカーネルパニックが発生することがある。デバッグに使えるデバッガなどのツールも最近整備されてきたとはいえ、ユーザー空間に比べると貧弱。しかもカーネル空間のドライバは、ユーザー空間でいうrootユーザーよりも強力な、アクセス権限でメモリを破壊できる権限で動作し、エラーに対して寛容でない

 UIOは、これらのハードルがあるカーネル空間でのドライバ開発部分をテンプレート化することで簡便にしてしまいます。一部の定義をカーネル空間で用意する必要がありますが、大半の部分をユーザー空間だけで実装できるようです。メモリにデバイスのレジスタなどさえマップできればよい、あるいは割り込みの通知さえ行えればよいのであれば利用できます。

 ユーザー空間でUIOを利用する側からは、/dev/uio0をopenしてmmapすると、デバイスのメモリ空間が見えます。また/dev/uio0からreadすると、割り込みが起きるまでブロックし、発生した割り込みの回数を32-bit integerで取得できます。この仕組みを利用するためにUIOのカーネル側で必要な準備としては、uio_info構造体を定義する最低限のカーネルモジュールを定義するだけです。

 ユーザー空間でファイルシステムを実装できるモデルを採用したFUSE(Filesystem in Userspace)が普及した前例もあります。ここから連想すると、UIOの導入により、これまでカーネルのドライバを書かなかった、あるいはカーネル開発に参加してこなかった新たな層が参加してくる可能性がありますね。今後どういうものが出てくるのかが楽しみです。

参考:
カーネルソースツリーの
Documentation/DocBook/uio-howto.tmp
UIO HOWTO
drivers/uio/uio_cif.c UIOを利用したサンプルドライバのカーネル側の実装

注:FUSEについては、Linux Kernel Watchの
2005年4月版 カーネル2.6.11.yのメンテナは嫌なヤツ?
2005年5月版 BitKeeperからgitへ、ソースコード管理ツール大変更
2005年8月版 割り込み頻度変更で消費電力は低下するか?
2005年10月版 Reiser4と激怒するLinuxカーネル開発者たち」 も参照。

公平なスケジュールって何?

 Ingo Molnarは新しいスケジューラ「Completely Fair Scheduler(以下CFS)」を提案し、2.6.23-rc1でマージされました。

 CFSは、CPUを理想的に分割してプロセスを実行できるものであると仮定し、「公平に」CPU時間を割り当てるというものです。「本来ならばこれくらいの時間実行されているはずだったのに、まだそれだけ実行されていないプロセス」というものがあれば、それを優先的に実行するという手法を取るようです。

 Roman Zippelがコメントし、「計算式が複雑過ぎるのではないか」「32bitの整数で割り算しているので、計算の精度が簡素過ぎるのではないか」「実行時間を計測するにはjiffiesの精度(Hzで定義されており、1秒間に100/250/1000回程度など)が不十分なのではないか」「特に組み込み用途の非力なCPUだと問題が大きくなるのではないか」などと多数の意見を出しました。

編注:jiffiesは、Linuxのタイマ割り込みの周期ごとにインクリメントされる変数。

 IngoとRomanを中心とした議論は延々と続き、いくつかのコードが提示されましたが、結論となるものは出ないままCFSはメインラインに入っています。

 スケジューラが新しくなると、現場に投入されたときの挙動や安定性が気になります。広く普及する前にみんなで試して問題を洗い出しておきたいところですね。

参考:
カーネルソースツリーの
Documentation/sched-design-CFS.txt
CFSの設計についての文書
カーネルソースのkernel/sched.c スケジューラ関連

1/2

Index
Linux Kernel Watch 9月版
 ユーザー空間でのデバイスドライバ作成に道開ける
Page 1
 Kernel Summitを経て2.6.23リリースへ進む
 UIO:ユーザー空間でデバイスドライバ作成が可能に
 公平なスケジュールって何?
  Page 2
 メモリアロケータに新たな選択肢
 メンテナンスの頻度は二極化? -stableの進捗

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間