Linux カーネルのソース コード分析 2: Linux カーネルのバージョン番号とソース コードのディレクトリ構造

ここに画像の説明を挿入

1. Linux版

1. 安定版と開発版

Linux カーネルのバージョン

Linuxカーネルは主に 2 つのバージョンに分かれています。

  • 安定版 (長期サポート版): カーネルの安定版は工業用の強度を備えており、広く使用および展開できます。各世代の新しくリリースされた安定したカーネルのほとんどは、いくつかのバグを修正するか、いくつかの新しいデバイス ドライバーを追加するだけです。
  • 開発バージョン: 開発バージョンのカーネルのカーネル開発者は常に新しいソリューションを実験しているため、開発バージョンのカーネルのコードは非常に急速に変更されます。

これら 2 つのバージョンはLinuxバージョン番号によって区別されます。

2. Linuxのバージョン番号

ここに画像の説明を挿入

Linuxのバージョン番号は、主に次の 3 つのグループの数字で構成されますxxx.yyy.zzz

  • xxx: メジャーバージョン番号 ( Major Release)
  • yyy: マイナーバージョン番号 ( Minor Release)
  • zzz: リビジョン番号 ( Revision Count)

の:

  • 新しいドライバーを追加し、マイナー バージョン間のバグを修正します。例3.21.x:3.22.x
  • マイナー バージョンがある程度蓄積されると、次のような新しいメジャー バージョンがリリースされます5.x.x6.x.x
  • 各マイナー バージョンがリリースされると、使用中にバグが見つかる可能性があるため、次のようなマイナー バージョンの改訂版がリリースされます5.6.135.6.14

安定Linuxバージョンと開発バージョンは、マイナー バージョン番号によって区別されます。

  • 偶数のバージョン番号は、カーネルのバージョンが安定したバージョンであることを示します
  • 奇数のバージョン番号は、カーネルのバージョンがベータ版であることを示します

たとえば、次のようになりますLinux 3.6.34

  • 主版本号:3
  • 次版本号:6、安定版
  • 修订版本号:34、現在のバージョンがLinux 3.6リビジョン 34 であることを示します。

ただし、その後のリビジョンはすべてバグ修正であり、新機能のリリースを含まないため、メジャー バージョン番号とマイナー バージョン番号の組み合わせで実際にカーネルのバージョンを表すことができます。

2、Linuxカーネルのソースコード構成構造

Linuxカーネル ソース コードは膨大で、2020 年バージョンのカーネル ソース コードはすでに 2,780 万行あり、これらのコードは 66,492 個の C ファイルに分散されています。Linuxコードのソース ファイルは、特定の組織構造に従って異なるディレクトリに保存され、各ディレクトリ内のソース コードの機能は論理的に同じ点を持ちます

ディレクトリに加えて、特別な役割と目的を持つファイルもいくつかあります。

ここに画像の説明を挿入

1. ディレクトリ

Linuxソース コードのルート ディレクトリの下に一連のディレクトリが格納されており、各ディレクトリには多数の C コードが存在します。これらのCコードを論理的に機能分けした上で、同じフォルダに入れてください。

ここに画像の説明を挿入

A.archフォルダー

archアーキテクチャに関連するコードはディレクトリに保存され、異なるシステムやプラットフォーム間の違いを保護するために使用されます。例えば:

  • RISC-VCPU仮想アドレスを開くアーキテクチャのアドレス変換機能は、satpレジスタとmstatusレジスタの読み書きを行う必要があります。
  • x86オープン仮想アドレスのアドレス変換機能は、レジスタとレジスタのCPU読み書きを行う必要があります。cr3cr0

Linux仮想アドレス変換関数を開く関数は ですswitch_mm仮想アドレス変換関数を開くにはアーキテクチャが異なると異なる操作が必要となるため、この関数はディレクトリにswitch_mm配置されます。arch

ここに画像の説明を挿入

