この完全なコードベースの内容は何ですか?
プロセッサアーキテクチャのサポート、セキュリティ、仮想化を理解していますが、600,000行を超えるとは想像できません。
ドライバがカーネルコードベースに含まれる過去と現在の理由は何ですか?
この1,500万本を超えるラインには、すべてのハードウェアのすべてのドライバが含まれていますか?では、なぜドライバがハードウェアIDで自動的に検出され、インストールされる別のパッケージではなくカーネルに組み込まれていますか?
コードベースのサイズは、ストレージ容量が制限されているか、メモリが制限されているデバイスに問題がありますか?
これらすべてが組み込まれている場合、スペースが限られたARMデバイスのコアサイズが膨らんでいるように見えます。前処理が多い行を削除しましたか?クレイジーだと言うかもしれませんが、私が理解しているカーネルの役割を実行するためにそれほど多くのロジックを必要とするマシンは想像できません。
絶えず成長しているように見える特性のため、今から50年以上後にそのサイズが問題になるという証拠はありますか?
ドライバを含むということは、ハードウェアが作成されるにつれてドライバも大きくなることを意味します。
編集する:これがカーネルの本質だと思う人にとっては、いくらかの研究の終わりにこれがいつもそうではないことに気づきました。コアはCarnegie Mellon Universityほど大きくはありません。マイクロカーネルMachは、「通常10,000行未満のコード」の例としてリストされています。
答え1
~によるとクローク3.13で実行されているLinuxには約1,200万行のコードがあります。
- 700万ドライバーLOC/
- アーチ/ 200万LOC/
- カーネルにはLOC/が139,000個しかありません。
lsmod | wc
私のDebianノートブックにはランタイムにロードされた158個のモジュールが表示されるので、動的にモジュールをロードすることはハードウェアをサポートする一般的な方法です。
make menuconfig
コンパイルするコード(より重要なのは、コンパイルするコード)を選択するための強力な構成システム(例:)いいえコンパイル)。組み込みシステムは、.config
関心のあるハードウェアサポート(カーネルに組み込まれているハードウェアまたはロード可能モジュールのサポートを含む)でのみ独自のファイルを定義します。
答え2
気になる方のために、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
役に立つたくさん行。
答え3
ドライバはカーネルで維持されているため、カーネルの変更によって機能内のすべてのユーザーに対してグローバル検索と置換(または検索と手動修正)が必要な場合は、変更を加えた人が行います。ドライバが最新のカーネルでコンパイルされていない場合は、直接更新するよりも、APIを変更した人にドライバを更新させることが大きな利点です。
または(ツリー外でメンテナンスされているドライバで発生する現象)、変更に追いつくためにメンテナンス担当者はパッチを再同期する必要があります。
クイック検索を発見ツリーの内部と外部の議論ドライバー開発。
Linuxは、主にすべてのものをメインラインリポジトリにアーカイブして維持されます。設定オプションを使用して、コンパクトで簡潔なカーネルのビルドを制御します#ifdef
。これにより、リポジトリ全体でコードの小さな部分のみをコンパイルする小さな単純なカーネルを確実に構築できます。
組み込みシステムにLinuxを広範囲に適用すると、より良いものLinuxカーネルのソースツリーは、より小さい数年前と比較して、特定の事項を省略するのをサポートします。超小型4.0カーネルは、超小型2.4.0カーネルより小さい場合があります。
答え4
Tinyconfigバブルチャートsvg(バイオリン)
シェルスクリプトカーネルビルドからjsonを生成するには、次のように使用します。http://bl.ocks.org/mbostock/4063269
編集する:いくつかの制限があることがわかりましたunifdef
(-I
無視され-include
サポートされておらず、後者は生成された設定ヘッダーを含めるために使用されます)、cat
この時点では使用法は大幅に変わりません。
274692 total # (was 274686)
スクリプトと手順が更新されました。
ドライバ、アーキテクチャなどに加えて、選択した構成によってコンパイルまたはコンパイルされない条件付きコードが多くあり、コードが必ず動的にロードされたモジュールにある必要はありませんが、コアに組み込まれています。
だからダウンロードされたlinux-4.1.6 ソースコード、選択済み小さな構成、モジュールをアクティブにしません。とにかく、カーネルを設定するためにモジュールを有効にするか、ユーザーが実行時にそれを使用して何をすることができるのか正直にわかりません。
# 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 -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