162306a36Sopenharmony_ciNOTE: 262306a36Sopenharmony_ciThis is a version of Documentation/process/stable-api-nonsense.rst into Japanese. 362306a36Sopenharmony_ciThis document is maintained by IKEDA, Munehiro <m-ikeda@ds.jp.nec.com> 462306a36Sopenharmony_ciand the JF Project team <http://www.linux.or.jp/JF/>. 562306a36Sopenharmony_ciIf you find any difference between this document and the original file 662306a36Sopenharmony_cior a problem with the translation, 762306a36Sopenharmony_ciplease contact the maintainer of this file or JF project. 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciPlease also note that the purpose of this file is to be easier to read 1062306a36Sopenharmony_cifor non English (read: Japanese) speakers and is not intended as a 1162306a36Sopenharmony_cifork. So if you have any comments or updates of this file, please try 1262306a36Sopenharmony_cito update the original English file first. 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciLast Updated: 2007/07/18 1562306a36Sopenharmony_ci================================== 1662306a36Sopenharmony_ciこれは、 1762306a36Sopenharmony_cilinux-2.6.22-rc4/Documentation/process/stable-api-nonsense.rst の和訳 1862306a36Sopenharmony_ciです。 1962306a36Sopenharmony_ci翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 2062306a36Sopenharmony_ci翻訳日 : 2007/06/11 2162306a36Sopenharmony_ci原著作者: Greg Kroah-Hartman < greg at kroah dot com > 2262306a36Sopenharmony_ci翻訳者 : 池田 宗広 < m-ikeda at ds dot jp dot nec dot com > 2362306a36Sopenharmony_ci校正者 : Masanori Kobayashi さん < zap03216 at nifty dot ne dot jp > 2462306a36Sopenharmony_ci Seiji Kaneko さん < skaneko at a2 dot mbn dot or dot jp > 2562306a36Sopenharmony_ci================================== 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciLinux カーネルのドライバインターフェース 3062306a36Sopenharmony_ci(あなたの質問すべてに対する回答とその他諸々) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciGreg Kroah-Hartman <greg at kroah dot com> 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciこの文書は、なぜ Linux ではバイナリカーネルインターフェースが定義 3662306a36Sopenharmony_ciされていないのか、またはなぜ不変のカーネルインターフェースを持たな 3762306a36Sopenharmony_ciいのか、ということを説明するために書かれた。ここでの話題は「カーネ 3862306a36Sopenharmony_ciル内部の」インターフェースについてであり、ユーザー空間とのインター 3962306a36Sopenharmony_ciフェースではないことを理解してほしい。カーネルとユーザー空間とのイ 4062306a36Sopenharmony_ciンターフェースとはアプリケーションプログラムが使用するものであり、 4162306a36Sopenharmony_ciつまりシステムコールのインターフェースがこれに当たる。これは今まで 4262306a36Sopenharmony_ci長きに渡り、かつ今後も「まさしく」不変である。私は確か 0.9 か何か 4362306a36Sopenharmony_ciより前のカーネルを使ってビルドした古いプログラムを持っているが、そ 4462306a36Sopenharmony_ciれは最新の 2.6 カーネルでもきちんと動作する。ユーザー空間とのイン 4562306a36Sopenharmony_ciターフェースは、ユーザーとアプリケーションプログラマが不変性を信頼 4662306a36Sopenharmony_ciしてよいものの一つである。 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci要旨 5062306a36Sopenharmony_ci---- 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ciあなたは不変のカーネルインターフェースが必要だと考えているかもしれ 5362306a36Sopenharmony_ciないが、実際のところはそうではない。あなたは必要としているものが分 5462306a36Sopenharmony_ciかっていない。あなたが必要としているものは安定して動作するドライバ 5562306a36Sopenharmony_ciであり、それはドライバがメインのカーネルツリーに含まれる場合のみ得 5662306a36Sopenharmony_ciることができる。ドライバがメインのカーネルツリーに含まれていると、 5762306a36Sopenharmony_ci他にも多くの良いことがある。それは、Linux をより強固で、安定な、成 5862306a36Sopenharmony_ci熟したオペレーティングシステムにすることができるということだ。これ 5962306a36Sopenharmony_ciこそ、そもそもあなたが Linux を使う理由のはずだ。 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ciはじめに 6362306a36Sopenharmony_ci-------- 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciカーネル内部のインターフェース変更を心配しなければならないドライバ 6662306a36Sopenharmony_ciを書きたいなどというのは、変わり者だけだ。この世界のほとんどの人は、 6762306a36Sopenharmony_ciそのようなドライバがどんなインターフェースを使っているかなど知らな 6862306a36Sopenharmony_ciいし、そんなドライバのことなど全く気にもかけていない。 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciまず初めに、クローズソースとか、ソースコードの隠蔽とか、バイナリの 7262306a36Sopenharmony_ciみが配布される使い物にならない代物[訳注(1)]とか、実体はバイナリ 7362306a36Sopenharmony_ciコードでそれを読み込むためのラッパー部分のみソースコードが公開され 7462306a36Sopenharmony_ciているとか、その他用語は何であれ GPL の下にソースコードがリリース 7562306a36Sopenharmony_ciされていないカーネルドライバに関する法的な問題について、私は「いか 7662306a36Sopenharmony_ciなる議論も」行うつもりがない。法的な疑問があるのならば、プログラマ 7762306a36Sopenharmony_ciである私ではなく、弁護士に相談して欲しい。ここでは単に、技術的な問 7862306a36Sopenharmony_ci題について述べることにする。(法的な問題を軽視しているわけではない。 7962306a36Sopenharmony_ciそれらは実際に存在するし、あなたはそれをいつも気にかけておく必要が 8062306a36Sopenharmony_ciある) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci訳注(1) 8362306a36Sopenharmony_ci「使い物にならない代物」の原文は "blob" 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciさてここでは、バイナリカーネルインターフェースについてと、ソースレ 8762306a36Sopenharmony_ciベルでのインターフェースの不変性について、という二つの話題を取り上 8862306a36Sopenharmony_ciげる。この二つは互いに依存する関係にあるが、まずはバイナリインター 8962306a36Sopenharmony_ciフェースについて議論を行いやっつけてしまおう。 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciバイナリカーネルインターフェース 9362306a36Sopenharmony_ci-------------------------------- 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciもしソースレベルでのインターフェースが不変ならば、バイナリインター 9662306a36Sopenharmony_ciフェースも当然のように不変である、というのは正しいだろうか?正しく 9762306a36Sopenharmony_ciない。Linux カーネルに関する以下の事実を考えてみてほしい。 9862306a36Sopenharmony_ci - あなたが使用するCコンパイラのバージョンによって、カーネル内部 9962306a36Sopenharmony_ci の構造体の配置構造は異なったものになる。また、関数は異なった方 10062306a36Sopenharmony_ci 法でカーネルに含まれることになるかもしれない(例えばインライン 10162306a36Sopenharmony_ci 関数として扱われたり、扱われなかったりする)。個々の関数がどの 10262306a36Sopenharmony_ci ようにコンパイルされるかはそれほど重要ではないが、構造体のパデ 10362306a36Sopenharmony_ci ィングが異なるというのは非常に重要である。 10462306a36Sopenharmony_ci - あなたがカーネルのビルドオプションをどのように設定するかによっ 10562306a36Sopenharmony_ci て、カーネルには広い範囲で異なった事態が起こり得る。 10662306a36Sopenharmony_ci - データ構造は異なるデータフィールドを持つかもしれない 10762306a36Sopenharmony_ci - いくつかの関数は全く実装されていない状態になり得る 10862306a36Sopenharmony_ci (例:SMP向けではないビルドでは、いくつかのロックは中身が 10962306a36Sopenharmony_ci カラにコンパイルされる) 11062306a36Sopenharmony_ci - カーネル内のメモリは、異なった方法で配置され得る。これはビ 11162306a36Sopenharmony_ci ルドオプションに依存している。 11262306a36Sopenharmony_ci - Linux は様々な異なるプロセッサアーキテクチャ上で動作する。 11362306a36Sopenharmony_ci あるアーキテクチャ用のバイナリドライバを、他のアーキテクチャで 11462306a36Sopenharmony_ci 正常に動作させる方法はない。 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ciある特定のカーネル設定を使用し、カーネルをビルドしたのと正確に同じ 11862306a36Sopenharmony_ciCコンパイラを使用して単にカーネルモジュールをコンパイルするだけで 11962306a36Sopenharmony_ciも、あなたはこれらいくつもの問題に直面することになる。ある特定の 12062306a36Sopenharmony_ciLinux ディストリビューションの、ある特定のリリースバージョン用にモ 12162306a36Sopenharmony_ciジュールを提供しようと思っただけでも、これらの問題を引き起こすには 12262306a36Sopenharmony_ci十分である。にも関わらず Linux ディストリビューションの数と、サ 12362306a36Sopenharmony_ciポートするディストリビューションのリリース数を掛け算し、それら一つ 12462306a36Sopenharmony_ci一つについてビルドを行ったとしたら、今度はリリースごとのビルドオプ 12562306a36Sopenharmony_ciションの違いという悪夢にすぐさま悩まされることになる。また、ディス 12662306a36Sopenharmony_ciトリビューションの各リリースバージョンには、異なるハードウェア(プ 12762306a36Sopenharmony_ciロセッサタイプや種々のオプション)に対応するため、何種類かのカーネ 12862306a36Sopenharmony_ciルが含まれているということも理解して欲しい。従って、ある一つのリ 12962306a36Sopenharmony_ciリースバージョンだけのためにモジュールを作成する場合でも、あなたは 13062306a36Sopenharmony_ci何バージョンものモジュールを用意しなければならない。 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci信じて欲しい。このような方法でサポートを続けようとするなら、あなた 13462306a36Sopenharmony_ciはいずれ正気を失うだろう。遠い昔、私はそれがいかに困難なことか、身 13562306a36Sopenharmony_ciをもって学んだのだ・・・ 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci不変のカーネルソースレベルインターフェース 13962306a36Sopenharmony_ci------------------------------------------ 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ciメインカーネルツリーに含まれていない Linux カーネルドライバを継続 14262306a36Sopenharmony_ciしてサポートしていこうとしている人たちとの議論においては、これは極 14362306a36Sopenharmony_ciめて「引火性の高い」話題である。[訳注(2)] 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci訳注(2) 14662306a36Sopenharmony_ci「引火性の高い」の原文は "volatile"。 14762306a36Sopenharmony_civolatile には「揮発性の」「爆発しやすい」という意味の他、「変わり 14862306a36Sopenharmony_ciやすい」「移り気な」という意味がある。 14962306a36Sopenharmony_ci「(この話題は)爆発的に激しい論争を巻き起こしかねない」ということ 15062306a36Sopenharmony_ciを、「(カーネルのソースレベルインターフェースは)移ろい行くもので 15162306a36Sopenharmony_ciある」ということを連想させる "volatile" という単語で表現している。 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ciLinux カーネルの開発は継続的に速いペースで行われ、決して歩みを緩め 15562306a36Sopenharmony_ciることがない。その中でカーネル開発者達は、現状のインターフェースに 15662306a36Sopenharmony_ciあるバグを見つけ、より良い方法を考え出す。彼らはやがて、現状のイン 15762306a36Sopenharmony_ciターフェースがより正しく動作するように修正を行う。その過程で関数の 15862306a36Sopenharmony_ci名前は変更されるかもしれず、構造体は大きく、または小さくなるかもし 15962306a36Sopenharmony_ciれず、関数の引数は検討しなおされるかもしれない。そのような場合、引 16062306a36Sopenharmony_ciき続き全てが正常に動作するよう、カーネル内でこれらのインターフェー 16162306a36Sopenharmony_ciスを使用している個所も全て同時に修正される。 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci具体的な例として、カーネル内の USB インターフェースを挙げる。USB 16562306a36Sopenharmony_ciサブシステムはこれまでに少なくとも3回の書き直しが行われ、その結果 16662306a36Sopenharmony_ciインターフェースが変更された。これらの書き直しはいくつかの異なった 16762306a36Sopenharmony_ci問題を修正するために行われた。 16862306a36Sopenharmony_ci - 同期的データストリームが非同期に変更された。これにより多数のド 16962306a36Sopenharmony_ci ライバを単純化でき、全てのドライバのスループットが向上した。今 17062306a36Sopenharmony_ci やほとんど全ての USB デバイスは、考えられる最高の速度で動作し 17162306a36Sopenharmony_ci ている。 17262306a36Sopenharmony_ci - USB ドライバが USB サブシステムのコアから行う、データパケット 17362306a36Sopenharmony_ci 用のメモリ確保方法が変更された。これに伴い、いくつもの文書化さ 17462306a36Sopenharmony_ci れたデッドロック条件を回避するため、全ての USB ドライバはより 17562306a36Sopenharmony_ci 多くの情報を USB コアに提供しなければならないようになっている。 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ciこのできごとは、数多く存在するクローズソースのオペレーティングシス 17962306a36Sopenharmony_ciテムとは全く対照的だ。それらは長期に渡り古い USB インターフェース 18062306a36Sopenharmony_ciをメンテナンスしなければならない。古いインターフェースが残ることで、 18162306a36Sopenharmony_ci新たな開発者が偶然古いインターフェースを使い、正しくない方法で開発 18262306a36Sopenharmony_ciを行ってしまう可能性が生じる。これによりシステムの安定性は危険にさ 18362306a36Sopenharmony_ciらされることになる。 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci上に挙げたどちらの例においても、開発者達はその変更が重要かつ必要で 18762306a36Sopenharmony_ciあることに合意し、比較的楽にそれを実行した。もし Linux がソースレ 18862306a36Sopenharmony_ciベルでインターフェースの不変性を保証しなければならないとしたら、新 18962306a36Sopenharmony_ciしいインターフェースを作ると同時に、古い、問題のある方を今後ともメ 19062306a36Sopenharmony_ciンテナンスするという余計な仕事を USB の開発者にさせなければならな 19162306a36Sopenharmony_ciい。Linux の USB 開発者は、自分の時間を使って仕事をしている。よっ 19262306a36Sopenharmony_ciて、価値のない余計な仕事を報酬もなしに実行しろと言うことはできない。 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ciセキュリティ問題も、Linux にとっては非常に重要である。ひとたびセキ 19662306a36Sopenharmony_ciュリティに関する問題が発見されれば、それは極めて短期間のうちに修正 19762306a36Sopenharmony_ciされる。セキュリティ問題の発生を防ぐための修正は、カーネルの内部イ 19862306a36Sopenharmony_ciンターフェースの変更を何度も引き起こしてきた。その際同時に、変更さ 19962306a36Sopenharmony_ciれたインターフェースを使用する全てのドライバもまた変更された。これ 20062306a36Sopenharmony_ciにより問題が解消し、将来偶然に問題が再発してしまわないことが保証さ 20162306a36Sopenharmony_ciれる。もし内部インターフェースの変更が許されないとしたら、このよう 20262306a36Sopenharmony_ciにセキュリティ問題を修正し、将来再発しないことを保証することなど不 20362306a36Sopenharmony_ci可能なのだ。 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ciカーネルのインターフェースは時が経つにつれクリーンナップを受ける。 20762306a36Sopenharmony_ci誰も使っていないインターフェースは削除される。これにより、可能な限 20862306a36Sopenharmony_ciりカーネルが小さく保たれ、現役の全てのインターフェースが可能な限り 20962306a36Sopenharmony_ciテストされることを保証しているのだ。(使われていないインターフェー 21062306a36Sopenharmony_ciスの妥当性をテストすることは不可能と言っていいだろう) 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ciこれから何をすべきか 21562306a36Sopenharmony_ci----------------------- 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ciでは、もしメインのカーネルツリーに含まれない Linux カーネルドライ 21862306a36Sopenharmony_ciバがあったとして、あなたは、つまり開発者は何をするべきだろうか?全 21962306a36Sopenharmony_ciてのディストリビューションの全てのカーネルバージョン向けにバイナリ 22062306a36Sopenharmony_ciのドライバを供給することは悪夢であり、カーネルインターフェースの変 22162306a36Sopenharmony_ci更を追いかけ続けることもまた過酷な仕事だ。 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci答えは簡単。そのドライバをメインのカーネルツリーに入れてしまえばよ 22562306a36Sopenharmony_ciい。(ここで言及しているのは、GPL に従って公開されるドライバのこと 22662306a36Sopenharmony_ciだということに注意してほしい。あなたのコードがそれに該当しないなら 22762306a36Sopenharmony_ciば、さよなら。幸運を祈ります。ご自分で何とかしてください。Andrew 22862306a36Sopenharmony_ciと Linus からのコメント<Andrew と Linus のコメントへのリンクをこ 22962306a36Sopenharmony_ciこに置く>をどうぞ)ドライバがメインツリーに入れば、カーネルのイン 23062306a36Sopenharmony_ciターフェースが変更された場合、変更を行った開発者によってドライバも 23162306a36Sopenharmony_ci修正されることになるだろう。あなたはほとんど労力を払うことなしに、 23262306a36Sopenharmony_ci常にビルド可能できちんと動作するドライバを手に入れることができる。 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ciドライバをメインのカーネルツリーに入れると、非常に好ましい以下の効 23662306a36Sopenharmony_ci果がある。 23762306a36Sopenharmony_ci - ドライバの品質が向上する一方で、(元の開発者にとっての)メンテ 23862306a36Sopenharmony_ci ナンスコストは下がる。 23962306a36Sopenharmony_ci - あなたのドライバに他の開発者が機能を追加してくれる。 24062306a36Sopenharmony_ci - 誰かがあなたのドライバにあるバグを見つけ、修正してくれる。 24162306a36Sopenharmony_ci - 誰かがあなたのドライバにある改善点を見つけてくれる。 24262306a36Sopenharmony_ci - 外部インターフェースが変更されドライバの更新が必要になった場合、 24362306a36Sopenharmony_ci 誰かがあなたの代わりに更新してくれる。 24462306a36Sopenharmony_ci - ドライバを入れてくれとディストロに頼まなくても、そのドライバは 24562306a36Sopenharmony_ci 全ての Linux ディストリビューションに自動的に含まれてリリース 24662306a36Sopenharmony_ci される。 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ciLinux では、他のどのオペレーティングシステムよりも数多くのデバイス 25062306a36Sopenharmony_ciが「そのまま」使用できるようになった。また Linux は、どのオペレー 25162306a36Sopenharmony_ciティングシステムよりも数多くのプロセッサアーキテクチャ上でそれらの 25262306a36Sopenharmony_ciデバイスを使用することができるようにもなった。このように、Linux の 25362306a36Sopenharmony_ci開発モデルは実証されており、今後も間違いなく正しい方向へと進んでい 25462306a36Sopenharmony_ciくだろう。:) 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci------ 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ciこの文書の初期の草稿に対し、Randy Dunlap, Andrew Morton, David 26162306a36Sopenharmony_ciBrownell, Hanna Linder, Robert Love, Nishanth Aravamudan から査読 26262306a36Sopenharmony_ciと助言を頂きました。感謝申し上げます。 26362306a36Sopenharmony_ci 264