Linuxカーネルの内部に関する質問[閉じる]

Linuxカーネルの内部に関する質問[閉じる]

「Linuxデバイスドライバ、第3版」を読んでいるのによく理解されていないいくつかのカーネルエントリが見つかりました。

  1. Linuxカーネルは仮想アドレスまたは物理アドレスを使用して内部で動作しますか?特に私を混乱させるのは、複数のタイプのアドレス(論理、仮想、バス、物理)があり、すべてカーネルで有効で動作可能であるということです。

  2. CPU命令は周辺機器に格納されているデータのアドレスを直接指定できないため、アドレス指定可能なメモリ(バッファなど)がこの目的に使用されます。これは正しいですか?

  3. セマフォが要求された場合(対応する値は0)、プロセスがスリープモードになるまで待つ必要がありますか?

  4. 原子演算 - 特定のCPU命令で保証されていますか?

答え1

一度に複数の質問をしないことをお勧めします。誰もがすべての質問に答えたり、喜んで答えることはできないからです。それにもかかわらず、各質問について簡単な回答をいたします。

Linuxカーネルは仮想アドレスまたは物理アドレスを使用して内部で動作しますか?特に私を混乱させるのは、複数のタイプのアドレス(論理、仮想、バス、物理)があり、すべてカーネルで有効で動作可能であるということです。

はい。カーネルの他の部分は異なるアドレス空間を使用します。

カーネルコードがシステムコールを処理するとき、そのメモリマップにはカーネルメモリスペース全体とプロセスのメモリスペース全体が含まれます(カーネルが高いメモリで構成されていない限り、ここでは説明が複雑すぎます)。これは論理(仮想とも呼ばれる)アドレスです。アドレスの上位ビットは、どのページを見るかを示します。メモリ管理ユニット、低ビットはページ内の線形アドレスです。ジョブ切り替えが発生するたびに、MMU内のメモリマップが変更されます(MMUのページテーブルの変更は、ジョブ切り替えの重要な部分です)。

一部のデバイスドライバは、自分が駆動するデバイスに有効なメモリアドレスを操作する必要があります。これは通常物理アドレスですが、一部のアーキテクチャではアイオムこのようにして、デバイスは独自の論理アドレスも見ることができます。もちろん、カーネルのメモリ管理サブシステムはさまざまな種類のアドレスで動作する必要があります。

CPU命令は周辺機器に格納されているデータのアドレスを直接指定できないため、アドレス指定可能なメモリ(バッファなど)がこの目的に使用されます。これは正しいですか?

これはアーキテクチャによって異なります。ほとんどのアーキテクチャでは、DMA(直接メモリアクセス)、RAMを介してデバイスとの少なくとも一部の通信を実行できます。さらに、一部のアーキテクチャ(ARMなど)では、すべてのデバイスアクセスが適切なアドレスのロードおよびストア命令を介して実行されますが、他のアーキテクチャ(i386など)にはこの目的のための特定のプロセッサ命令があります。バラよりメモリマップされたI/O詳細については。

セマフォが要求された場合(対応する値は0)、プロセスがスリープモードになるまで待つ必要がありますか?

はい、セマフォ(downおよび友人)を取得するのはブロック操作です。この内容は本でよく説明されています。

原子演算 - 特定のCPU命令で保証されていますか?

はい。詳細はアーキテクチャによって異なります。マルチタスクのためのすべてのプラットフォームは、同期のために少なくとも1つの原子基本要素を提供します。比較して交換するテストと設定リンクのロード+条件付き保存など。正しい基本要素を使用することに加えて、コードは正しい基本型を使用することに注意を払う必要があるかもしれません。記憶障害マルチプロセッサシステムで。 Linuxカーネルは、サポートされているすべてのアーキテクチャに同期基本要素の実装を提供するため、カーネルの移植可能な基本要素のみを使用できます。

答え2

1、3、4番に答えてみます。

Linuxカーネルはさまざまなステップを使用してプログラムコードを電気信号に変換します。

論理アドレス:演算や命令を扱うために機械語命令に含まれます。セグメントとオフセットで区切られます。

線形アドレス:分割単位は論理アドレスを線形アドレスに変換します。これは0x00000000-0xffffffff、メモリ空間を指定するために使用される16進数(32ビットアーキテクチャ:)です。

実際の住所: また、ページング単位は線形アドレスを物理アドレスに変換します。これは、マイクロプロセッサピンを介してメモリセルのアドレスを指定する電気信号です。

バスアドレス:CPU以外のすべてのハードウェアデバイスでメモリセルアドレスを指定するために使用されます(DMAにはCPUは必要ありませんが、アドレスは必要です)。これらのアドレスは、別々のI / Oメモリ管理デバイスを含むSPARCやAlphaなどの他のいくつかのアーキテクチャを除いて、ほとんど物理アドレスと同じです。

カーネルはすべてのアドレスを使用して動作します。各アドレスは、ユーザー要求とハードウェアレベルでの要求の実際の処理の間のステップです。


プロセスがゼロ以下の値でセマフォに近づくと、値が1以上になるまで一時停止します。これはスリープ状態のプロセスでのみ発生します。割り込みハンドラは眠れないため、セマフォの使用は禁止されます。


アトミック操作は、次のように定義されたアセンブリ言語命令を使用して実装できます。

  • 0個または1個のメモリアクセス
  • プレフィックスはLOCK_PREFIX

C レベルでは、カーネルはatomic_tプレフィックスが付いた型とマクロを提供します。atomic_
LOCK_PREFIX組み立て説明書に追加されました。)

関連情報