Linuxカーネルが1500万行を超えるコードなのはなぜですか?[閉まっている]


109

このモノリシックコードベースの内容は何ですか?

プロセッサアーキテクチャのサポート、セキュリティ、および仮想化は理解していますが、60万行を超えることは想像できません。

カーネルコードベースにドライバーが含まれている歴史的および現在の理由は何ですか?

これらの1500万本以上のラインには、これまでにあらゆるハードウェアのすべての単一ドライバーが含まれていますか?もしそうなら、それは質問を頼みます、なぜドライバーがカーネルに埋め込まれ、自動検出され、ハードウェアIDからインストールされる個別のパッケージではないのですか?

コードベースのサイズは、ストレージが制限されたデバイスまたはメモリが制限されたデバイスの問題ですか?

すべてが埋め込まれている場合、スペースに制約のあるARMデバイスのカーネルサイズが大きくなるようです。プリプロセッサによって多くの行が選択されていますか?クレイジーと呼びますが、カーネルの役割であると理解していることを実行するためにそれほど多くのロジックを必要とするマシンを想像することはできません。

サイズが成長し続けているように見えるため、50年以上後にサイズが問題になるという証拠はありますか?

ドライバーを含めることは、ハードウェアが作成されるにつれて大きくなることを意味します。

編集:これはカーネルの性質であると考えている人にとっては、いくつかの研究の後、それは常にではないことに気づきました。カーネギーメロンのマイクロカーネルマッハは「通常10,000行未満のコード」の例としてリストされているため、カーネルはこれほど大きくする必要はありません。


9
2012年には、ドライバー専用の500万行を超えていました。さまざまなプロセッサアーキテクチャをサポートするための190万行。詳細情報h-online.com/open/features/…–
steve

11
はい、コンパイラー、レキシカルアナライザー、およびバイトコードジェネレーターを言語用にコーディングしましたが、完全に加えて再帰的であり、10,000行はかかりませんでした。
ジョナサン

5
(今それを見た、それは約2,700行だった)
ジョナサン

4
ダウンロードして構成make menuconfigし、ビルドの前に有効化/無効化できるコードの量を確認する必要があります。
ケーシー

6
@JonathanLeaders:マンデルブロをレンダリングするテストプログラムを使用して、100行未満の言語のようなLISP向けの完全なコンパイラをテストしました。常に依存します。
フレネル

回答:


43

ドライバーはカーネル内で維持されるため、カーネルの変更が機能のすべてのユーザーに対してグローバルな検索と置換(または検索と手動の変更)を必要とする場合、変更を行う人によって行われます。APIを変更する人がドライバーを更新することは、最新のカーネルでコンパイルしないときに自分で行うのではなく、非常に優れた利点です。

別の方法(ツリー外で保守されたドライバーで発生すること)は、変更に対応するためにメンテナーがパッチを再同期する必要があることです。

クイック検索により、ツリー内ドライバー開発とツリー外ドライバー開発についての議論が始まりました

Linuxのメンテナンス方法は、主にすべてをメインラインリポジトリに保持することです。#ifdefs を制御するための設定オプションにより、小型のカーネルの構築がサポートされています。そのため、リポジトリ全体でコードのごく一部のみをコンパイルする、小型のカーネルを完全にビルドできます。

組み込みシステムでのLinuxの広範な使用により、カーネルソースツリーが小さい数年前のLinuxに比べて、リソースを除外するためのサポートが向上ました。超最小4.0カーネルは、おそらく超最小2.4.0カーネルよりも小さいでしょう。


4
今、これはすべてのコードを一緒にすることが論理的である理由について私にとって理にかなっています、それはコンピュータリソースと過度の依存関係を犠牲にして工数を節約します。
ジョナサン

8
@JonathanLeaders:ええ、あまりアクティブでないメンテナンスでドライバーのビット腐敗を回避します。また、コアの変更を検討するときに、すべてのドライバーコードを用意しておくと便利です。いくつかの内部APIのすべての呼び出し元を検索すると、思いもよらない方法でそれを使用するドライバーが見つかり、考えていた変更に影響を及ぼす可能性があります。
ピーターコーデス

1
@JonathanLeadersは、PCにインストールする現代の測定では、余分な行に多くの余分なスペースが必要であるかのように、xd上にあります。
-Junaga

3
@Junaga:Linuxは非常に移植性が高くスケーラブルであることに気付いていますか?32 MBの組み込みシステムで1 MBの永続的に使用されるカーネルメモリを無駄にすることは大したことです。ソースコードのサイズは重要ではありませんが、コンパイルされたバイナリサイズは依然として重要です。カーネルメモリはページングされないため、スワップスペースがあっても元に戻すことはできません。
ピーターコーデス

