8

Linux は OS であり、ARM はこのコンテキストで参照されるプロセッサです。

TLB には、カーネル空間とユーザー空間の両方の仮想アドレスが含まれていますか? カーネル メモリは 、最初の 3 GB がユーザー空間に属する場所0xc000_0000から始まり、その場所に移動します。0xFFFF_FFFFプロセス間のコンテキスト切り替えの間に、TLB がフラッシュされます。

TLB には、カーネル空間とユーザー空間の両方の仮想アドレスが含まれていますか?

カーネルメモリ(仮想)は物理メモリに直接対応します(オフセットするだけで0xC000_0000物理アドレスが得られます)。TLB にカーネル メモリ (仮想) が必要ですか (TLB に存在すると言う場合)? ユーザー空間アドレスのみが存在する必要があります。

4

2 に答える 2

10

最新の CPU で仮想アドレスから物理アドレスへの変換が行われている主な理由は、メモリの使用をより効率的かつより適切に制御して、次のことを可能にすることです。

  1. 物理メモリ、RAM (連続または非連続) を割り当て、仮想アドレス空間のどこからでも (連続または非連続で) アクセスできるようにします。メモリを断片化に無駄にすることはありません。
  2. ディスクまたはその他のメモリを使用して、物理メモリ、RAM を拡張します。
  3. アドレス空間の特定の部分を読み取り専用、実行不可、またはカーネル専用などにして、無許可または誤ったアクセスからそれらを保護します。
  4. アプリケーションのメモリを互いに分離して、保護、セキュリティ、および信頼性をさらに向上させます。
  5. メモリを共有します。...

そして、ページテーブルはこれをすべて可能にします。

カーネルの仮想アドレス空間でも物理メモリをマップおよびマップ解除できるようにする必要があります。通常、この変換メカニズムはシステム全体で機能します。もちろん、ページテーブルを参照して維持する必要があり、パフォーマンスが低下するため、変換には代償が伴います。しかし、すべてが失われるわけではありません:

  1. TLB は、この問題をある程度軽減します。翻訳をキャッシュします。
  2. より大きなページ (や など) は、変換されたメモリARMv7-Aの単位ごとに必要な TLB エントリが少なくて済むため、より役立ちます。large pagessections
  3. などもありますglobal pages。アプリケーションを切り替えて現在の TLB をフラッシュする必要がある場合Invalidate TLB entries by ASID match、アプリケーションのASID. カーネルのページをグローバルとしてマークすると、それらの翻訳が無効にならず、カーネル自体が不要な TLB の無効化に悩まされることもありません。

たとえば、ARM Virtual Memory System Architecture(VMSA)、ページ テーブル、TLB などに関する具体的な詳細については、「ARM® アーキテクチャ リファレンス マニュアル ARM®v7-A および ARM®v7-R 版」を参照してください。

于 2011-12-12T09:30:32.297 に答える
6

Linux カーネルが使用する仮想アドレスには、次の 2 種類があります。

  1. 「カーネルメモリ(仮想)は物理メモリに直接対応します(0xC000_0000でオフセットするだけで物理アドレスが得られます)」という行ですでに述べたこと。これは、連続した物理アドレスにマップされます。
  2. vmalloc を使用します。

最初のものは MACRO を使用して行われます。

include/asm-x86/page_32.h

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))

_pa(x) は、仮想から物理への変換を行います。この変換はコンパイル時にインラインで行われることに注意してください。ページ テーブルの変換は行われません。この最後の文は非常に重要です。

一方、2 番目の方法を使用すると、仮想メモリでは連続しているメモリを割り当てることができますが、物理メモリではそうではない場合があります。この場合、初めて仮想アドレスにアクセスするときに、ページ テーブル全体の変換が必要になります。問題は、誰がこれを行うかです。

CISC マシン (x86 など) の場合、TLB ミス (仮想アドレスへの初回アクセス) の場合、MMU (ハードウェア) がそれを行い、ページ テーブルを更新します。カーネルの仮想アドレス (vmalloc で取得) は、TLB エントリとして保持されます。それらはグローバル エントリと呼ばれ、プロセス コンテキスト スイッチが発生すると、ほとんど無視され、残りのプロセス アドレス空間エントリのようにフラッシュされません。ただし、関連付けられている仮想メモリを解放するために vfree を実行すると、それらのエントリは削除されます。

RISC マシン (MIPS など) の場合、ページ変換はソフトウェアによって処理されます。TLB ミスの後、ハードウェアは例外を発生させます。トラップ ハンドルはカーネル モードで実行され、変換を行い、特別な命令を使用して TLB を更新します。トラップ ハンドラから戻った後、同じコード行が実行され、TLB ヒットが発生します。

参照してください: http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

肝心なのは、すべてのカーネルアドレスがあなたが説明した方法でマップされているわけではないということです。あなたの場合、物理アドレスはコンパイル時に生成されます。では、なぜ TLB エントリを追加するのでしょうか。vmalloc からのアドレスの場合、TLB エントリが存在します。プロセス間でコンテキストの切り替えが発生した場合、TLB 全体をフラッシュする必要はなく、カーネルの vmalloc によって作成されたグローバル エントリを保持できます。vfree を使用すると、対応するグローバル エントリがフラッシュされます。

于 2011-12-12T10:18:23.333 に答える