この記事では、カーネルの全体的なアーキテクチャ設計に関連する問題など、Linux の 5 つの主要モジュールのカーネル ソース コードに関する関連知識を提供します。皆様のお役に立てれば幸いです。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
この記事は次のとおりです。 「Linux カーネル ソース コード分析」シリーズの専攻では、カーネルのコア機能を出発点として、Linux カーネルの全体的なアーキテクチャとそのアーキテクチャ下の主要なソフトウェア サブシステムについて説明します。その後、Linux カーネル ソース ファイルのディレクトリ構造が紹介され、各ソフトウェア サブシステムに対応します。
注: この記事および他の「Linux カーネル分析」記事は、次の規則に基づいています:
a) カーネルのバージョンは Linux 5.6.18 であり、次のリンクから入手できます。
https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
b) ほとんどの組み込みシステムは ARM プロセッサを使用しているため、アーキテクチャ部分が関係します
上の図は、Linux カーネルの全体的なアーキテクチャを示しています。カーネルのコア機能に従って、Linux カーネルは次の機能を担当する 5 つのサブシステムを提案します: 1. プロセス スケジューラ (プロセス管理およびプロセス スケジューリングとも呼ばれます)。各プロセスが可能な限り公平な方法で CPU にアクセスできるように、CPU リソースを管理します。 2. メモリ マネージャー、メモリ管理。さまざまなプロセスがマシンのメモリ リソースを安全に共有できるように、メモリ リソースの管理を担当します。さらに、メモリ管理は、プロセスがシステムの利用可能なメモリより多くのメモリを使用できるようにする仮想メモリ メカニズムを提供し、未使用のメモリはファイル システムを通じて外部不揮発性メモリに保存され、必要なときに取得されます。記憶の中で。 3. VFS (Virtual File System)、仮想ファイル システム。 Linux カーネルは、ディスク デバイス (ハードディスク、磁気ディスク、NAND フラッシュ、Nor フラッシュなど)、入出力デバイス、表示デバイスなどのさまざまな機能を持つ外部デバイスを、統一されたファイル操作インターフェイス (オープンなファイル操作インターフェイス) に抽象化します。 、閉じる、読み取り、書き込みなど)にアクセスします。これは、Linux システムにおける「すべてがファイルである」の具体化です (実際、Linux は完全ではありません。CPU、メモリ、ネットワークなどがまだファイルではないためです。本当にすべてをファイルにする必要がある場合は、ベル研究所が開発している「プラン 9」を見てみる必要があります)。 4. ネットワーク、ネットワーク サブシステム。システムのネットワーク デバイスの管理と、さまざまなネットワーク標準の実装を担当します。 5. IPC (プロセス間通信)、プロセス間通信。 IPC はハードウェアを管理せず、主に Linux システム内のプロセス間の通信を担当します。 3.2 プロセス スケジューラプロセス スケジューリングは、Linux カーネルの最も重要なサブシステムであり、主に CPU へのアクセス制御を提供します。コンピュータの CPU リソースは限られており、多くのアプリケーションが CPU リソースを使用するため、CPU をスケジュールして管理する「プロセス スケジューリング サブシステム」が必要です。 プロセス スケジューリング サブシステムには 4 つのサブモジュールが含まれており (下図を参照)、それらの機能は次のとおりです: 1. スケジューリング ポリシー、戦略プロセス スケジューリングを実装するため、どのプロセスが CPU を所有するかを決定します。 2. アーキテクチャに関連する部分であるアーキテクチャ固有のスケジューラは、さまざまな CPU の制御を統合インターフェイスに抽象化するために使用されます。これらの制御は主に、CPU レジスタ アクセス、アセンブリ命令操作などを伴うサスペンドおよびレジューム プロセス中に使用されます。 3. アーキテクチャに依存しないスケジューラ、アーキテクチャに依存しない部分。 「スケジューリング ポリシー モジュール」と通信して次に実行するプロセスを決定し、「アーキテクチャ固有のスケジューラ モジュール」を通じて指定されたプロセスを再開します。 4. システム コール インターフェイス、システム コール インターフェイス。プロセス スケジューリング サブシステムは、システム コール インターフェイスを通じてユーザー空間に提供する必要があるインターフェイスを開きますが、ユーザー空間プログラムが気にする必要のない詳細はシールドします。
3.3 メモリ マネージャ (MM)
メモリ管理は Linux カーネルの最も重要なサブシステムでもあり、主にメモリ リソースへのアクセス制御を提供します。 Linux システムは、ハードウェアの物理メモリとプロセスによって使用されるメモリ (仮想メモリと呼ばれます) との間にマッピング関係を確立します。このマッピングはプロセスごとであるため、異なるプロセスが同じ仮想メモリを使用でき、これらは同じ仮想メモリです。異なる物理メモリにマッピングされます。
メモリ管理サブシステムには 3 つのサブモジュールが含まれており (下図を参照)、それらの機能は次のとおりです:
1. アーキテクチャ固有のマネージャー、アーキテクチャ関連パーツ。ハードウェア メモリにアクセスするための仮想インターフェイスを提供します。
2. アーキテクチャ独立マネージャー、アーキテクチャ独立部分。プロセスベースのメモリ マッピング、仮想メモリ スワッピングなど、すべてのメモリ管理メカニズムを提供します。
3. システム コール インターフェイス、システム コール インターフェイス。このインターフェイスを通じて、メモリの割り当てと解放、ファイル マッピングなどの機能がユーザー空間プログラム アプリケーションに提供されます。
3.4 仮想ファイルシステム (VFS)
従来の意味でのファイル システムは、コンピュータ データを保存および整理する方法です。コンピューターのディスク、ハード ドライブ、その他のデバイス上のコールド データ ブロックを、わかりやすくユーザー フレンドリーな方法 (ファイルとディレクトリ構造) で抽象化し、それらのブロックを簡単に見つけてアクセスできるようにします。したがって、ファイルシステムの本質は「データを保存および整理する方法」であり、ファイルシステムの表現は「特定のデバイスからデータを読み取り、特定のデバイスにデータを書き込む」ことです。
コンピュータ技術の進歩に伴い、データの保存と整理の方法も常に改良されており、その結果、FAT、FAT32、NTFS、EXT2、EXT3 などのさまざまな種類のファイル システムが誕生しています。互換性を確保するために、オペレーティング システムまたはカーネルは、仮想ファイル システム (VFS) の概念を拡張する同じ表現形式で複数のタイプのファイル システムをサポートする必要があります。
VFS の機能は、さまざまなファイル システムを管理し、その違いを保護し、統一された方法でファイルにアクセスするためのインターフェイスをユーザー プログラムに提供することです。
ディスク、ハードディスク、NAND フラッシュ、その他のデバイスからデータを読み書きできるため、元のファイル システムはこれらのデバイス上に構築されました。この概念は、メモリ、ディスプレイ (LCD)、キーボード、シリアル ポートなどの他のハードウェア デバイスにも拡張できます。
ハードウェア デバイスへのアクセス制御は、データの読み取りまたは書き込みとして要約することもできるため、統一されたファイル操作インターフェイスを使用してアクセスできます。これは Linux カーネルの機能であり、従来のディスク ファイル システムに加えて、デバイス ファイル システム、メモリ ファイル システムなども抽象化します。これらのロジックはすべて VFS サブシステムによって実装されます。
VFS サブシステムには 6 つのサブモジュールが含まれており (下図を参照)、それらの機能は次のとおりです:
1. デバイス ドライバー、デバイス ドライバー、制御に使用されるすべての外部デバイスおよびコントローラー。相互に互換性のないハードウェア デバイス (特に組み込み製品) が多数あるため、デバイス ドライバーも多数存在します。したがって、Linux カーネルのソース コードのほぼ半分はデバイス ドライバーであり、基盤となる Linux エンジニア (特に国内企業) のほとんどはデバイス ドライバーの作成または保守に従事しており、他の内容 (まさに Linux の本質である) を評価する時間がありません。カーネル).場所)。
2. デバイス非依存インターフェイス、このモジュールは、ハードウェア デバイスを記述するための統一された方法 (統一デバイス モデル) を定義します。すべてのデバイス ドライバーはこの定義に準拠しており、開発の困難さを軽減できます。同時に、インターフェースを一貫した方法で上向きに提供できます。
3. 論理システム、各ファイル システムは、特定のファイル システム ロジックを実装する論理システム (論理ファイル システム) に対応します。
4. システム独立インターフェイス。このモジュールは、ハードウェア デバイスと論理ファイル システムを統一インターフェイス (高速デバイスとキャラクター デバイス) で表現する役割を担っており、上位層のソフトウェアは特定のハードウェアを意識しなくなります。形状。
5. システム コール インターフェイスであるシステム コール インターフェイスは、ファイル システムやハードウェア デバイスにアクセスするための統一インターフェイスをユーザー空間に提供します。
3.5 ネットワーク サブシステム (ネット)
ネットワーク サブシステムは、主に Linux カーネル内のさまざまなネットワーク デバイスを管理し、さまざまなネットワーク プロトコル スタックを実装し、最終的にはネットワークを介して他のシステムに接続する役割を果たします。 。 関数。 Linux カーネルでは、ネットワーク サブシステムはほぼ自己完結型であり、5 つのサブモジュール (下図を参照) が含まれており、その機能は次のとおりです。ネットワーク デバイス ドライバー 、ネットワーク デバイス ドライバーは、VFS サブシステムのデバイス ドライバーと同じです。
2. デバイスに依存しないインターフェイス。VFS サブシステムのものと同じです。
3. ネットワーク プロトコル。IP、TCP、UDP などのさまざまなネットワーク伝送プロトコルを実装します。4. プロトコル非依存インターフェイスは、さまざまなハードウェア デバイスとネットワーク プロトコルを保護し、同じ形式でインターフェイス (ソケット) を提供します。
5. システム コール インターフェイス、システム コール インターフェイスは、ネットワーク デバイスにアクセスするための統合インターフェイスをユーザー空間に提供します。
IPC サブシステムについては、機能が比較的単純であるため、ここでは説明しません。
Linux カーネル ソース コードには 3 つの主要な部分が含まれます:
1. カーネル コア コード (第 3 章で説明する内容を含む)サブシステムとサブモジュール、および電源管理、Linux 初期化などの他のサポート サブシステム。
2. ライブラリ ファイルなどのその他の非コア コード (Linux カーネルは自己完結型カーネルであるため)つまり、カーネルは他のソフトウェアに依存せず、自分でコンパイルできます)、ファームウェア コレクション、KVM (仮想マシン テクノロジ) などです。
3. スクリプト、構成ファイル、ヘルプ ドキュメントをコンパイルします。 copyright ステートメントとその他の補助ファイル
以下の図 r は、ls コマンドを使用して表示されるカーネル ソース コードの最上位のディレクトリ構造を示しており、具体的な説明は次のとおりです。
include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。 kernel/ ---- Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。 mm/ ---- 内存管理子系统(3.3小节)。 fs/ ---- VFS子系统(3.4小节)。 net/ ---- 不包括网络设备驱动的网络子系统(3.5小节)。 ipc/ ---- IPC(进程间通信)子系统。 arch// ---- 体系结构相关的代码,例如arm, x86等等。 arch//mach- ---- 具体的machine/board相关的代码。 arch//include/asm ---- 体系结构相关的头文件。 arch//boot/dts ---- 设备树(Device Tree)文件。 init/ ---- Linux系统启动初始化相关的代码。 block/ ---- 提供块设备的层次。 sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。 lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。 crypto/ ----- 加密、解密相关的库函数。 security/ ---- 提供安全特性(SELinux)。 virt/ ---- 提供虚拟机技术(KVM等)的支持。 usr/ ---- 用于生成initramfs的代码。 firmware/ ---- 保存用于驱动第三方设备的固件。 samples/ ---- 一些示例代码。 tools/ ---- 一些常用工具,如性能剖析、自测试等。 Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。 COPYING ---- 版权声明。 MAINTAINERS ----维护者名单。 CREDITS ---- Linux主要的贡献者名单。 REPORTING-BUGS ---- Bug上报的指南。 Documentation, README ---- 帮助、说明文档。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上が5 つの主要モジュールの Linux カーネル ソース コードと全体的なカーネル アーキテクチャ設計 (詳細なグラフィックとテキストの説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。