1
@Rolf:大きいですが、スパゲッティではありません。現在、コアコードとドライバーの間で双方向の依存関係がなく、非常に適切に設計されています。コアカーネルを壊すことなくドライバーを除外できます。内部関数またはAPIがリファクタリングされ、ドライバーが異なる方法で使用する必要がある場合、ドライバーを変更する必要があるかもしれませんが、それはリファクタリングでは正常です。
ピーター

79

3.13に対して実行されたclocによると、Linuxは約1200万行のコードです。

  • ドライバーで700万LOC /
  • アーチ内に200万LOC /
  • カーネル内の139のLOCのみ/

lsmod | wc 私のDebianラップトップでは、実行時に158個のモジュールがロードされるので、モジュールを動的にロードすることはハードウェアをサポートするためのよく使用される方法です。

堅牢な構成システム(例:)をmake menuconfig使用して、コンパイルするコードを選択します(さらに重要なのは、どのコードをコンパイルしないか)。組み込みシステムは、関心の.configあるハードウェアサポートだけで独自のファイルを定義します(カーネルに組み込まれたハードウェアのサポート、またはロード可能なモジュールとしてのサポートを含む)。


3
モジュールをカウントすることは多分設定によって組み込み多く、十分ではありません
アレックス・

5
これから、Linuxカーネルは非常に複雑であるためではなく、あらゆる種類のデバイス構成をサポートしているため、Linuxカーネルは巨大であると結論付けることができると思います。ここでは、実際に使用されている15m回線はほとんどありません。ほぼすべてのものがそうであるように、それは過度に複雑かもしれませんが、少なくともそれが理
ジョナサン

2
@JonathanLeaders:はい-そして、奇妙なデバイス用のモジュールに加えて、不明瞭なファイルシステム、ネットワークプロトコルなどのためのモジュールがあります
...-psmears

6
@JonathanLeader Linuxが起動したときのことを覚えています-インストーラーが動作するようになった(インストーラーがあったとしても!)ことは大きな苦痛でした- マウスドライバーを手動で選択する必要があるいくつかのディストリビューションがまだあります。ネットワーキングやXウインドウ、仕事の禁止などのようなものを作ることは、通過儀礼でした。最初のRed Hatインストールでは、使用可能なドライバーが3つ(!)しかなかったため、独自のグラフィックドライバーを作成する必要がありました。デフォルトで基本が機能することは、成熟の兆候です。そして、明らかに、HWの組み合わせが少ない組み込みシステムでは、より多くの調整が可能です。
ルアーン

2
@JonathanLeadersご存知のように、ソースのLOCは多かれ少なかれ無関係です。カーネルが使用するメモリ量を知りたい場合は、もっと直接的な方法があります
goldilocks

67

興味のある方は、GitHubミラーの行数の内訳をご覧ください。

=============================================
    Item           Lines             %
=============================================
  ./usr                 845        0.0042
  ./init              5,739        0.0283
  ./samples           8,758        0.0432
  ./ipc               8,926        0.0440
  ./virt             10,701        0.0527
  ./block            37,845        0.1865
  ./security         74,844        0.3688
  ./crypto           90,327        0.4451
  ./scripts          91,474        0.4507
  ./lib             109,466        0.5394
  ./mm              110,035        0.5422
  ./firmware        129,084        0.6361
  ./tools           232,123        1.1438
  ./kernel          246,369        1.2140
  ./Documentation   569,944        2.8085
  ./include         715,349        3.5250
  ./sound           886,892        4.3703
  ./net             899,167        4.4307
  ./fs            1,179,220        5.8107
  ./arch          3,398,176       16.7449
  ./drivers      11,488,536       56.6110
=============================================

drivers行数の多くに貢献してます。


19
それは面白い。さらに興味深いのは、プログラマーが悩まされるコードの潜在的な弱点ですgrep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
。– jimmij

4
@jimmij '\ x73 \ x68 \ x69 \ x74'は、この画期的な(わずかに日付が付けられている場合の)研究によると、より一般的です。
ニックT

3
ランダムな事実:OPによって推定された600 000 LOCに近いフォルダーがドキュメントです。
-Davidmh

1
./documentation500,000行を超えるコードがありますか?....何?
C_B

1
@drewbenn私はそれを「ドキュメンテーションは空ではない?」
イズカタ

43

これまでの答えは「はい、たくさんのコードがあります」と思われ、最も論理的な答えである15M +で質問に取り組んでいる人はいません。だから何?1500万行のソースコードは魚の価格と何の関係がありますか?なぜこれが想像を絶するのですか?

