1*4882a593SmuzhiyunNOTE: 2*4882a593SmuzhiyunThis is a version of Documentation/process/stable-api-nonsense.rst into Japanese. 3*4882a593SmuzhiyunThis document is maintained by IKEDA, Munehiro <m-ikeda@ds.jp.nec.com> 4*4882a593Smuzhiyunand the JF Project team <http://www.linux.or.jp/JF/>. 5*4882a593SmuzhiyunIf you find any difference between this document and the original file 6*4882a593Smuzhiyunor a problem with the translation, 7*4882a593Smuzhiyunplease contact the maintainer of this file or JF project. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunPlease also note that the purpose of this file is to be easier to read 10*4882a593Smuzhiyunfor non English (read: Japanese) speakers and is not intended as a 11*4882a593Smuzhiyunfork. So if you have any comments or updates of this file, please try 12*4882a593Smuzhiyunto update the original English file first. 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunLast Updated: 2007/07/18 15*4882a593Smuzhiyun================================== 16*4882a593Smuzhiyunこれは、 17*4882a593Smuzhiyunlinux-2.6.22-rc4/Documentation/process/stable-api-nonsense.rst の和訳 18*4882a593Smuzhiyunです。 19*4882a593Smuzhiyun翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 20*4882a593Smuzhiyun翻訳日 : 2007/06/11 21*4882a593Smuzhiyun原著作者: Greg Kroah-Hartman < greg at kroah dot com > 22*4882a593Smuzhiyun翻訳者 : 池田 宗広 < m-ikeda at ds dot jp dot nec dot com > 23*4882a593Smuzhiyun校正者 : Masanori Kobayashi さん < zap03216 at nifty dot ne dot jp > 24*4882a593Smuzhiyun Seiji Kaneko さん < skaneko at a2 dot mbn dot or dot jp > 25*4882a593Smuzhiyun================================== 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun 29*4882a593SmuzhiyunLinux カーネルのドライバインターフェース 30*4882a593Smuzhiyun(あなたの質問すべてに対する回答とその他諸々) 31*4882a593Smuzhiyun 32*4882a593SmuzhiyunGreg Kroah-Hartman <greg at kroah dot com> 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun 35*4882a593Smuzhiyunこの文書は、なぜ Linux ではバイナリカーネルインターフェースが定義 36*4882a593Smuzhiyunされていないのか、またはなぜ不変のカーネルインターフェースを持たな 37*4882a593Smuzhiyunいのか、ということを説明するために書かれた。ここでの話題は「カーネ 38*4882a593Smuzhiyunル内部の」インターフェースについてであり、ユーザー空間とのインター 39*4882a593Smuzhiyunフェースではないことを理解してほしい。カーネルとユーザー空間とのイ 40*4882a593Smuzhiyunンターフェースとはアプリケーションプログラムが使用するものであり、 41*4882a593Smuzhiyunつまりシステムコールのインターフェースがこれに当たる。これは今まで 42*4882a593Smuzhiyun長きに渡り、かつ今後も「まさしく」不変である。私は確か 0.9 か何か 43*4882a593Smuzhiyunより前のカーネルを使ってビルドした古いプログラムを持っているが、そ 44*4882a593Smuzhiyunれは最新の 2.6 カーネルでもきちんと動作する。ユーザー空間とのイン 45*4882a593Smuzhiyunターフェースは、ユーザーとアプリケーションプログラマが不変性を信頼 46*4882a593Smuzhiyunしてよいものの一つである。 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun要旨 50*4882a593Smuzhiyun---- 51*4882a593Smuzhiyun 52*4882a593Smuzhiyunあなたは不変のカーネルインターフェースが必要だと考えているかもしれ 53*4882a593Smuzhiyunないが、実際のところはそうではない。あなたは必要としているものが分 54*4882a593Smuzhiyunかっていない。あなたが必要としているものは安定して動作するドライバ 55*4882a593Smuzhiyunであり、それはドライバがメインのカーネルツリーに含まれる場合のみ得 56*4882a593Smuzhiyunることができる。ドライバがメインのカーネルツリーに含まれていると、 57*4882a593Smuzhiyun他にも多くの良いことがある。それは、Linux をより強固で、安定な、成 58*4882a593Smuzhiyun熟したオペレーティングシステムにすることができるということだ。これ 59*4882a593Smuzhiyunこそ、そもそもあなたが Linux を使う理由のはずだ。 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun 62*4882a593Smuzhiyunはじめに 63*4882a593Smuzhiyun-------- 64*4882a593Smuzhiyun 65*4882a593Smuzhiyunカーネル内部のインターフェース変更を心配しなければならないドライバ 66*4882a593Smuzhiyunを書きたいなどというのは、変わり者だけだ。この世界のほとんどの人は、 67*4882a593Smuzhiyunそのようなドライバがどんなインターフェースを使っているかなど知らな 68*4882a593Smuzhiyunいし、そんなドライバのことなど全く気にもかけていない。 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun 71*4882a593Smuzhiyunまず初めに、クローズソースとか、ソースコードの隠蔽とか、バイナリの 72*4882a593Smuzhiyunみが配布される使い物にならない代物[訳注(1)]とか、実体はバイナリ 73*4882a593Smuzhiyunコードでそれを読み込むためのラッパー部分のみソースコードが公開され 74*4882a593Smuzhiyunているとか、その他用語は何であれ GPL の下にソースコードがリリース 75*4882a593Smuzhiyunされていないカーネルドライバに関する法的な問題について、私は「いか 76*4882a593Smuzhiyunなる議論も」行うつもりがない。法的な疑問があるのならば、プログラマ 77*4882a593Smuzhiyunである私ではなく、弁護士に相談して欲しい。ここでは単に、技術的な問 78*4882a593Smuzhiyun題について述べることにする。(法的な問題を軽視しているわけではない。 79*4882a593Smuzhiyunそれらは実際に存在するし、あなたはそれをいつも気にかけておく必要が 80*4882a593Smuzhiyunある) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun訳注(1) 83*4882a593Smuzhiyun「使い物にならない代物」の原文は "blob" 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun 86*4882a593Smuzhiyunさてここでは、バイナリカーネルインターフェースについてと、ソースレ 87*4882a593Smuzhiyunベルでのインターフェースの不変性について、という二つの話題を取り上 88*4882a593Smuzhiyunげる。この二つは互いに依存する関係にあるが、まずはバイナリインター 89*4882a593Smuzhiyunフェースについて議論を行いやっつけてしまおう。 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun 92*4882a593Smuzhiyunバイナリカーネルインターフェース 93*4882a593Smuzhiyun-------------------------------- 94*4882a593Smuzhiyun 95*4882a593Smuzhiyunもしソースレベルでのインターフェースが不変ならば、バイナリインター 96*4882a593Smuzhiyunフェースも当然のように不変である、というのは正しいだろうか?正しく 97*4882a593Smuzhiyunない。Linux カーネルに関する以下の事実を考えてみてほしい。 98*4882a593Smuzhiyun - あなたが使用するCコンパイラのバージョンによって、カーネル内部 99*4882a593Smuzhiyun の構造体の配置構造は異なったものになる。また、関数は異なった方 100*4882a593Smuzhiyun 法でカーネルに含まれることになるかもしれない(例えばインライン 101*4882a593Smuzhiyun 関数として扱われたり、扱われなかったりする)。個々の関数がどの 102*4882a593Smuzhiyun ようにコンパイルされるかはそれほど重要ではないが、構造体のパデ 103*4882a593Smuzhiyun ィングが異なるというのは非常に重要である。 104*4882a593Smuzhiyun - あなたがカーネルのビルドオプションをどのように設定するかによっ 105*4882a593Smuzhiyun て、カーネルには広い範囲で異なった事態が起こり得る。 106*4882a593Smuzhiyun - データ構造は異なるデータフィールドを持つかもしれない 107*4882a593Smuzhiyun - いくつかの関数は全く実装されていない状態になり得る 108*4882a593Smuzhiyun (例:SMP向けではないビルドでは、いくつかのロックは中身が 109*4882a593Smuzhiyun カラにコンパイルされる) 110*4882a593Smuzhiyun - カーネル内のメモリは、異なった方法で配置され得る。これはビ 111*4882a593Smuzhiyun ルドオプションに依存している。 112*4882a593Smuzhiyun - Linux は様々な異なるプロセッサアーキテクチャ上で動作する。 113*4882a593Smuzhiyun あるアーキテクチャ用のバイナリドライバを、他のアーキテクチャで 114*4882a593Smuzhiyun 正常に動作させる方法はない。 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun 117*4882a593Smuzhiyunある特定のカーネル設定を使用し、カーネルをビルドしたのと正確に同じ 118*4882a593SmuzhiyunCコンパイラを使用して単にカーネルモジュールをコンパイルするだけで 119*4882a593Smuzhiyunも、あなたはこれらいくつもの問題に直面することになる。ある特定の 120*4882a593SmuzhiyunLinux ディストリビューションの、ある特定のリリースバージョン用にモ 121*4882a593Smuzhiyunジュールを提供しようと思っただけでも、これらの問題を引き起こすには 122*4882a593Smuzhiyun十分である。にも関わらず Linux ディストリビューションの数と、サ 123*4882a593Smuzhiyunポートするディストリビューションのリリース数を掛け算し、それら一つ 124*4882a593Smuzhiyun一つについてビルドを行ったとしたら、今度はリリースごとのビルドオプ 125*4882a593Smuzhiyunションの違いという悪夢にすぐさま悩まされることになる。また、ディス 126*4882a593Smuzhiyunトリビューションの各リリースバージョンには、異なるハードウェア(プ 127*4882a593Smuzhiyunロセッサタイプや種々のオプション)に対応するため、何種類かのカーネ 128*4882a593Smuzhiyunルが含まれているということも理解して欲しい。従って、ある一つのリ 129*4882a593Smuzhiyunリースバージョンだけのためにモジュールを作成する場合でも、あなたは 130*4882a593Smuzhiyun何バージョンものモジュールを用意しなければならない。 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun信じて欲しい。このような方法でサポートを続けようとするなら、あなた 134*4882a593Smuzhiyunはいずれ正気を失うだろう。遠い昔、私はそれがいかに困難なことか、身 135*4882a593Smuzhiyunをもって学んだのだ・・・ 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun不変のカーネルソースレベルインターフェース 139*4882a593Smuzhiyun------------------------------------------ 140*4882a593Smuzhiyun 141*4882a593Smuzhiyunメインカーネルツリーに含まれていない Linux カーネルドライバを継続 142*4882a593Smuzhiyunしてサポートしていこうとしている人たちとの議論においては、これは極 143*4882a593Smuzhiyunめて「引火性の高い」話題である。[訳注(2)] 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun訳注(2) 146*4882a593Smuzhiyun「引火性の高い」の原文は "volatile"。 147*4882a593Smuzhiyunvolatile には「揮発性の」「爆発しやすい」という意味の他、「変わり 148*4882a593Smuzhiyunやすい」「移り気な」という意味がある。 149*4882a593Smuzhiyun「(この話題は)爆発的に激しい論争を巻き起こしかねない」ということ 150*4882a593Smuzhiyunを、「(カーネルのソースレベルインターフェースは)移ろい行くもので 151*4882a593Smuzhiyunある」ということを連想させる "volatile" という単語で表現している。 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun 154*4882a593SmuzhiyunLinux カーネルの開発は継続的に速いペースで行われ、決して歩みを緩め 155*4882a593Smuzhiyunることがない。その中でカーネル開発者達は、現状のインターフェースに 156*4882a593Smuzhiyunあるバグを見つけ、より良い方法を考え出す。彼らはやがて、現状のイン 157*4882a593Smuzhiyunターフェースがより正しく動作するように修正を行う。その過程で関数の 158*4882a593Smuzhiyun名前は変更されるかもしれず、構造体は大きく、または小さくなるかもし 159*4882a593Smuzhiyunれず、関数の引数は検討しなおされるかもしれない。そのような場合、引 160*4882a593Smuzhiyunき続き全てが正常に動作するよう、カーネル内でこれらのインターフェー 161*4882a593Smuzhiyunスを使用している個所も全て同時に修正される。 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun具体的な例として、カーネル内の USB インターフェースを挙げる。USB 165*4882a593Smuzhiyunサブシステムはこれまでに少なくとも3回の書き直しが行われ、その結果 166*4882a593Smuzhiyunインターフェースが変更された。これらの書き直しはいくつかの異なった 167*4882a593Smuzhiyun問題を修正するために行われた。 168*4882a593Smuzhiyun - 同期的データストリームが非同期に変更された。これにより多数のド 169*4882a593Smuzhiyun ライバを単純化でき、全てのドライバのスループットが向上した。今 170*4882a593Smuzhiyun やほとんど全ての USB デバイスは、考えられる最高の速度で動作し 171*4882a593Smuzhiyun ている。 172*4882a593Smuzhiyun - USB ドライバが USB サブシステムのコアから行う、データパケット 173*4882a593Smuzhiyun 用のメモリ確保方法が変更された。これに伴い、いくつもの文書化さ 174*4882a593Smuzhiyun れたデッドロック条件を回避するため、全ての USB ドライバはより 175*4882a593Smuzhiyun 多くの情報を USB コアに提供しなければならないようになっている。 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun 178*4882a593Smuzhiyunこのできごとは、数多く存在するクローズソースのオペレーティングシス 179*4882a593Smuzhiyunテムとは全く対照的だ。それらは長期に渡り古い USB インターフェース 180*4882a593Smuzhiyunをメンテナンスしなければならない。古いインターフェースが残ることで、 181*4882a593Smuzhiyun新たな開発者が偶然古いインターフェースを使い、正しくない方法で開発 182*4882a593Smuzhiyunを行ってしまう可能性が生じる。これによりシステムの安定性は危険にさ 183*4882a593Smuzhiyunらされることになる。 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun上に挙げたどちらの例においても、開発者達はその変更が重要かつ必要で 187*4882a593Smuzhiyunあることに合意し、比較的楽にそれを実行した。もし Linux がソースレ 188*4882a593Smuzhiyunベルでインターフェースの不変性を保証しなければならないとしたら、新 189*4882a593Smuzhiyunしいインターフェースを作ると同時に、古い、問題のある方を今後ともメ 190*4882a593Smuzhiyunンテナンスするという余計な仕事を USB の開発者にさせなければならな 191*4882a593Smuzhiyunい。Linux の USB 開発者は、自分の時間を使って仕事をしている。よっ 192*4882a593Smuzhiyunて、価値のない余計な仕事を報酬もなしに実行しろと言うことはできない。 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun 195*4882a593Smuzhiyunセキュリティ問題も、Linux にとっては非常に重要である。ひとたびセキ 196*4882a593Smuzhiyunュリティに関する問題が発見されれば、それは極めて短期間のうちに修正 197*4882a593Smuzhiyunされる。セキュリティ問題の発生を防ぐための修正は、カーネルの内部イ 198*4882a593Smuzhiyunンターフェースの変更を何度も引き起こしてきた。その際同時に、変更さ 199*4882a593Smuzhiyunれたインターフェースを使用する全てのドライバもまた変更された。これ 200*4882a593Smuzhiyunにより問題が解消し、将来偶然に問題が再発してしまわないことが保証さ 201*4882a593Smuzhiyunれる。もし内部インターフェースの変更が許されないとしたら、このよう 202*4882a593Smuzhiyunにセキュリティ問題を修正し、将来再発しないことを保証することなど不 203*4882a593Smuzhiyun可能なのだ。 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun 206*4882a593Smuzhiyunカーネルのインターフェースは時が経つにつれクリーンナップを受ける。 207*4882a593Smuzhiyun誰も使っていないインターフェースは削除される。これにより、可能な限 208*4882a593Smuzhiyunりカーネルが小さく保たれ、現役の全てのインターフェースが可能な限り 209*4882a593Smuzhiyunテストされることを保証しているのだ。(使われていないインターフェー 210*4882a593Smuzhiyunスの妥当性をテストすることは不可能と言っていいだろう) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun 214*4882a593Smuzhiyunこれから何をすべきか 215*4882a593Smuzhiyun----------------------- 216*4882a593Smuzhiyun 217*4882a593Smuzhiyunでは、もしメインのカーネルツリーに含まれない Linux カーネルドライ 218*4882a593Smuzhiyunバがあったとして、あなたは、つまり開発者は何をするべきだろうか?全 219*4882a593Smuzhiyunてのディストリビューションの全てのカーネルバージョン向けにバイナリ 220*4882a593Smuzhiyunのドライバを供給することは悪夢であり、カーネルインターフェースの変 221*4882a593Smuzhiyun更を追いかけ続けることもまた過酷な仕事だ。 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun答えは簡単。そのドライバをメインのカーネルツリーに入れてしまえばよ 225*4882a593Smuzhiyunい。(ここで言及しているのは、GPL に従って公開されるドライバのこと 226*4882a593Smuzhiyunだということに注意してほしい。あなたのコードがそれに該当しないなら 227*4882a593Smuzhiyunば、さよなら。幸運を祈ります。ご自分で何とかしてください。Andrew 228*4882a593Smuzhiyunと Linus からのコメント<Andrew と Linus のコメントへのリンクをこ 229*4882a593Smuzhiyunこに置く>をどうぞ)ドライバがメインツリーに入れば、カーネルのイン 230*4882a593Smuzhiyunターフェースが変更された場合、変更を行った開発者によってドライバも 231*4882a593Smuzhiyun修正されることになるだろう。あなたはほとんど労力を払うことなしに、 232*4882a593Smuzhiyun常にビルド可能できちんと動作するドライバを手に入れることができる。 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun 235*4882a593Smuzhiyunドライバをメインのカーネルツリーに入れると、非常に好ましい以下の効 236*4882a593Smuzhiyun果がある。 237*4882a593Smuzhiyun - ドライバの品質が向上する一方で、(元の開発者にとっての)メンテ 238*4882a593Smuzhiyun ナンスコストは下がる。 239*4882a593Smuzhiyun - あなたのドライバに他の開発者が機能を追加してくれる。 240*4882a593Smuzhiyun - 誰かがあなたのドライバにあるバグを見つけ、修正してくれる。 241*4882a593Smuzhiyun - 誰かがあなたのドライバにある改善点を見つけてくれる。 242*4882a593Smuzhiyun - 外部インターフェースが変更されドライバの更新が必要になった場合、 243*4882a593Smuzhiyun 誰かがあなたの代わりに更新してくれる。 244*4882a593Smuzhiyun - ドライバを入れてくれとディストロに頼まなくても、そのドライバは 245*4882a593Smuzhiyun 全ての Linux ディストリビューションに自動的に含まれてリリース 246*4882a593Smuzhiyun される。 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun 249*4882a593SmuzhiyunLinux では、他のどのオペレーティングシステムよりも数多くのデバイス 250*4882a593Smuzhiyunが「そのまま」使用できるようになった。また Linux は、どのオペレー 251*4882a593Smuzhiyunティングシステムよりも数多くのプロセッサアーキテクチャ上でそれらの 252*4882a593Smuzhiyunデバイスを使用することができるようにもなった。このように、Linux の 253*4882a593Smuzhiyun開発モデルは実証されており、今後も間違いなく正しい方向へと進んでい 254*4882a593Smuzhiyunくだろう。:) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun------ 259*4882a593Smuzhiyun 260*4882a593Smuzhiyunこの文書の初期の草稿に対し、Randy Dunlap, Andrew Morton, David 261*4882a593SmuzhiyunBrownell, Hanna Linder, Robert Love, Nishanth Aravamudan から査読 262*4882a593Smuzhiyunと助言を頂きました。感謝申し上げます。 263*4882a593Smuzhiyun 264