ホームページ > 記事 > システムチュートリアル > Linux カーネル階層の内部を見る: 山の頂上からの眺め
Yuanlijun の記事の多くは Linux カーネルの機能に関するものであることは皆さんもご存知のとおり、パブリック アカウントの原則に基づいて、原則についてのみ説明し、複雑なコードをわかりやすいテキストと画像に変換します。ついにお届けしました。 Yuanli 氏は、Linux カーネル アーキテクチャを大きなフレームワークから体系的に整理したことは一度もなかったと言えます。そこで、この記事の目的は山の頂上に立って見上げることです。
Linuxシステムの階層構造
この図から、2 つのレベルに分けることができます:
ユーザー空間カーネル空間
最下位レベルはユーザー空間であり、アプリケーションが実行されている場所です。ユーザー空間の上位層は Linux のメモリ管理によく使われる gblic ライブラリで、その機能はシステム コール ソケットをカプセル化することです。 gblic ライブラリを使用せずに、多数のシステム コール ソケットを直接使用するのは非常に賢明ではありません。ユーザー空間で実行されるプロセスはそれぞれ独自の仮想アドレス空間を持ちますが、カーネルは別のアドレス空間を持ちます。
上位層はカーネル空間です。 Linux カーネル空間は 3 つの層に分かれています:
システム コール層。最下位層に属し、ユーザー空間とカーネル空間の間の通信形式を提供します。 Linux カーネル: 正確には、アーキテクチャに依存しないカーネル コードであり、どのアーキテクチャにも適用できるユニバーサル コードです。アーキテクチャ依存コード: この部分は一般に BSP と呼ばれ、主にさまざまなプラットフォームやプロセッサとの互換性を目的として導入されます。
Linux カーネルは、多くの重要なアーキテクチャ特性を実装しています。より高いレベルまたはより低いレベルで、カーネルはサブシステムとして定義されます。 Linux は、これらすべての基本サービスをカーネルに統合しているため、全体として見ることもできます。これはマイクロカーネル アーキテクチャとは異なり、前者は通信、I/O、メモリ、プロセス管理などのいくつかの基本サービスを提供し、より具体的なサービスはマイクロカーネル層に挿入されます。各カーネルには独自の利点がありますが、ここでは説明しません。
Linux カーネルは時間の経過とともに、ビデオ メモリと CPU の使用効率が向上し、非常に安定しています。 Linux の最も興味深い点は、このようなサイズと複雑さにも関わらず、優れた移植性を備えていることです。 Linux は、さまざまなアーキテクチャ上の制約や要件を持つ多数のプロセッサおよびプラットフォーム上で実行できるようにコンパイルされています。反例として、Linux は、グラフィックス メモリ管理ユニット (MMU) を備えたプロセッサ上で実行することも、MMU を提供しないプロセッサ上でも実行できることも挙げられます。 Linux カーネルの uClinux ポートは、非 MMU のサポートを提供します。
Linux カーネル アーキテクチャ
Linux カーネルの主なコンポーネントは次のとおりです:
システム コール ソケット プロセス管理 ビデオ メモリ管理 仮想ファイル システム ネットワーク スタック デバイス ドライバーおよびハードウェア アーキテクチャ関連のコード。
(1) システムコールソケット
システム コール層は、ユーザー空間からカーネルへの関数呼び出しを実行するための個別のメカニズムを提供します。それはアーキテクチャに依存します。多重化および逆多重化サービスはこの層で提供されます。
(2) プロセス管理
プロセス管理の中核はプロセスのスケジューリングです。 Linuxカーネルでは、プロセスのスケジューリングの単位はプロセスであり、スレッドはスケジューリングにおけるプロセスの概念に相当します。カーネルは、システム コールを通じてアプリケーション プログラミング ソケットを提供します。例: 新しいプロセスの作成 (fork、exec)、プロセスの終了 (kill、exit)、プロセスを制御するためのインターフェイスの提供 (Linux カーネル移植の手順)、プロセスの同期とプロセス間通信。
プロセス管理には、アクティブなプロセス間で CPU を共有する必要性の処理も含まれます。カーネルは CFS 完全に公平なスケジューラを使用します。これについては、以前の記事「Linux Completely Fair Scheduler CFS」で詳しく説明しています。
(3)ビデオメモリ管理
カーネルによって管理されるもう 1 つの重要なリソースはビデオ メモリです。 Yuanlijun による別の記事「Linux ビデオ メモリ管理を理解する、これだけの記事」では、Linux ビデオ メモリ管理について詳しく説明しています。効率を向上させるために、仮想ビデオ メモリの概念が導入され、ビデオ メモリはいわゆるビデオ メモリ ページ形式に従って管理されます (通常、ビデオ メモリのページ サイズは 4KB と 8KB で、そのほとんどは 4KB)。利用可能なビデオ メモリを管理する Linux の方法に加えて、数学および仮想マッピングに使用されるハードウェア メカニズムがあります。ただし、ビデオ メモリ管理では、4KB バッファ以上のものを管理する必要があります。 Linux は、スラブ アロケータなどの 4KB バッファの具体的な表現を提供します。これらのメモリ管理モードは、ベースとして 4KB バッファを使用し、そこから構造を割り当て、どのメモリ ページがいっぱいであるか、どのページが完全に使用されていないか、どのページが空であるかなど、メモリ ページの使用状況を追跡します。これにより、このモードはシステムのニーズに基づいてビデオ メモリの使用量を動的に調整できます。複数のユーザーによるビデオ メモリの使用をサポートするために、利用可能なビデオ メモリが消費される場合があります。このため、ページがビデオ メモリから移動され、C ドライブに配置される可能性があります。ページがビデオ メモリからハード ドライブにスワップされるため、このプロセスはスワッピングと呼ばれます。ビデオ メモリ管理のソース コードは ./linux/mm にあります。
(4)仮想ファイルシステム
仮想ファイル システム (VFS) は、ファイル システムにユニバーサル インターフェイス表現を提供するため、Linux カーネルの非常に便利な機能です。 VFS は、システム コールとカーネルによってサポートされるファイル システムの間にシールドを提供します。右に示すように:
VFS では、オープン、クローズ、読み取り、書き込みなどの関数の一般的な API 表現です。 VFS の下には、下位レベルの機能の実装方法を定義するファイル システム表現があります。これらは、特定のファイル システム (50 個以上) 用のプラグインです。ファイル システムのソース コードは ./linux/fs にあります。ファイル システム層の下にはバッファ キャッシュがあり、(特定のファイル システムとは独立して) ファイル システム層に共通の機能セットを提供します。このキャッシュ層は、データを一定期間保持する (または、後でデータをプリフェッチして、必要なときに利用できるようにする) ことによって、化学装置へのアクセスを最適化します。バッファ キャッシュの下には、特定の化学デバイス用のソケットを実装するデバイス ドライバーがあります。
(5) ネットワーク契約スタック
ネットワーク コントラクト スタックは、シミュレートされたコントラクト自体の階層構造に従うように設計されています。 Linux カーネル移植手順 を思い出してください。インターネット プロトコル (IP) は、伝送契約 (一般に伝送制御契約または TCP として知られています) に基づくコア ネットワーク層の契約です。 TCP の内部にはソケット層があり、システム コール層を通じて呼び出されます。ソケット層はネットワーク サブシステムの標準 API であり、さまざまなネットワーク コントラクトにユーザー ソケットを提供します。生のフレーム アクセスから IP コントラクト データ ユニット (PDU)、TCP およびユーザー データグラム プロトコル (UDP) まで、ソケット層は接続を管理し、さまざまなエンドポイント間でデータを通信するための標準化された方法を提供します。カーネル内のネットワーク ソース コードは ./linux/net にあります。
(6)デバイスドライバー
Linux カーネルのデバイス ドライバーには、特定のハードウェア デバイスを実行できる大量のコードが含まれています。 Linux ソース ツリーにはドライバー サブディレクトリがあり、これは Bluetooth、I2C、シリアルなど、サポートされるさまざまなデバイスとしてさらに定義されます。デバイス ドライバーのコードは ./linux/drivers にあります。
(7) アーキテクチャに依存するコード
Linux は、実行されているアーキテクチャにほとんど依存しませんが、アーキテクチャが適切に動作し、より高い効率を達成するには、考慮する必要がある要素がいくつかあります。 ./linux/arch サブディレクトリは、カーネル ソース コードのアーキテクチャに依存する部分を定義します。これには、さまざまなアーキテクチャ固有のサブディレクトリ (BSP を構成する) が含まれます。一般的なデスクトップ システムでは、x86 ディレクトリが使用されます。各アーキテクチャのサブディレクトリには他の多くのサブディレクトリが含まれており、各サブディレクトリはブート、カーネル、メモリ管理など、カーネルの特定の側面に重点を置いています。このアーキテクチャに依存するコードは、./linux/arch にあります。
Linux は動的カーネルでもあり、ソフトウェア コンポーネントの動的な追加または削除をサポートします。これらは動的にロード可能なカーネル モジュールとして知られており、ブート時 (モジュールは現在特定のデバイスに必要です) またはユーザーがいつでもオンデマンドで挿入できます。
###参照する###Yuanlijun がこの記事を参照しました
以上がLinux カーネル階層の内部を見る: 山の頂上からの眺めの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。