Linuxは明らかに多くのことを行います。何よりも...しかし、あなたのポイントのいくつかは、それが構築され使用されたときに何が起こっているかを尊重しないことを示しています。

  • すべてがコンパイルされるわけではありません。カーネルビルドシステムを使用すると、ソースコードのセットを選択する構成をすばやく定義できます。実験的なものもあれば、古いものもあれば、すべてのシステムに必要ではないものもあります。見/boot/config-$(uname -r)に(Ubuntuの上)make menuconfig、あなたは除外されてどれだけ表示されます。

    そして、それは可変ターゲットのデスクトップ配布です。組み込みシステムの構成は、必要なものだけを取り込みます。

  • すべてが組み込まれているわけではありません。私の構成では、カーネル機能のほとんどはモジュールとして構築されています。

    grep -c '=m' /boot/config-`uname -r`  # 4078
    grep -c '=y' /boot/config-`uname -r`  # 1944
    

    明確にするために、これらすべて組み込み可能です...それらを印刷して巨大な紙のサンドイッチにすることができるように。個別のハードウェアジョブのカスタムビルドを実行していない限り、意味がありません(この場合、これらのアイテムの数は既に制限されています)。

  • モジュールは動的にロードされます。システムで使用可能なモジュールが数千ある場合でも、必要なものだけをロードできます。次の出力を比較します。

    find /lib/modules/$(uname -r)/ -iname '*.ko' | wc -l  # 4291
    lsmod | wc -l                                         # 99
    

    ほとんど何もロードされません。

  • マイクロカーネルは同じものではありません。つながる画像を見ているだけで10秒Wikipediaのページあなたがリンクは、彼らは完全に異なる方法で設計されているハイライトでしょう。

    Linuxドライバーは、ユーザースペースではなく、内部的に(大部分は動的にロードされるモジュールとして)組み込まれ、ファイルシステムも同様に内部です。外部ドライバーを使用するよりも悪いのはなぜですか?マイクロが汎用コンピューティングに適しているのはなぜですか?


コメントは、あなたがそれを得ていないことを再び強調しています。Linuxを個別のハードウェア(航空宇宙、TiVo、タブレットなど)に展開する場合は、必要なドライバーのみをビルドするように構成します。デスクトップでも同じことができますmake localmodconfig。最終的に、柔軟性のない小さな目的のカーネルビルドができます。

Ubuntuのようなディストリビューションでは、単一の40MBカーネルパッケージが許容されます。いいえ、スクラブ、4000以上のフローティングモジュールをパッケージとして保持するという大規模なアーカイブおよびダウンロードのシナリオよりも実際に望ましいです。使用するディスク容量が少なく、コンパイル時のパッケージ化が容易で、保存が簡単で、ユーザー(動作するシステムを持っているユーザー)に適しています。

将来も問題ではないようです。CPU速度、ディスク密度/価格、および帯域幅の改善率は、カーネルの成長よりもはるかに速いようです。10年後の200MBカーネルパッケージは、世界の終わりではありません。

また、一方通行ではありません。コードが維持されていないと、コードは追い出されます。


2
懸念事項は主に組み込みシステムです。あなたが示すように、あなた自身のシステムで使用されていない4,000のモジュールがあります。いくつかの小さなロボット工学または航空宇宙のアプリケーションでは(これは汎用コンピューティングではありません)、これは受け入れられない無駄です。
ジョナサン

2
@JonathanLeaders安全に削除できると思います。デスクトップにインストールする、彼らは場合には、あなたが突然、USBポートで何かのプラグイン、またはいくつかのハードウェア構成を変更する、などがあります
ディディエA.

1
はい、正確に。「USBデバイスをいつでもプラグインできるので、15m行のコードが必要です」という仮定にまだ驚かされます。Linuxは電話やさまざまなデバイスで使用されているため、ディストリビューションレベルではなくカーネルレベル組み込みデバイス。まあ、私はディストリビューションそれ自体でリストを間引くと思います。私はちょうどそれの1%が現在のサイズだことをカーネルに伝える埋め込まれたARMの構成とは反対に、パッケージのソースを追加することによって、それまで「オプトイン」のディストリビューションだろう種類を、プラグ可能のサポートは加算・減算ではないれるべきだと思うIEう
ジョナサン

5
@JonathanLeaders 組み込みシステム上のデスクトップ用に構成されたカーネルを実行することはありません。組み込みシステムには13個のモジュールがあり、必要のないハードウェアサポートはすべて削除されています(他の多くのカスタマイズも含まれています)。デスクトップと組み込みシステムの比較をやめます。Linuxはすべてをサポートし、関心のある内容のみを含めるようにカスタマイズできるため、うまく機能します。そして、これらの4kモジュールはデスクトップシステムで非常に優れています。私の最後のラップトップが死んだとき、ハードドライブをより新しいラップトップに入れただけですべてがうまくいきました
ドリューベン