実は、switch_mm割り込み処理関数など、似たような関数はたくさんあります... そこで、Linux各システムに依存するコードはカーネルarch内のディレクトリに配置されます。
ここに画像の説明を挿入

B.blockフォルダー

blockこのフォルダーには、Linuxカーネルのブロック デバイス ドライバーが保存されます。ブロックデバイスとは、固定サイズのブロックに情報を格納することを指し、各ブロックには独自のアドレスがあり、CPUアドレスを指定することでデバイス上の任意の場所にある一定の長さのデータを読み取ることができます。

ブロック デバイスは実際には、グラフィックス カードなどのコンピューティング デバイスではなく、デバイスの種類、具体的にはデバイス、つまりI/Oデータを保存するデバイスを指しますCPU硬盘U盘SD卡

なお、後述するLinuxカーネルソースコードのルートディレクトリ下にはdriversディレクトリが存在し、このディレクトリ内に各種デバイスのドライバが配置されている。論理的に言えば、ブロックデバイスドライバーも一種のドライバーであるはずですが、なぜそれをディレクトリの下にblock置かずに個別に取り出すのでしょうか?drivers

これは実際には、driversさまざまなデバイスのドライバーが実際にディレクトリの下に配置されているためです。たとえば、次のとおりです。

  • driver/cdromCD-ROMのドライバーは次のフォルダに格納されています。
  • driver/usbUSBデバイスのドライバーは、U ディスクなどのフォルダーに保存されます。

実際、読み取り専用 CD と CD-ROM は両方ともUSBブロック デバイスであるため、ブロックの読み取りやブロックの書き込みなどのブロック操作は同じですが、ブロックの読み取りの操作は特定のデバイスによって異なります。

したがって、Linux一般block的なブロックデバイスドライバー、つまりブロックの書き込みとブロックの読み取りの機能はディレクトリに格納され、ブロックの読み取りを行う特定のデバイスの機能はディレクトリに格納されますdriver/设备したがって、ディレクトリをルートディレクトリにLinux置きます。block

実装に関しては、blockディレクトリを除いて、ディレクトリipcnet同じです。ipc一般的なデバイス ドライバーと一般的なネットワーク ドライバーを保存するだけです。

C.certsディレクトリ

certsLinux認証と署名に関連するコードは、ディレクトリに保存されます。このディレクトリには、署名付きモジュール、カーネル コード、ユーザー スペース アプリケーションなどを検証するために使用できる、いくつかのプリインストールされたデジタル証明書が含まれています。これらの証明書を使用すると、これらのコンポーネントが信頼できるソースからのものであることを確認できるため、システム セキュリティが向上します。

このディレクトリが必要な理由は、このバージョン以降、Linuxカーネルが動的ロードをサポートしているためです2.2内核模块

カーネルモジュール

カーネルをコンパイルするとき、すべてのドライバー、ファイル システム、またはネットワーク プロトコル コードがカーネルにコンパイルされます。最終的に、カーネルはさまざまなデバイス用のドライバーでいっぱいになります。コンピューターのハードウェア システムには 10 種類以上のデバイスしかないかもしれませんが、実行中のカーネルにはデバイス用のドライバーが 400 以上あります。

だからこそ、バージョンアップ後に提案されたコンセプトは、カーネルのバイナリプログラムからファイルシステムやドライバなどを分離し、コンパイル段階で別ファイルを生成するLinuxというものだった。将来どのプログラムが必要になるかは、対応するファイルをロードするだけです。2.2内核模块.so.so

たとえば、私たちがファイルシステムとストレージの研究者として、extファイルシステムの欠点を改善し、独自のファイルシステムIronファイルシステムを提案したとします。ファイル システムをテストしたいので、この時点では、 の形式でファイル システムのプログラムを内核模块作成できます。カーネルは、実行中に、作成したファイル システムをメモリにロードできます。IronLinuxIron内核模块

