Linuxカーネルドライバインターフェイスを読んでください。
これは、Linuxにバイナリカーネルインターフェイスがなく、安定したカーネルインターフェイスがない理由を説明するために作成されています。この記事では、カーネルからユーザースペースへのインターフェースではなく、_inkernel_インターフェースについて説明していることを理解してください。カーネルからユーザースペースへのインターフェースは、アプリケーションプログラムが使用するものであるsyscallインターフェースです。そのインターフェースは長期間にわたって_非常に_安定しており、壊れることはありません。0.9somethingより前のカーネルで構築された古いプログラムがありますが、最新の2.6カーネルリリースでも問題なく動作します。このインターフェースは、ユーザーとアプリケーションプログラマーが安定していることを期待できるインターフェースです。
これは、Linuxカーネル開発者の大部分の見解を反映しています。カーネル内の実装の詳細とAPIをいつでも自由に変更できるため、開発がはるかに速く、より良くなります。
リリース間でカーネル内インターフェイスを同一に保つという約束がなければ、VMWareのようなバイナリカーネルモジュールが複数のカーネルで確実に動作する方法はありません。
たとえば、新しいカーネルリリースで一部の構造が変更された場合(パフォーマンスの向上や機能の増加などの理由で)、バイナリVMWareモジュールは、古い構造レイアウトを使用して壊滅的な損傷を引き起こす可能性があります。モジュールをソースから再度コンパイルすると、新しい構造レイアウトがキャプチャされるため、フィールドが削除されたり、名前が変更されたり、別の目的が与えられたりした場合でも、100%ではありませんが、機能する可能性が高くなります。
関数が引数リストを変更したり、名前が変更されたり、使用できなくなったりした場合、同じソースコードからの再コンパイルも機能しません。モジュールは新しいカーネルに適応する必要があります。誰もが(すべきである)ソースを持っており、(誰かを見つけることができる)それに合うようにそれを変更することができるからです。「エンドノードへのプッシュ作業」は、ネットワーキングとフリーソフトウェアの両方で一般的な考え方です。リソース[フリンジ]/[Linuxカーネル外の開発者]は[バックボーン]の限られたリソースよりも大きいためです。 [Linux開発者の]前者にもっと多くの仕事をさせるというトレードオフは受け入れられています。
一方、Microsoftは、バイナリドライバの互換性を可能な限り維持する必要があるという決定を下しました。プロプライエタリの世界でプレイしているため、選択の余地はありません。ある意味で、これにより、移動するターゲットに直面しなくなった外部の開発者や、何も変更する必要がないエンドユーザーにとって、はるかに簡単になります。欠点として、これによりMicrosoftは下位互換性を維持する必要があります。これは、Microsoftの開発者にとって(せいぜい)時間がかかり、(最悪の場合)非効率的で、バグを引き起こし、前進を妨げます。