Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> Linuxのハイエンドメモリマッピング方法

Linuxのハイエンドメモリマッピング方法

  

1.1カーネルアドレス空間(線形空間)分布

(1)直接マッピング領域:直接メモリマッピング領域である線形空間における3Gから最大896Mの間隔、この領域線形アドレスと物理アドレスの間には線形変換の関係があります。線形アドレス= 3G +物理アドレスです。

(2)動的メモリマッピング領域:この関数領域はカーネル関数vmallocによって割り当てられ、線形空間は連続していますが、対応する物理空間は必ずしも連続していません。 vmallocによって割り当てられたリニアアドレスに対応する物理ページは、ローエンドメモリまたはハイエンドメモリにあります。

(3)永久メモリマップ領域:この領域はハイエンドメモリにアクセスできます。アクセス方法は、alloc_page(_GFP_HIGHMEM)を使用してハイエンドメモリページを割り当てるか、kmap関数を使用して割り当てられたハイエンドメモリを領域にマップすることです。

(4)固定マッピング領域:この領域と4Gの上部には4kのアイソレーションバンドしかなく、各アドレス項目はACPI_BASEなどの特定の目的に役立ちます。

説明:

ユーザ空間はもちろんハイエンドメモリを使用することができますが、これは通常の使用方法ですカーネルは頻繁に使用されないメモリを割り当てるときにハイエンドメモリ空間を使用します。例えば、カーネルのデータ構造は頻繁に使用され、ユーザのデータは使用されることがまれです。ユーザーがアプリケーションを起動するとメモリが必要になり、各アプリケーションには3Gリニアアドレスが割り当てられますが、ページテーブルをこれらのアドレスにマッピングする場合は、ハイエンドメモリを直接使用できます。

もう1つ修正する必要があるのは、128Mのリニアアドレスがこれらの場所で使用されているのではなく、メモリをカーネルにマップする必要があるデバイスをロードする場合も同様です。リニアアドレス空間をセグメント化して完了しないと、カーネルはデバイスのメモリ空間にアクセスできません。

まとめると、カーネルのハイエンドリニアアドレスは、カーネルの固定マッピング以外のメモリリソースにアクセスすることです。プロセスがメモリを使用すると、ページフォルト例外が発生しますが、カーネルはどの物理ページをユーザプロセスに明確にマッピングするかが重要です。ユーザー空間にハイエンドメモリという概念はありません。

1.2ハイエンドメモリマッピング

ハイエンドメモリマッピングとは、線形アドレス空間(PAGE_OFFSET + 896Mから4Gの最後の128Mまで)を896Mを超える物理ページフレームにマッピングすることです。下に示すように:

ハイエンドメモリを保存する方法は3つあります(どちらも間接マッピング):

1.2.1"カーネル動的マッピングスペース"へのマッピング(非連続メモリ領域マッピング)

vmalloc()は、カーネル内の「動的マッピング空間」でメモリを申請するときに、ハイエンドメモリからページを取得することが可能であるため(vmallocの実装を参照)、ハイエンドメモリになるので非常に簡単です。 「カーネル動的マッピング空間」にマッピングすることが可能である。

1.2.2恒久的なカーネルマッピング

alloc_page()を使ってハイエンドメモリに対応するページを取得した場合、どうすれば線形スペースを見つけることができますか。

ハイエンドメモリをマッピングするために、PKMAP_BASEからFIXADDR_STARTまでの線形スペースを空けます。 2.4カーネルでは、このアドレス範囲は4G-8Mと4G-4Mの間です。このスペースは "kernel permanent mapping space"または "permanent kernel mapping space"で始まり、他のスペースと同じページディレクトリテーブルを使用します通常のプロセスでは、CR3レジスタを介してswapper_pg_dirです。ポイント通常、このスペースのサイズは4Mなので、必要なページテーブルは1つだけです。カーネルはpkmap_page_tableに移動してこのページテーブルを探します。 kmap()を使うと、このスペースにページをマッピングできます。このスペースのサイズは4Mなので、同時に最大1024ページまでマップできます。したがって、使用されていないページの場合、およびこのスペースから解放する必要がある場合(つまり、マッピング関係)、kunmap()を使用して、このスペースからページに対応する線形アドレスを解放できます。永久的なメモリマッピングは長期的なマッピングを可能にします。

1.2.3一時的なマッピング

カーネルは特別な必要性のためにFIXADDR_STARTとFIXADDR_TOPの間にいくらかの線形スペースを確保しています。この空間は「固定マッピング空間」と呼ばれ、この空間にはハイエンドメモリ用の一時的なマッピングの一部があります。

このスペースには、以下の特徴があります。

1.各CPUがスペースを占有します。

2.各CPUが占有するスペースでは、複数のスペースに分割されます。小さなスペース、それぞれの小さなスペースは1ページで、それぞれの小さなスペースは1つの目的に使用されます。これらの目的はkmap_types.hのkm_typeで定義されています。一時的なマッピングを行う場合は、マッピングの目的を指定する必要がありますが、マッピングの目的に応じて、対応する小さなスペースを見つけて、そのスペースのアドレスをマッピングアドレスとして使用できます。これは、一時的なマッピングによって以前のマッピングが上書きされることを意味します。

一時的なマッピングはkmap_atomic()で実現されています。ブロックしないで、割り込みハンドラと遅延関数の中で使うことができます。一時メモリマップは固定メモリマップの一部であるため、アドレスはカーネルコンポーネントで使用するために固定されています。

Copyright © Windowsの知識 All Rights Reserved