内核模块これらは、システムの実行中に動的にロードおよびアンロードできます。つまり、システムの起動時に必ずしもロードされるわけではなく、必要に応じてロードされます。この動的な読み込み方法は、システムの柔軟性と拡張性に大きなメリットをもたらしますが、システムに潜在的なセキュリティ リスクももたらします。

たとえば、攻撃者は、機密情報の窃取、サービス拒否攻撃、権限昇格などの通常のカーネル モジュール機能を実装するコードに悪意のあるコードを追加する可能性があります。最後に、正規のカーネル モジュールに偽装され、コンパイルされた.soファイルが元の通常のファイルに置き換えられます内核模块最後に、ユーザーがこれらの悪意のある内核模块カーネル モジュールをロードすると、これらの悪意のあるカーネル モジュールはシステムに損傷を与え始めます。

このため、オープン ソースのソース コード、検証済みカーネルに悪意のあるコードが挿入されたり、悪意のあるカーネル モジュールが読み込まれたりするのを防ぐために、Linux含まれる複数のコンポーネントを検証する必要があります。内核模块Linux

ここに画像の説明を挿入

D.cryptoディレクトリ

cryptoLinuxカーネルで一般的に使用される圧縮および暗号化アルゴリズムは、ディレクトリに保存されます。

1. カーネル内の暗号化アルゴリズム

Linuxカーネルは多くの場所で暗号化アルゴリズムを使用する必要があり、基本的に、Linux暗号化ファイル システム、ネットワーク送信の暗号化、デジタル署名、安全なログインなど、パスワードを保存する必要があるさまざまなセキュリティ機能がシステムに実装されています。暗号化されること。

したがって、Linuxカーネル内のディレクトリには、、、、など、一般的に使用される暗号化アルゴリズムcrypto実装が含まれています。AESDESSHA1SHA256

また、暗号化と復号化は頻繁に使用されるため、Linuxカーネルcryptoディレクトリには、ハードウェア ベースのアクセラレータなど、暗号化/復号化を高速化するハードウェア用のドライバも提供されており、AESこれらのドライバを使用してこれらのハードウェアを呼び出すことで、カーネルの暗号化と復号化のパフォーマンスを向上させることができますLinux。パフォーマンス。

2. カーネル圧縮アルゴリズム

Linuxカーネルのソース コードは現在 1.1G で、最終的にコンパイルされたバイナリ形式のカーネルはさらに大きくなるだけです。起動する前に、Linuxカーネルはファイルの形式でディスク上に存在し、実行する場合はメモリにロードする必要があります。したがって、起動時間とメモリ使用量を削減するために、Linuxカーネルはそれ自体を圧縮し、必要に応じて対応するコードを解凍します。

したがって、カーネルの圧縮アルゴリズムの主な目的は、カーネル イメージのサイズを削減することです圧縮を行わないと、カーネル イメージのロードと実行に時間がかかり、より多くのメモリ領域を占有することになります。

圧縮アルゴリズムを使用すると、カーネル イメージのサイズを半分またはさらに小さくすることができるため、起動速度が向上し、メモリ領域が節約されますさらに、一部のファイル システムでは、ストレージ領域の使用量を削減し、ファイル システムのパフォーマンスを向上させるために圧縮アルゴリズムも使用します。

もちろん、圧縮と解凍の両方にオーバーヘッドがかかります。圧縮アルゴリズムによりカーネル イメージのサイズは削減できますが、カーネルの起動時の解凍時間も長くなります。したがって、Linuxカーネルが特定の圧縮アルゴリズムを選択する場合、圧縮率と解凍時間のバランスをとる必要性に応じて圧縮アルゴリズムを選択するか、最高のパフォーマンスを得るためにユーザーが指定した圧縮アルゴリズムを直接使用します。

具体的には、cryptoディレクトリに実装さLinuxているさまざまな圧縮アルゴリズムにはLZO、、、、が含まれます。LZ4ZlibDeflate

