ホームページ >運用・保守 >Linuxの運用と保守 >5 つの主要モジュールの Linux カーネル ソース コードと全体的なカーネル アーキテクチャ設計 (詳細なグラフィックとテキストの説明)
この記事では、カーネルの全体的なアーキテクチャ設計に関連する問題など、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 プロセッサを使用しているため、アーキテクチャ部分が関係します
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 サブシステムのものと同じです。
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 サイトの他の関連記事を参照してください。