Linux Kernel Watch

11月版 ドライバに変数を渡すのにうってつけの方法


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

デバイスドライバの変数の設定はどうしたらよいか

 「ユーザー空間からデバイスドライバにパラメータを渡す方法は何がよいのか」という議論がありました。この話題はそれなりに人を引き付けるようで、10月には2つ独立したスレッドがありました。「ioctlを使うのがよいのか、sysfsを使うのがよいのか」という疑問から、「実はそれよりもたくさん選択肢がある」という話題に展開していきました。

 Kyle Moffettたちによると、以下のような選択肢があるとのことです。

  • ioctl
    古くから伝統的に使われている手法です。バイナリ構造体を直接書き込む方式のため、32/64bitが混在する場合は型変換が必要になってしまいます。例えば、x86_64環境で64bitカーネルと32bitのアプリケーションを実行する場合などに問題になります。もちろん欠点ばかりではありません。バイナリ構造体をカーネルに渡し、戻り値を同じ構造体の中に返してもらうということができるため、トランザクション処理には便利です。

  • /dev/以下のファイルに対してread/write(例:/dev/dvb)
    バイナリデータの読み書きが発生するため、ioctlと同様に型変換などの問題が発生します。

  • /procファイルシステム
    昔はよく利用されていたインターフェイスです。/procは今後、できるだけプロセス関連の情報に限定したいので、ハードウェアドライバ関連についてはsysfsを使いましょう。

  • /sysfsファイルシステム
    パラメータごとにファイルを作成し、設定や確認ができるようにします。便利な機能ですが、欠点もあります。例えば、複数のファイルにパラメータを分散した場合、atomicに同時に複数のパラメータを設定することができない(トランザクション処理ができない)という点が挙げられます。

  • モジュール起動時のオプション
    モジュールのパラメータを指定するには簡潔で良い方法ですが、一度起動したものに関しては変更できないという欠点があります。

 これら以外にも、block-driverやnetlink、configfsを使うなどの案もありました。

 Jeff Garzikはalsa-libやlibsdiなどの例を挙げて、「共有ライブラリをユーザー空間に提供して、ユーザープログラムに対しては複雑な内部構造を露呈しない仕組みを提供するのが一番良いのかもしれない」と提案しました。

 好みの問題もあるでしょうし、各手法には一長一短あるため、開発者がドライバに値を渡す方法について悩む日々はまだまだ続きそうです。

2つの-stableリリース

 10月にリリースされた安定版は次の2つです。なお、最近はChris Wright(ChrisW)がリリースしていたのですが、今月は久しぶりに2.6.13.4をGreg Kroah-Hartman(Greg K-H)がリリースしていました。

  • 2.6.13.3(10月3日)
      ・TCP関連の修正
      ・skgeがbondingで動かなかったことに関する修正
      ・UMLのx86_64での修正
      ・IPVS(IP Virtual Server)の修正
      ・IPv6の修正
      ・de_threadでバグ状態を確認する処理自体にバグがあったのを修正
      ・yentaがoopsするのを修正
  • 2.6.13.4(10月10日)
      ・IEEE1394/SBP2デバイスの接続解除時の処理の修正
      ・rinocoドライバのデータをパディングする
      ・TCPのBICのアルゴリズムが間違っていたことの修正
      ・sparc64(SPARC64)のFPUの扱いの修正
      ・CONFIG_AUDITSYSCALLの場合のメモリリーク修正
      ・drmデバッグがどのユーザーでも有効にできてしまっていたのを修正
      ・request_key_authのメモリリークの修正
参考リンク:
2.6.13.yの
gitリポジトリ
(ChrisW)
http://www.kernel.org/git/?p=linux/kernel/git/chrisw/linux-2.6.13.y.git;a=summary
2.6.13.yの
gitリポジトリ
(Greg K-H)
http://www.kernel.org/git/?p=linux/kernel/git/gregkh/linux-2.6.13.y.git;a=summary

メモリ空間のフラグメント化対応

 サーバをしばらく運用していると、いろいろなサイズのメモリ確保や解放が繰り返され、メモリの物理空間はフラグメント化されていきます。そこで、まずはフラグメントの発生を低減するためのパッチをMel Gormanが「Fragmentation Avoidance V19」というタイトルでLKMLに投げました。それに応答して、実装をめぐる熱い議論が展開されました。

 メモリホットプラグなどを実装するには、この機構が必要になるはずとのことです。また、長時間の運用にメモリのフラグメント化は付き物のなので、今後の展開が気になります。

ソースツリーってどうなってるの?

 Paolo Ciarrocchiが、「Linuxのリリースが現在どのように取りまとめられているのか教えてほしい」と質問しました。これに対して、Jaspur Juhlが、「各リリースの情報についてドキュメントにまとめた。カーネルのソースツリーのDocumentation/applying-patches.txtに置いてある」と答えました。

 このドキュメントで、2.6.x.y(-stable)、-rc、-git、-mmの各パッチの場所と、パッチをどのように適用したらよいのかが説明されています。また、それぞれのツリーが持つ意味についても簡単にまとめられています。

 こうしたドキュメントが今後もメンテナンスされていくと便利ですね。

(以上、敬称略)

2/2

Index
Linux Kernel Watch 11月版
 ドライバに変数を渡すのにうってつけの方法
  Page 1
 カーネル2.6.14リリース!
 プライベートネームスペースに懸念
 広がる-RTカーネル
 ディスクI/Oとniceレベル
  Page 2
 デバイスドライバの変数の設定はどうしたらよいか
 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 記事ランキング

本日 月間