E.Documentationディレクトリ

DocumentationディレクトリはLinuxカーネルのドキュメントであり、主にさまざまなモジュールの機能を説明し、いくつかの仕様を定義します。

例えば:

cat Documentation/riscv/boot-image-header.rst | less

ここに画像の説明を挿入

F.driversディレクトリ

driversこのディレクトリには、Linuxカーネルのさまざまなハードウェアのドライバーが保存されます。デバイスの例GPIO:

ls drivers/gpio | less

ここに画像の説明を挿入

CPUモデルごとに設定と初期化方法が異なるGPIOため、さまざまなチップのコードがLinuxディレクトリdrivers/gpioに保存されますGPIO

G.fsディレクトリ

fsディレクトリ108には、Linux仮想ファイルシステムのコードや各種ファイルシステムのコードが格納される。

たとえば、Windowsより一般的なntfsファイル システムの実装はfs/ntfs次のディレクトリにあります。

ls fs/ntfs | less

ここに画像の説明を挿入

H.includeディレクトリ

includeLinuxカーネル ソース コードが依存するヘッダー ファイルのほとんどは、ディレクトリに保存されます。各ヘッダー ファイルにはカーネルのさまざまな定義と宣言が含まれており、カーネルの構築と開発に必要なサポートを提供します。

I.initディレクトリ

initカーネル初期化のコードはディレクトリに保存されます。

カーネルの実行プロセス全体は、実際には 2 つのプロセスとみなすことができます。

  • 電源ボタンを押してカーネルを起動すると、カーネルはユーザーがこのプロセスを使用するのを待つ準備が整います。このプロセスはと呼ばれます。初始化
  • ユーザーがカーネルの使用を開始し、シャットダウンされるまでカーネルは正常に動作します。このプロセスがカーネルの通常の動作プロセスです。

初期化フェーズでは、カーネルは次のような多くのことを行う必要があります。

  • 利用可能な物理メモリをカウントし、仮想アドレス変換を有効にし、メモリ管理モジュールを初期化します...
  • スレッド管理モジュールを初期化し、カーネル スレッドを構築し、実行する初期スレッドを作成して対話型シェルを使用します...
  • ……

カーネルは複数のコンポーネントで構成されているため、カーネル初期化フェーズのコードは実際にカーネルの各コンポーネントに入り、各コンポーネントの初期化を完了します

J.ipcディレクトリ

ipcディレクトリはプロセス間通信の実装であり、将来的にはカーネルのプロセス間通信モジュールにコンパイルされる予定です。Linux一般的に使用される、次のようなさまざまなプロセス間通信メカニズム。

  • 信号量
  • 共有メモリ
  • 匿名パイプ
  • ……

実装コードはすべてipcこのディレクトリの下にあります。

ls ipc

ここに画像の説明を挿入

K.kernelディレクトリ

kernelディレクトリはカーネルのコア コードであり、次のものが含まれます。

  • プロセス管理
  • 割り込み管理
  • 時計
  • ……

これらはカーネルの中核となる機能コンポーネントであるため、すべてkernelこのディレクトリの下に配置されます。

L.libディレクトリ

libこのディレクトリには、次のようないくつかの共通ライブラリ関数が含まれています。 、memset...strlenこれらの関数はカーネルの他の部分で使用できるため、カーネルの開発が簡素化されます。自分で書いたユーザープログラム#include <stdlib.h>にも#include<stdio.h>対応できますmemsetが、memsetカーネルディレクトリlib内のプログラムとはmemset異なりますのでご注意ください。

memsetで定義された関数を使用しますC标准库が、C标准库実際にはオペレーティング システムのサポートが必要なため、カーネルのソース コードを作成する際にはそれらは使用されず、一部の関数は自分でC标准库手動で実装する必要があります。C标准库

