推奨: 「Linux ビデオ チュートリアル #」
カーネル モジュール コードまたはスレッドがメモリにアクセスするとき、コード内のメモリ アドレスはすべて論理アドレスであり、実際のアドレスに対応します。物理メモリ アドレス、アドレス 1 対 1 が必要です。マッピング、たとえば、論理アドレス 0xc0000003 に対応する物理アドレスは 0x3、0xc0000004 に対応する物理アドレスは 0x4、…、論理アドレスと物理アドレスの関係は
物理アドレス = 論理アドレス – 0xC0000000 : これはカーネルのアドレス空間のアドレス変換関係です。カーネルの仮想アドレスは「ハイエンド」にあることに注意してください。ですが、ta によってマップされた物理メモリ アドレスは下位になります。
#論理アドレス | 物理メモリ アドレス | ||||||||||||
0×0 | |||||||||||||
0×1 | #0xc0000002## 0×2 | ||||||||||||
0xc0000003 | 0×3 | ||||||||||||
… | … | ||||||||||||
0xe0000000 | 0×20000000 | ||||||||||||
… | … | ||||||||||||
0xffffffff | |||||||||||||
上記の単純なアドレス マッピング関係に従って、カーネル論理アドレス空間へのアクセスが 0xc0000000 ~ 0xffffffff であると仮定すると、対応する物理メモリ範囲は 0x0 ~ 0x40000000 になります。つまり、1G 物理メモリのみにアクセスできます。 。マシンに 8G の物理メモリがインストールされている場合、カーネルは最初の 1G の物理メモリにのみアクセスでき、その後の 7G の物理メモリにはアクセスできなくなります。これは、カーネルのアドレス空間がすべて物理メモリのアドレス範囲 0x にマップされているためです。 0~0×40000000。 8G の物理メモリが搭載されている場合でも、カーネルは物理アドレス 0x40000001 のメモリにどのようにアクセスするのでしょうか?コードにはメモリの論理アドレスが必要ですが、0xc0000000 ~ 0xffffffff のアドレス空間が占有されているため、物理アドレス 0x40000000 以降のメモリにはアクセスできません。 カーネル アドレス空間 0xc0000000 ~ 0xfffffff は、単純なアドレス マッピングには使用できないことは明らかです。したがって、カーネル アドレス空間は、x86 アーキテクチャでは ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM の 3 つの部分に分割されます。 ZONE_HIGHMEM は、ハイエンド メモリの概念の起源となるハイエンド メモリです。
ZONE_DMA メモリから始まる 16MB ZONE_NORMAL 16MB~896MB ZONE_HIGHMEM 896MB ~ 終了 (1G)
2. 理解するハイエンド メモリの起源については前に説明しました。 Linux はカーネル アドレス空間を ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM の 3 つの部分に分割しており、ハイエンド メモリ HIGH_MEM アドレス空間の範囲は 0xF8000000 ~ 0xFFFFFFFF (896MB ~ 1024MB) です。それでは、カーネル が 128MB のハイエンド メモリ アドレス空間を使用する場合、どのようにしてすべての物理メモリ にアクセスできるのでしょうか? カーネルが 896MB を超える物理アドレスを持つメモリにアクセスしたい場合、0xF8000000 ~ 0xFFFFFFFF のアドレス空間範囲内で対応するサイズの空き論理アドレス空間を見つけ、それをしばらく借用します。この論理アドレス空間を借用して、アクセスしたい物理メモリにマップし (つまり、カーネル PTE ページ テーブルに記入し)、 しばらく一時的に使用し、使用後 に返します。このようにして、他の人もこのアドレス空間を借りて他の物理メモリにアクセスすることができ、限られたアドレス空間を使用してすべての物理メモリにアクセスすることができます。以下に示すように。 たとえば、カーネルは 2G から始まる 1MB の物理メモリにアクセスしたいとします。つまり、物理アドレス範囲は 0x80000000 ~ 0x800FFFFF です。アクセスする前に、まず 1MB の空きアドレス空間を見つけます。見つかった空きアドレス空間が 0xF8700000 ~ 0xF87FFFFF であるとします。この 1MB の論理アドレス空間を使用して、物理アドレス空間 0x80000000 ~ 0x800FFFFF のメモリにマッピングします。マッピング関係は次のとおりです。
|
以上がLinuxのユーザー空間とカーネル空間の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。