Linux カーネルのソース コードは、/usr/src/linux ディレクトリに配置されます。カーネル ソース コードの構成: 1. アーチ ディレクトリ (コア ソース コードでサポートされるハードウェア アーキテクチャに関連するコア コードが含まれます); 2. インクルード ディレクトリ (コアのインクルード ファイルのほとんどが含まれます); 3. initディレクトリにはコアのスタートアップ コードが含まれ、4. mm ディレクトリにはすべてのメモリ管理コードが含まれ、5. drivers ディレクトリにはシステム内のすべてのデバイス ドライバが含まれ、6. Ipc ディレクトリにはコアのプロセス間通信コードが含まれます。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
Linux カーネルのソース コードはどこですか?
Linux カーネルのソース コードは、多くのソースから入手できます。一般に、インストールされた Linux システムでは、/usr/src/linux ディレクトリの内容がカーネル ソース コードです。
ソースコードの読み込みをスムーズに進めるためには、事前にソースコードの知識背景をある程度理解しておくのがベストです。
Linux カーネルのソース コードは次のように構成されます (Linux ディレクトリに相対していると仮定します):
arch
このサブディレクトリには、このコア ソース コードでサポートされるハードウェア アーキテクチャに関連するコア コードが含まれています。たとえば、X86 プラットフォームの場合は i386 です。
include
このディレクトリには、ほとんどのコア インクルード ファイルが含まれています。サポートされているアーキテクチャごとにサブディレクトリもあります。
init
このディレクトリには、コアの起動コードが含まれています。
mm
このディレクトリには、すべてのメモリ管理コードが含まれています。特定のハードウェア アーキテクチャに関連するメモリ管理コードは、arch/*/mm ディレクトリにあります (たとえば、X86 に対応するコードは、arch/i386/mm/fault.c です)。
drivers
システム内のすべてのデバイス ドライバーは、このディレクトリにあります。さらに、いくつかの種類のデバイス ドライバーに分類され、それぞれに、ドライバー/サウンドに対応するサウンド カード ドライバーなど、対応するサブディレクトリもあります。
Ipc
このディレクトリには、コアのプロセス間通信コードが含まれています。
modules
このディレクトリには、構築され、動的にロードできるモジュールが含まれています。
fs Linux
サポートされているファイル システム コード。ファイル システムが異なれば、対応するサブディレクトリも異なります。たとえば、ext2 ファイル システムは ext2 サブディレクトリに対応します。
カーネル
メインコアコード。同時に、プロセッサ構造に関連するコードが Arch/*/kernel ディレクトリに配置されます。
#Net
#コア ネットワーク部分のコード。内部の各サブディレクトリはネットワークの側面に対応します。Lib
このディレクトリには、コア ライブラリ コードが含まれています。プロセッサ アーキテクチャに関連するライブラリ コードは、arch/*/lib/ ディレクトリに配置されます。 #Scriptsこのディレクトリには、コアの構成に使用されるスクリプト ファイルが含まれています。
Documentationこのディレクトリには、参照用のドキュメントがいくつか含まれています。
#Linux カーネル ソース コードの解析方法###2。芯のデザインが素敵です。カーネルの特殊なステータスにより、カーネルの実行効率は現在のコンピュータ アプリケーションのリアルタイム要件に応えるのに十分高くなければならないため、Linux カーネルでは C 言語とアセンブリのハイブリッド プログラミングが使用されます。しかし、ソフトウェアの実行効率とソフトウェアの保守性は、多くの場合、相反するものであることは誰もが知っています。カーネルの効率を確保しながらカーネルの保守性を向上させる方法は、カーネルの「美しい」設計にかかっています。
3.素晴らしいプログラミングスキル。アプリケーション ソフトウェア設計の一般的な分野では、コーディングの状況はあまり強調されないかもしれません。開発者はソフトウェアの優れた設計により注意を払い、コーディングは単なる実装手段の問題です。斧を使って木を切るのと同じで、何も必要はありません。考えすぎ。しかし、これはカーネルでは当てはまらず、優れたコーディング設計は保守性を向上させるだけでなく、コードのパフォーマンスも向上させます。 カーネルに対する理解は人によって異なります。カーネルに対する理解が深まるにつれて、カーネルの設計と実装についてより多くの考えや経験を積むことになります。したがって、この記事は、Linux カーネルの扉の外をさまよっているより多くの人々が Linux の世界に入り、カーネルの魔法と素晴らしさを自分で体験できるようにガイドしたいと考えています。また、私はカーネル ソース コードの専門家ではありません。ソース コードの分析における私自身の経験と経験を共有し、必要な方に参考と支援を提供できればと思っています。コンピュータ業界のために、特にオペレーティング システム カーネルに関して、ささやかな努力をしてください。早速(長くなってしまいました、ごめんなさい~)、私自身の Linux カーネル ソース コード分析方法を共有しましょう。本質を探る前に、新しいものを理解するという視点からこのプロセスにより、新しいものについての予備的な概念を得ることができます。例えば、ピアノを習いたいと思った場合、まずピアノを弾くためには基礎的な音楽理論、簡易記譜法、五線譜などの基礎知識が必要であることを理解し、次にピアノの演奏技術や運指を学び、ようやくピアノを始めることができます。ピアノの練習中。
カーネル コードの分析についても同様で、まず分析対象のコードに含まれるコンテンツを特定する必要があります。プロセスの同期とスケジューリングのコード、メモリ管理のコード、デバイス管理のコード、システム起動のコードなどですか。カーネルのサイズが大きいため、すべてのカーネル コードを一度に分析することはできないため、適切な分業を行う必要があります。アルゴリズム設計が示すように、大きな問題を解決するには、まずそれに含まれる部分的な問題を解決する必要があります。
分析対象のコード範囲を特定したら、手元にあるすべてのリソースを使用して、コードのこの部分の全体的な構造と一般的な機能をできるだけ包括的に理解できます。
ここで言及されているすべてのリソースは、Baidu、Google 大規模オンライン検索エンジン、オペレーティング システム原理の教科書および専門書籍、または他の人が提供する経験や情報、さらには Linux ソース コードによって提供されるドキュメントの名前、コメント、ソース コード識別子 (コード内の識別子の名前を過小評価しないでください。重要な情報が得られる場合もあります)。つまり、ここでのすべてのリソースは、考えられるすべての利用可能なリソースを指します。もちろん、このような形式の情報収集で必要な情報をすべて入手することは不可能ですが、できる限り網羅的に情報を収集したいと考えています。収集する情報が包括的であればあるほど、その後のコード分析プロセスでより多くの情報を使用できるようになり、分析プロセスの難易度が低くなるためです。
ここでは、Linux 周波数変換メカニズムによって実装されたコードを分析することを想定した簡単な例を示します。今のところこの用語しかわかっていませんが、文字通りの意味からすると、CPU の周波数調整に関係するものであると大まかに推測できます。情報収集を通じて、次の関連情報を取得できるはずです:
1. CPUFreq メカニズム。
2.パフォーマンス、省電力、ユーザースペース、オンデマンド、保守的な周波数調整戦略。
3. /ドライバー/cpufreq/。
4. /ドキュメント/cpufreq。
5. P ステートと C ステート。
Linux カーネル コードを分析するときにこの情報を収集できた場合は、非常に「幸運」です。結局のところ、Linux カーネルに関する情報は、確かに .NET や JQuery ほど豊富ではありませんが、強力な検索エンジンや関連する研究資料が存在しなかった 10 年以上前に比べれば、「偉大な情報」と呼ぶべきでしょう。ハーベスト時代!簡単な「検索」 (1 ~ 2 日かかる場合があります) によって、コードのこの部分が配置されているソース コード ファイル ディレクトリも見つかりました。この種の情報はまさに「貴重」であると言わざるを得ません。
データ収集から、ソース コードに関連するソース コード ディレクトリを見つけることができたのは「幸運」でした。ただし、これは、このディレクトリ内のソース コードを実際に分析していることを意味するものではありません。見つかったディレクトリが散在している場合もあれば、特定のマシンに関連するコードが多数含まれている場合もあります。そのため、マシンに関連する特殊なコードよりも、分析対象のコードの主要なメカニズムに関心があることがあります (これはカーネルの性質をより深く理解するのに役立ちます)。したがって、情報の中からコードファイルが含まれる情報を慎重に選択する必要があります。もちろん、このステップが一度に完了する可能性は低く、分析対象のすべてのソース コード ファイルを一度に選択でき、どれも見逃されないという保証は誰にもできません。しかし、心配する必要はありません。ほとんどのモジュールに関連するコア ソース ファイルをキャプチャできれば、後でコードを詳細に分析することで自然にそれらをすべて見つけることができます。
上記の例に戻り、/documention/cpufreq にあるドキュメントを注意深く読みます。現在の Linux ソース コードでは、モジュールに関連するドキュメントがソース コード ディレクトリのドキュメント フォルダーに保存されます。分析対象のモジュールにドキュメントがない場合、主要なソース コード ファイルを見つけるのが多少難しくなりますが、解析したいソースコードが見つからなくなることはありません。ドキュメントを読むことで、少なくともソース ファイル /driver/cpufreq/cpufreq.c に注目することができます。このソース ファイルのドキュメントと、以前に収集した周波数変調戦略を組み合わせることで、cpufreq_performance.c、cpufreq_powersave.c、cpufreq_userspace.c、cpufreq_ondemand、および cpufreq_conservative.c の 5 つのソース ファイルに簡単に注目できます。関係する書類はすべて見つかったでしょうか?心配しないで、それらから分析を開始すると、遅かれ早かれ他のソース ファイルが見つかるでしょう。 Windows で SourceInsight を使用してカーネル ソース コードを読み取る場合、コード分析と組み合わせた関数呼び出しやシンボル参照検索などの機能を通じて、他のファイル freq_table.c、cpufreq_stats.c、および /include/linux/cpufreq を簡単に見つけることができます。 。
#関係するすべてのソース コード ファイルを配置した後単純なアノテーションを使用すると、次の結果が得られます:
1.基本的には、ソース コード内のコード要素の意味を理解します。
2.基本的に、このモジュールに関係する主要なソース コード ファイルはすべて見つかりました。
以前に収集した情報とデータに基づいて分析するコードの全体的またはアーキテクチャの説明と組み合わせることで、分析結果とデータを比較して、コードの理解を決定および修正することができます。このように、簡単なコメントを通じて、ソースコードモジュール全体の主な構造を把握することができます。これにより、単純なアノテーションの基本的な目的も達成されます。
コードの簡単なコメントが完了すると、モジュールの分析の半分が完了したと考えられ、残りのコンテンツが完成します。コードを徹底的に分析し、徹底的に理解する必要があります。単純なコメントではコード要素の特定の意味を必ずしも正確に説明できるとは限らないため、詳細なコメントが非常に必要です。このステップでは、次のことを明確にする必要があります:
1.変数定義を使用する場合。
2.マクロで定義したコードを使用する場合。
3.関数のパラメータと戻り値の意味。
4.関数の実行フローと呼び出し関係。 ####5.構造体フィールドの具体的な意味と使用条件。
関数の外側のコード要素の意味は基本的に単純なコメントで明らかであるため、このステップを詳細関数アノテーションと呼ぶこともできます。関数自体の実行フローとアルゴリズムが、この部分のアノテーションと分析の主なタスクです。
たとえば、cpufreq_ondemand ポリシーの実装アルゴリズム (関数 dbs_check_cpu 内) がどのように実装されるかなどです。アルゴリズムの詳細を理解するには、関数で使用される変数と呼び出される関数を徐々に分析する必要があります。最良の結果を得るには、これらの複雑な関数の実行フローチャートと関数呼び出し図が必要です。これは最も直観的な表現方法です。
#コメントのこのステップを通じて、基本的に分析対象のコード全体を完全に把握できます。という仕組みが実装されています。すべての分析作業は 80% 完了したと考えられます。このステップは特に重要で、分析対象のコードの内部モジュールの分割をよりよく理解できるように、アノテーション情報を十分に正確にするよう努める必要があります。 Linux カーネルは、マクロ構文「module_init」および「module_exit」を使用してモジュール ファイルを宣言しますが、モジュール内のサブ関数の分割は、モジュールの関数の完全な理解に基づいています。モジュールを正しく分割することによってのみ、モジュールが提供する外部関数と変数を把握できます (EXPORT_SYMBOL_GPL または EXPORT_SYMBOL によってエクスポートされたシンボルを使用)。そうして初めて、モジュール内の識別子の依存関係を分析する次のステップに進むことができます。
3.5 モジュールの内部識別子の依存関係
モジュール間の相互依存関係
すべてのモジュールの内部識別子の依存関係図が整理されると、他のモジュールの変数または関数に従って簡単に作成できます。モジュール間の依存関係を特定します。
関連する推奨事項: 「
Linux ビデオ チュートリアル以上がLinuxカーネルのソースコードはどのファイルに置かれていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。