したがって、この観点から見ると、カーネル ソース コード内のディレクトリは実際には実装のサブセットlibです。C标准库

さらに、libディレクトリには、リンク リスト、ハッシュ テーブル、赤黒ツリー、ビットマップなどのいくつかの一般的なデータ構造とアルゴリズムの実装があります。

M.mmカタログ

mmディレクトリは、次Linuxのようなカーネル メモリ管理に関連する実装です。

  • 物理メモリ管理
  • ページ割り当てアルゴリズム
  • ページフォルト割り込み、ページ変更アルゴリズム
  • ……

N.netディレクトリ

netこのディレクトリは、blockワイヤレス ネットワーク カード (つまりWiFi)、イーサネット (つまり、有線)、4G などのさまざまな種類のネットワーク デバイスと、これらの特定のネットワーク デバイスのドライバー コードが存在するため、ディレクトリと似ています。driversディレクトリに配置されます。

デバイスの種類が何種類であっても、ネットワーク プロトコル スタックは実際には同じです。たとえば、ワイヤレス ネットワーク カードとイーサネットはデータ パケットの送受信に使用されます。データ パケットの送受信に使用されるデバイスは異なりますが、それらは同じです。すべて IPv4 ネットワーク プロトコルに従います。したがって、Linuxカーネルは、ネットワーク プロトコルによって実装されたコードをnetディレクトリに配置します。

netカタログに実装されているネットワーク プロトコルには次のものがあります。

  • TCP
  • IPv6
  • DNS
  • ……

O.samplesディレクトリ

samplesカーネルのサンプル コードとプログラムの一部は、 ディレクトリ に保存されています。これらのコードとプログラムは、初心者のカーネル エンジニアがカーネルの動作原理と実装の詳細をLinuxよりよく理解するのに役立ちます。Linux

samplesディレクトリ内のサンプル コードとプログラムは、開発者が、Linuxネットワーク プロトコル スタック、ファイル システム、ドライバー、スケジューラに関連する関数、および機能モジュール内のその他の関連関数など、カーネルによって実装される関数の使用方法を学習するのに役立ちます。

同時に、これらのサンプル コードおよびアプリケーション プログラムは、開発者が独自のカーネル モジュールおよびアプリケーション プログラムを開発するためのLinux参考および例として使用することもできます。

最後に、samplesディレクトリにはテスト ケースとしていくつかのプログラムがあり、Linuxカーネルのさまざまな機能とインターフェイスの正確性とパフォーマンスをテストするために使用できます。

基本的に、私たちが最初にカーネル開発を学び始めたときLinux、または他のディレクトリのコードを直接変更して独自のコードを挿入すると実行できなくなりデバッグが難しくなるのを避けるHacking Linux Kernelために、通常、コードをカーネル開発用のディレクトリに置きます。テスト中。今後スキルを向上させた場合は、他のディレクトリのコードを修正する予定です。Linuxsamples

P.scriptsカタログ

Linuxカーネル ソース ディレクトリ内のディレクトリscriptsには、カーネル開発者がカーネルのコンパイル、デバッグ、分析、最適化を実行するのに役立ついくつかのスクリプト ツールが含まれています。

