Linux カーネルのソース コードは、ディレクトリ /usr/src/linux に保存されています。カーネル ソース コードの構成: 1. アーチ ディレクトリ (コア ソース コードでサポートされるハードウェア アーキテクチャに関連するコア コードが含まれます); 2. インクルード ディレクトリ (コアのインクルード ファイルのほとんどが含まれます); 3. initディレクトリにはコアのスタートアップ コードが含まれ、4. mm ディレクトリにはすべてのメモリ管理コードが含まれ、5. drivers ディレクトリにはシステム内のすべてのデバイス ドライバが含まれ、6. Ipc ディレクトリにはコアのプロセス間通信コードが含まれます。
Linux カーネル ソース コードの配置場所
Linux カーネル ソース コードはさまざまな方法で入手できます。通常、Linux システムのインストール後、ディレクトリ /usr/src/linux にはカーネル ソース コードが含まれます。
ソースコードの読み込みをスムーズに進めるためには、事前にソースコードの知識背景をある程度理解しておくのがベストです。
Linux カーネルのソース コードは次のように構成されています (Linux ディレクトリに相対していると想定):
arch
Thisサブディレクトリには、このコア ソース コードによってサポートされるハードウェア アーキテクチャに関連するコア コードが含まれます。たとえば、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 カーネル ソース コードの解析方法私もプロジェクトを通じて Linux カーネルのソースコードの解析に携わることになり、ソースコードの解析から多くの恩恵を受けました。関連するカーネルの知識を得ることができただけでなく、カーネル コード
1 に対する私のこれまでの理解も変わりました。カーネルのソースコードの分析は「手の届かない」わけではありません。カーネルのソース コード分析の難しさは、ソース コード自体にあるのではなく、より適切な方法や手段を使用してコードを分析する方法にあります。カーネルが巨大なため、通常のデモプログラムのように main 関数から段階的に解析することはできず、途中から介入してカーネルのソースコードを 1 つずつ「突破」する方法が必要です。この「リクエスト オン デマンド」アプローチにより、特定の詳細にこだわりすぎることなく、ソース コードの主要な部分を把握できるようになります。
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 日かかる場合があります) によって、コードのこの部分が配置されているソース コード ファイル ディレクトリも見つかりました。この種の情報はまさに「貴重」であると言わざるを得ません。
3.2 ソース コードの場所上記の例に戻り、/documention/cpufreq にあるドキュメントを注意深く読みます。現在の Linux ソース コードでは、モジュール関連のドキュメントがソース コード ディレクトリのドキュメント フォルダに保存されます。分析対象のモジュールにドキュメントがない場合、主要なソース コード ファイルを見つけるのが多少難しくなりますが、問題が発生することはありません。分析したいソースコード。ドキュメントを読むことで、少なくともソース ファイル /driver/cpufreq/cpufreq.c に注目することができます。このソース ファイルのドキュメントと、以前に収集した周波数変調戦略を組み合わせることで、5 つのソース ファイル (cpufreq_performance.c、cpufreq_powersave.c、cpufreq_userspace.c、cpufreq_ondemand、および cpufreq_conservative.c) に簡単に注目できます。関係する書類はすべて見つかったでしょうか?心配しないで、それらから分析を開始すると、遅かれ早かれ他のソース ファイルが見つかるでしょう。 Windows で SourceInsight を使用してカーネル ソース コードを読み取る場合、コード分析と組み合わせた関数呼び出しやシンボル参照検索などの機能を通じて、他のファイル freq_table.c、cpufreq_stats.c、および /include/linux/cpufreq を簡単に見つけることができます。 。
#検索された情報の流れの方向に従って、分析が必要なソース コード ファイルを完全に見つけることができます。すべてのソース コード ファイルを見つける必要はなく、作業の一部をコードの分析プロセスに延期できるため、ソース コードを見つける手順はそれほど重要ではありません。ソース コードの位置決めも重要であり、ソース コード ファイルの一部を見つけることは、ソース コードを分析するための基礎となります。このステップのコメントを通じて、基本的に、分析対象のコードの全体的な実装メカニズムを完全に把握できます。すべての分析作業は 80% 完了したと考えられます。このステップは特に重要で、分析対象のコードの内部モジュールの分割をよりよく理解できるように、アノテーション情報を十分に正確にするよう努める必要があります。 Linux カーネルは、マクロ構文「module_init」および「module_exit」を使用してモジュール ファイルを宣言しますが、モジュール内のサブ関数の分割は、モジュールの関数の完全な理解に基づいています。モジュールを正しく分割することによってのみ、モジュールが提供する外部関数と変数を把握できます (EXPORT_SYMBOL_GPL または EXPORT_SYMBOL によってエクスポートされたシンボルを使用)。そうして初めて、モジュール内の識別子の依存関係を分析する次のステップに進むことができます。
4 番目のステップでコード モジュールを分割することで、モジュールを 1 つずつ「簡単に」分析できます。一般に、ファイルの最後にあるモジュールの入口関数と出口関数から開始できます (「module_init」と「module_exit」で宣言された関数は通常、ファイルの最後にあります)。それらが呼び出す関数 (によって定義された関数) に基づいて、キー変数 (このファイル内のグローバル変数または他のモジュールの外部変数) は、「関数-変数-関数」依存関係図を描画します。これを識別子依存関係図と呼びます。
もちろん、モジュール内の識別子の依存関係は単純なツリー構造ではなく、多くの場合、複雑なネットワーク関係になります。このとき、コードに対する詳細なコメントの役割が反映されます。関数自体の意味に基づいてモジュールをサブ関数に分割し、各サブ関数の識別子依存ツリーを抽出します。
#識別子の依存関係解析により、モジュールで定義された関数がどの関数を呼び出しているか、どの変数が使用されているかを明確に表示できます。 . そして、モジュールのサブ関数間の依存関係 - どの関数と変数が共有されるかなど。# もちろん、アーキテクチャ図はモジュールを無機的につなぎ合わせたものではありません。また、アーキテクチャ図の意味を豊かにするために参照した情報を組み合わせる必要もあります。アーキテクチャ図。したがって、ここでのアーキテクチャ図の詳細は、理解する人によって異なります。ただし、アーキテクチャ図の本体の意味は基本的に同じです。この時点で、分析対象のカーネル コードのすべての分析が完了しました。
以上がLinuxカーネルのソースコードはどのファイルに置かれていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。