3
そうでなければ良い/貴重な答えは、明らかに怒りと闘争的なトーンに苦しんでいます。-1。
TypeIA

19

Linux tinyconfigコンパイル済みソースの行数 tinyconfigバブルグラフ svg(フィドル)

シェルスクリプトは一緒に使用、カーネルのビルドからJSONを作成するhttp://bl.ocks.org/mbostock/4063269


編集unifdefいくつかの制限があることが判明しました(-I無視され、-includeサポートされていません。後者は生成された構成ヘッダーを含めるために使用されます)cat

274692 total # (was 274686)

スクリプトと手順が更新されました。


ドライバー、アーチなどのほかに、選択された構成に依存するかどうかに関係なく、多くの条件付きコードがコンパイルされます。コードは必ずしも動的にロードされるモジュールではなく、コアに組み込まれます。

だから、linux-4.1.6ソースをダウンロードし、tinyconfigを選択し、モジュールを有効にせず、それを有効にするか、実行時にユーザーがそれで何ができるかを正直に知りません、とにかく、カーネルを設定します:

# tinyconfig      - Configure the tiniest possible kernel
make tinyconfig

カーネルを構築しました

time make V=1 # (should be fast)
#1049168 ./vmlinux (I'm using x86-32 on other arch the size may be different)

カーネルビルドプロセス*.cmdは、.oファイルをビルドし、それらのファイルを処理し、script.sh以下のターゲットおよび依存関係コピーを抽出し、findで使用するために使用されるコマンドラインで呼び出された隠しファイルを残します

find -name "*.cmd" -exec sh script.sh "{}" \;

これは、ターゲットの各依存のためのコピーを作成.oという名前を.o.c

.cコード

find -name "*.o.c" | grep -v "/scripts/" | xargs wc -l | sort -n
...
   8285 ./kernel/sched/fair.o.c
   8381 ./kernel/sched/core.o.c
   9083 ./kernel/events/core.o.c
 274692 total

.hヘッダー(サニタイズ)

make headers_install INSTALL_HDR_PATH=/tmp/test-hdr
find /tmp/test-hdr/ -name "*.h" | xargs wc -l
...
  1401 /tmp/test-hdr/include/linux/ethtool.h
  2195 /tmp/test-hdr/include/linux/videodev2.h
  4588 /tmp/test-hdr/include/linux/nl80211.h
112445 total

@JonathanLeadersそれに取り組んで楽しい、それを誰かが喜んで
アレックス

9

モノリシックカーネルのトレードオフは、当初から公共の場でTananbaumとTorvaldsの間で議論されていました。すべてのためにユーザー空間にアクセスする必要がない場合は、カーネルへのインターフェースをよりシンプルにすることができます。カーネルがモノリシックの場合、内部でより最適化(そしてより複雑に!)できます。

かなり長い間、妥協案としてモジュールがありました。そして、DPDK(カーネルからより多くのネットワーク機能を削除)のようなことを続けています。コアを追加するほど、ロックを回避することが重要になります。より多くのものがユーザー空間に移動し、カーネルが縮小します。

モノリシックカーネルだけがソリューションではないことに注意してください。一部のアーキテクチャでは、カーネル/ユーザー空間の境界は他のどの関数呼び出しよりも高くないため、マイクロカーネルが魅力的です。


1
「一部のアーキテクチャでは、カーネル/ユーザー空間の境界は他のどの関数呼び出しよりも高価ではありません」-興味深い!それはどんなアーキテクチャでしょうか?少なくとも何らかのメモリ保護を放棄しない限り、実現するのは信じられないほど困難に見えます。
Voo

1
Ivan Goddardのmillcomputing.comのすべてのビデオ(mill / belt cpu、非常にVLIWのようなもの)を試しました。この特定の主張は中心的なテーマであり、その意味はセキュリティビデオに到達するまで明白ではありません。これはシミュレーションのPOCアーキテクチャですが、おそらくこのプロパティを持つ唯一のアーキテクチャではありません。
ロブ

1
ああ、それを説明します。私の経験では(そして、私は業界を厳密にフォローしていないことを最初に認めるでしょう)、多くのシミュレートされたアーキテクチャがあり、ゴムが道路に当たるとすぐに彼らの主張に従うものはほとんどありません。実際のハードウェアで。その背後にある考え方はどんな場合でも興味深いかもしれません-その特定のCPUが初めて言及されたのではありません。この特性を備えた既存のアーキテクチャを見つけた場合、私は本当に興味があります。
Voo

1
ところで、ここであなたが言及した議論に関するリソースがあります:en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate-
ジョナサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.