具体的には、scriptsディレクトリには次のカテゴリのツールが含まれています。

  1. コンパイル ツール:このディレクトリには、 その他のツール スクリプトscriptsなど、カーネルをコンパイルするためのいくつかのツール スクリプトが含まれています。これらのツール スクリプトは、開発者がカーネル ソース コードをコンパイルし、実行可能なカーネル イメージ ファイルを生成するのに役立ちます。makegccld
  2. デバッグ ツール:このディレクトリには、 およびその他のツールのスクリプトscriptsなど、カーネルをデバッグするためのいくつかのスクリプト ツールが含まれています。これらのスクリプトは、開発者がカーネルをデバッグし、カーネル内のさまざまな問題を特定して解決するのに役立ちます。gdbkgdbkdb
  3. 分析ツール:scriptsこのディレクトリには、カーネルを分析するためのスクリプト ツール ( perftrace-cmdなど) が含まれています。これらのツールは、開発者がカーネルのパフォーマンス分析、トレース、統計を実行して、カーネル内のパフォーマンスのボトルネックや最適化ポイントを見つけるのに役立ちます。
  4. コード検査ツール:scriptsこのディレクトリにはcheckpatch.pl、 、などのコード検査用のいくつかのスクリプト ツールが含まれていますsparseこれらのスクリプト ツールは、開発者がカーネル ソース コード内のコード スタイル、構文エラー、メモリ リーク、その他の問題をチェックして、コードの品質と保守性を向上させるのに役立ちます。

Q.securityカタログについて

Linuxカーネル ソース ディレクトリ内のディレクトリは、次のようなカーネル セキュリティ メカニズムの実装をsecurity提供します。 (つまり、)、LinuxAccess Contol ListACLSELinux

このディレクトリ内のコードは主にセキュリティ関連の機能を実装するため、このディレクトリは、開発者がシステムのセキュリティ パフォーマンスを強化するのに役立つセキュリティ関連のモジュールとインターフェイスを提供しますLinux

具体的には、securityディレクトリには次のタイプのモジュールとインターフェイスが含まれています。

  1. セキュリティ モジュール:securityディレクトリには、 などのいくつかのセキュリティ モジュールが含まれていSELinuxますAppArmorこれらのセキュリティ モジュールは、開発者がシステム内のさまざまなリソースに対してアクセス制御とセキュリティ戦略管理を実装するのに役立ち、それによってシステムのセキュリティ パフォーマンスが向上します。
  2. セキュリティ インターフェイス:securityディレクトリには、 などのいくつかのセキュリティ インターフェイスも含まれていsecurity_inode_permissionますsecurity_file_permissionこれらのセキュリティ インターフェイスは、開発者がシステム内のさまざまなリソースへのアクセス制御と権利管理を実装するのに役立ち、それによってシステム内の機密データとアプリケーションを保護します。
  3. セキュリティ ポリシー:securityこのディレクトリにはcapability、 、posix_aclなどのいくつかのセキュリティ ポリシーも含まれています。これらのセキュリティ ポリシーは、開発者がシステム内のさまざまなリソースへのアクセス制御と権限管理を実装するのに役立ち、それによってシステム内の機密データとアプリケーションを保護します。

R.soundディレクトリ

soundこのディレクトリは、Linuxサウンド関連のドライバーとモジュールが含まれるカーネル ソース内のディレクトリです。netディレクトリと同様にblock、特定のタイプのサウンド カード デバイスのドライバがdriversディレクトリに配置され、soundディレクトリ内のコードは一般的なサウンドの再生、録音、および処理機能に重点を置いています。

したがって、soundディレクトリは、driversディレクトリ内のさまざまなタイプのサウンド カードのドライバを呼び出します。これにより、カーネルは、サウンドのLinux再生、録音、処理のための複数のサウンド カード デバイスの使用をサポートし、ユーザー プログラムに一連のインターフェイスと機能を提供できます。

具体的には、soundディレクトリが主に実装しているもの、またはLinux現在サウンドを処理しているモジュールのアーキテクチャはの略称であり、システム内のサウンド処理のための高度なアーキテクチャALSAです。この仕様では、システムがさまざまなサウンド カード デバイスをサポートできるようにする一連のドライバーとライブラリを定義し、アプリケーションがサウンドを簡単に録音、再生、処理できるようにする一連のインターフェイスと機能を提供しますAdvanced Linux Sound ArchitectureLinuxalsaLinux

さらにalsa、このディレクトリには、サブディレクトリsoundなど、他のいくつかのサウンド ドライバおよびモジュールも含まれています。サブディレクトリは、徐々に置き換えられてきた古いサウンド アーキテクチャの頭字語ですossOpen Sound SystemLinuxalsa

