Linuxカーネルにユーザースペースを絶対に破壊しないというポリシーがあるのはなぜですか?

Linuxカーネルにユーザースペースを絶対に破壊しないというポリシーがあるのはなぜですか?

私はLinuxカーネルメーリングリストのエチケットの文脈でこれについて考え始めました。世界で最も有名で最も成功し、重要なフリーソフトウェアプロジェクトであるLinuxカーネルは、幅広い関心を集めてきました。このプロジェクトの創設者でありリーダーであるLinus Torvaldsについては、ここで紹介する必要はありません。

Linusは時々LKMLに対する彼の発言で物議を醸すことがあります。彼自身が認めたところによると、これらの炎はしばしばユーザー空間を破壊することに関連しています。これは私の質問につながります。

ユーザー空間を破壊するのがなぜ悪いのかという歴史的な視点を得ることができますか?私が知っているのは、ユーザースペースを破るためにアプリケーションレベルで修正する必要がありますが、カーネルコードが改善された場合は悪いでしょうか?

私が理解したのは、Linusが述べたポリシーは、何よりもコード品質を含むユーザースペースを破壊しないことです。これはなぜそんなに重要なのでしょうか?この方針の長所と短所は何ですか?

(明らかに、そのような政策を継続的に適用することにはいくつかの欠点があります。湾の道を行きました。

ベストアンサー1

その理由は歴史的ではなく実際的です。 Linuxカーネルの上で実行される多数のプログラムがあります。カーネルインタフェースがこれらのプログラムを破壊する場合、誰もがそのプログラムをアップグレードする必要があります。

今、ほとんどのプログラムは実際にカーネルインターフェース(システムコール)、しかしインターフェイスのみC標準ライブラリ(氏包装紙システムコールの周り)。ああ、ところでどの標準ライブラリですか?グリッケ? uClibC?フードライブラリ?バイオニック?無実?など。

しかし、オペレーティングシステム固有のサービスを実装し、標準ライブラリによって公開されないカーネルインタフェースに依存するプログラムもたくさんあります。 (Linuxでは、これらの多くは以下を介して行われます。/procそして/sys.)

その後、静的にコンパイルされたバイナリがあります。カーネルのアップグレードによってそれらの1つがハングした場合、唯一の回避策はそのエントリを再コンパイルすることです。ソースコードがある場合:Linuxは独自のソフトウェアもサポートしています。

ソースが利用可能であっても、すべての情報を収集するのは痛いかもしれません。特に、ハードウェアのバグを修正するためにカーネルをアップグレードする場合は、さらにそうです。人々はハードウェアサポートを必要とするので、システムの残りの部分から独立してカーネルをアップグレードすることがよくあります。内部にリヌス・トバルズの言葉:

ユーザープログラムを壊すことは許されません。 (...)私たちは、人々が長年にわたって古いバイナリを使用してきたことを知っています。あなたは私たちを信頼できます。

そのも説明したこれを強力なルールにする1つは、依存関係の地獄を避けることです。依存関係地獄は、新しいカーネルが機能するために他のプログラムをアップグレードする必要があるだけでなく、すべてがいくつかのバージョンに依存するため、他のプログラムをアップグレードしてからアップグレードする必要があります。すべて。

それ一部明確に定義された一方向の依存関係がある可能性があります。悲しいが時には避けられないことでもあります。 (…)悪いことは、双方向依存性があるということです。ユーザー空間のHALコードが新しいカーネルに依存している場合は問題ありません。しかし、ユーザーはこのコードが「今週のカーネル」ではなく「過去数ヶ月のカーネル」になることを望むと思います。

ただし、双方向の依存関係があると問題が発生します。これは同時にアップグレードする必要があることを意味し、これは許容できません。これはユーザーにとっては残念ですが、より重要なのは開発者にとっては悪いことです。これは、「エラーが発生しました」と言うことができない、または二等分または同様の種類の操作で範囲を絞り込む試みなどの操作を実行できないためです。

ユーザー空間では、これらの相互依存関係は通常、異なるライブラリバージョンを維持することで解決されますが、1つのカーネルしか実行できないため、カーネルで実行したいすべてをサポートする必要があります。

公式

[システムコールステートメントの安定]以前のバージョンとの互換性は少なくとも2年間保証されています。

しかし実際には

ほとんどのインターフェイス(システムコールなど)は変更されず、常に使用できます。

./sys/proc/sys

つまり、

ユーザースペースを破るには、アプリケーションレベルで変更が必要です。

コアが1つだけで、システムの残りの部分とは無関係にアップグレードしようとしているので、これはうまくいきません。しかし、複雑な相互依存性を持つ多くのアプリケーションがあります。数百万の異なる設定で何千ものアプリケーションを最新の状態に保つよりも、カーネルを安定して維持する方が簡単です。

おすすめ記事