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