さらに、soundこのディレクトリには、USB サウンド カード ドライバー、Bluetooth ヘッドセット ドライバーなど、他のいくつかのサウンド ドライバーとモジュールも含まれています。これらのドライバーとモジュールは、さまざまなサウンド カード デバイスをサポートし、Linux システムがサウンドを再生、録音、処理できるようにする一連のインターフェイスと機能を提供します。

S.toolsディレクトリ

Linux カーネル ソース ディレクトリには、tools通常、カーネルの開発とデバッグに使用されるいくつかのツールとユーティリティのソース コードが含まれています。これらのツールの中には C で書かれたものもありますが、その他のツールはPython他のスクリプト言語で書かれています。具体的には:

  • これらのツールには、システムのデバッグやパフォーマンス分析のためのいくつかのプログラムが含まれていますperfftrace
  • kconfigカーネルの構築とコンパイルのkbuildためのツールもいくつか含まれています。
  • シミュレーションやテスト用のプログラム ( やktestなどkvm)も含まれています。

toolsディレクトリ内のツールとユーティリティは、カーネルの開発とデバッグにとって非常に重要です。通常、上級Linuxカーネル開発者は、これらのツールの使用法と実装原則をよく知っている必要があります。

T.usrカタログ

usrこのディレクトリは、ユーザーがパッケージ化して圧縮したカーネル実装のソース コードです。

U.virtディレクトリ

virtこのディレクトリは、Linuxカーネルの仮想化サポートのコード実装を提供します。

たとえば、virt/kvmこのディレクトリには、Linuxカーネル内のKVM仮想化モジュールのソース コードが含まれており、これにより Linux カーネルが仮想マシン モニタ ( VMM) として機能し、仮想マシンを実行できるようになります。

W.LICENSEディレクトリ

Linuxカーネル ソース ディレクトリ内のディレクトリには、カーネル ソースで使用されるさまざまなライセンスのテキスト ( など)がLICENSES含まれています。LinuxGPLLGPLBSDMIT

このディレクトリの目的は、Linuxカーネル ソース コードの開発者が各ライセンスの特定の内容と制限を簡単に表示して理解できるようにすることです。

Linuxこのディレクトリは、カーネル ソース コードのオープン性と透明性を確保し、誰もLinuxがカーネル ソース コードの使用条件と制限を理解して、これらのライセンスと規制をより適切に遵守できるようにすることを目的としています。

2. 文書化

カーネル ソース コードディレクトリには、ディレクトリに加えてLinuxいくつかのファイルが保存されており、これらのファイルにはさまざまな用途があります。

ここに画像の説明を挿入

A.COPYING書類

Linuxカーネル ソース コード ディレクトリ内のファイルは、カーネル ソース コードの使用に関する条件と制限をCOPYING規定する著作権表示ファイル、つまりライセンスです。Linux

Linuxカーネル ソース コードで使用されるライセンスは ですGPLv2オープンソース ライセンスでは、誰でもカーネル ソース コードをGPLv2自由に使用、コピー、配布、変更できると規定されていますが、ライセンスを使用すると、得られる結果もオープンソース化されます。LinuxGPL

Linuxカーネルのソース コードのほとんどは同じ を使用しますGPLv2が、一部のシステム コールなどの例外もあり、対応する認可ステートメントは次 LICENSES/exceptions/Linux-syscall-noteのとおりです。

b.CREDITファイル

Linuxカーネル ソース ディレクトリ内のファイルには、次のようなカーネルに貢献したCREDITすべての人々がリストされています。Linux

  • カーネル開発者
  • メンテナー
  • テスター
  • ……

CREDITLinuxこのファイルの目的は、カーネルに貢献したすべての人々を讃え、感謝し、彼らの貢献と成果を文書化することです。

同時に、CREDITこのドキュメントはLinuxコミュニティ文化の一部でもあり、誰もがカーネルの開発と保守Linuxに参加できるように、カーネル開発のオープンさ、協力、コミュニティ精神を強調しています。Linux

c.Kbuildファイル

Linuxカーネル ソース ディレクトリ内のファイルは、カーネルのKbuild構築に使用されますこのファイルは主にカーネルを構築するための構成を定義することに注意してくださいカーネルのコンパイル時に実行するコマンドは主にファイルで定義されます。LinuxMakefileKbuildLinuxMakefileMakefile

KbuildLinuxこのファイルの機能は、カーネルの構築プロセスを自動化し、開発者がLinuxカーネルを簡単にコンパイル、構築、インストールできるようにすることです。

同時に、Kbuildこのファイルは次のような高度なコンパイル機能も提供します。

  • モジュラーコンパイルをサポート
  • クロスコンパイル
  • 並列コンパイル
  • ……

これらの機能により、Linuxカーネルの構築がより柔軟かつ効率的になります。

D.MAINTAINERSファイル

Linuxカーネル ソース ディレクトリ内のファイルには、MAINTAINERS現在のすべてのカーネルのメンテナのリストが保存されています。Linuxカーネル内のさまざまなサブシステムの保守者と貢献者を記録します。

MAINTAINERSこのファイルの役割は、開発者がサブシステムの責任を負うメンテナまたはコントリビュータをすぐに見つけられるようにして、コードの提出、修復、または共同開発を容易にすることです。

MAINTAINERSこのファイルには、Linuxカーネル内の各サブシステムの保守者および貢献者の名前、電子メール アドレス、会社、担当サブシステム、およびその他の情報がリストされています。このファイルを通じて、開発者は関心のあるサブシステムを担当するメンテナやコントリビュータを見つけて、コードを送信したり問題を報告したりできます。

MAINTAINERSこのドキュメントは開発者向けのリファレンスであるだけでなく、Linuxカーネル コミュニティの組織化および管理ツールとしても機能します。このファイルを通じて、カーネル コミュニティは各サブシステムのメンテナとコントリビュータを管理および調整し、カーネルの良好な開発と安定性Linuxを確保できます。Linux

E.Makefileドキュメント

Linuxカーネル ソース ディレクトリ内のファイルは、Makefileカーネルをコンパイルするために使用されます。これには、カーネルのコンパイル時に実行する必要がある次のような一連のコマンドが含まれています。

  • カーネルイメージを生成するためのコマンド
  • カーネルモジュールを生成するコマンド
  • ……

MakefileファイルはKbuildファイル内の構成情報を読み取り、カーネル ソース コードをコンパイルするためのコンパイル コマンドを生成します。

カーネル イメージとモジュールのコンパイルに加えて、Makefile次のような他の操作がファイル内で定義されます。

  • カーネルをインストールする
  • パッケージ化されたカーネル
  • コンパイルされたファイルをクリアする
  • ……

Makefileこのファイルは、makeコマンド呼び出し時のさまざまなターゲットの指定に応じて、make allカーネルとモジュールのコンパイル、make installカーネルのインストール、make cleanコンパイルによって生成されたファイルのクリアなど、さまざまな操作を実行します。

F.READMEドキュメント

Linuxカーネル ソース ディレクトリ内のファイルREADMEには、カーネルの特定のバージョンに関する次のような基本情報が含まれています。

  • カーネルのバージョン番号
  • サポートされているハードウェア プラットフォーム
  • インストールおよび構成ガイド
  • ……

さらに、READMEファイルには次のような他の有用な情報が含まれる場合があります。

  • 既知の問題、制限事項
  • バグ修正

通常、READMEファイルには、ユーザーがすぐに使い始めるのに役立つカーネルに関する基本情報が含まれています。

おすすめ

転載: blog.csdn.net/qq_45488242/article/details/130915883