Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> Linuxシステムの仮想メモリスペース

Linuxシステムの仮想メモリスペース

  

最初にオンラインで写真を借りる、これは明らかだと思います。

Linuxシステムの仮想メモリスペース一般的なレイアウト図

1.1線形スペース

リニアアドレススペース:Linuxシステムでは、0x00000000から0xFFFFFFFFまでの4GBの仮想ストレージスペース全体を指します。線形空間は、ユーザー空間とカーネル空間に分けられます。

1.1.1ユーザー空間(プロセスアドレス空間)

ユーザー空間とは、0x00000000から0xBFFFFFFFまでの3GBの線形アドレス空間のことで、各プロセスには独立した3GBのユーザー空間があります。ユーザー空間は各プロセスに固有ですが、カーネルスレッドはユーザー空間アドレスを生成しないため、ユーザー空間はありません。さらに、子プロセスによって共有される(継承される)子スペースは、親プロセスのユーザースペースを共有するのではなく、同じ親プロセスのユーザーリニアアドレスから物理メモリアドレスへのマッピングのみです。ユーザーモードとカーネルモードの両方で動作しているユーザーは、ユーザースペースにアクセスできます。

Linuxは仮想メモリ管理技術を使用し、各プロセスは3Gサイズの独立したプロセスアドレス空間を持ち、このアドレス空間はユーザー空間です。各プロセスのユーザースペースは完全に独立していて無関係です。プロセスがカーネル空間にアクセスする方法:システムコールと割り込み。

プロセスの作成などのプロセス関連の操作では、プロセスにメモリを割り当てる必要があります。現時点では、プロセスの適用と取得は物理アドレスではなく、仮想アドレスにすぎません。実際の物理メモリは、プロセスが実際に新たに取得された仮想アドレスにアクセスし、その後「ページメカニズム」が「行方不明」例外を生成し、したがって実際のページフレームを割り当てるプログラムに入るときだけである。この例外は、仮想メモリメカニズムが存在するという基本的な保証であり、プロセスに物理ページを割り当てて対応するページテーブルを設定するようにカーネルに指示し、その後、仮想アドレスが実際に物理アドレスにマッピングされます。

1.1.2カーネル空間

カーネル空間は、プロセッサの最高レベルのスーパーバイザモードで実行されているコードまたはデータを表し、0xC0000000から0xFFFFFFFFまでの1GBの線形性を占めます。アドレス空間、カーネルリニアアドレス空間はすべてのプロセスで共有されていますが、カーネル状態で実行中のプロセスのみがアクセスでき、ユーザープロセスはシステムコールを通じてカーネル空間にアクセスするためにカーネル状態に切り替えることができます。スペース

カーネル空間は、以下の線形空間に分割することができます。

1.カーネル論理アドレス空間

はBetween PAGE_OFFSET(3G)3G + 896を参照します。線形アドレス空間は、物理メモリの全部または一部をマッピングするシステム物理メモリマップ領域です(システムにハイエンドメモリが含まれる場合)。カーネル論理アドレス空間内のアドレスは、RAMメモリ物理アドレス空間内の対応するアドレスから1固定オフセット(3G)だけ離れており、RAMメモリ物理アドレス空間が0x00000000アドレスからアドレス指定されている場合、オフセットはPAGE_OFFSETです。

2.ハイエンド線形アドレス空間:high_memory(3G + 896M)から0xFFFFFFFFまでの線形アドレス空間は、ハイエンド線形アドレス空間に属します。ここで、VMALLOC_START〜VMALLOC_ENDの間の線形アドレスは(1)vmalloc()です。この関数は、物理的には不連続だが線形アドレス空間では連続しているハイエンドの物理メモリを割り当てるため、または(2)ハイエンドまたはローエンドの物理メモリをマップするためにvmap()関数によって、またはIoremap()によって再マップIに使用されます。 /O物理スペース。 PKMAP_BASEが始まるLAST_PKMAP(通常1024)ページのリニアアドレス空間は、kmap()関数によってハイエンドの物理メモリを永続的にマップするために使用されます。 FIXADDR_STARTは、KM_TYPE_NR * NR_CPUSページのリニアアドレス空間で始まり、ハイエンドの物理メモリを一時的にマップするためにkmap_atomic()関数によって使用されます。

1.2物理空間1.2.1ローエンドメモリ(物理メモリ)

カーネル論理アドレス空間によってマッピングされる物理メモリは、ローエンドメモリ(実際の物理メモリサイズ、ただし896未満)、lowです。 Linuxリニアアドレス空間のメモリには常に1対1の対応するカーネル論理アドレスがあり、システム初期化プロセス中に、ローエンドメモリはカーネル論理アドレス空間に永久にマッピングされ、仮想マッピングページテーブルがローエンドメモリ用に確立されます。ローエンドメモリ内の物理アドレスと物理メモリのリニアアドレス間の変換は、2つのマクロ__pa(x)と__va(x)によって実行できます。#define __pa(x)((unsigned long)(x) - PAGE_OFFSET)__pa(x)は、カーネル論理アドレス空間のアドレスxを対応する物理アドレスに変換します。これは、__ virt_to_phys((unsigned long)(x))と等価です。__va(x)は、ローエンドの物理メモリ空間のアドレスです。対応するカーネル論理アドレスに変換されます。((void *)__ phys_to_virt((unsigned long)(x))))と等価です。

1.2.2ハイエンドメモリ(物理メモリ)

ローエンドメモリアドレスより上の物理メモリはハイエンドメモリ(物理メモリ896より上)です。ハイエンドメモリはLinuxのリニアアドレス空間にはありません。システム初期化プロセス中、マッピングページテーブルはLinuxリニアアドレス空間にマッピングされませんが、割り当てられたハイエンド物理メモリにはハイエンド物理メモリが使用されます。カーネルが使用できるようにページテーブルをマッピングします。そうしないとページテーブルを使用できません。上位メモリの物理アドレスからリニアアドレスへの変換では、上記の__pa(x)および__va(x)マクロは使用できません。

ハイエンドメモリの概念の起源:前述のように、Linuxは4GBのリニアアドレス空間を0x00000000から0xBFFFFFFFまでの2つの部分に分割し、ユーザープロセス専用のユーザー空間として合計3GBの空間を確保します。物理メモリ空間への固定マッピング、カーネル空間として0xC0000000から0xFFFFFFFFまでの4GBのリニアアドレス空間、組み込みシステムでは、プロセッサ内部ペリフェラルレジスタスペースをマッピングするための物理メモリ空間のマッピングに加えて、リニアアドレス空間のこの部分入出力スペース0xC0000000〜high_memoryの間のカーネル論理アドレス空間は、マッピングシステム内の物理メモリを固定するためのものです。つまり、0xC0000000〜high_memoryの間の空間は、システムの物理メモリ空間と同じです(もちろん、CONFIG_DISCONTIGMEMDオプションの不連続構成が構成されます)。メモリシステムでは、カーネル論理アドレス空間と物理メモリ空間にメモリホールがある可能性がありますが、システム内の物理メモリ容量が1 GBよりはるかに小さい場合でも、カーネルリニアアドレス空間のカーネル論理アドレス空間にはまだhigh_memory〜0xFFFFFFFFがあります。入出力スペースをマップするのに十分なスペースがあります。しかし、システムの物理メモリ容量(メモリホールを含む)が1GBを超えると、すべての物理メモリとマッピングシステムのI /Oスペースを固定するのに十分なカーネルリニアアドレススペースがありません。つまり、システム内の物理メモリ(メモリホールを含む)が896MBより大きい場合、最初の896MB物理メモリはカーネル論理アドレス空間0xC0000000〜0xC0000000 + 896MB(= high_memory)に固定的にマッピングされます。 896MB以降の物理メモリでは、カーネルのリニアアドレス空間への固定マッピングは確立されず、この部分をハイエンド物理メモリと呼びます。現時点では、カーネルのリニアアドレス空間high_memory〜0xFFFFFFFFの間の128MBの空間は、ハイエンドのメモリリニアアドレス空間と呼ばれ、ハイエンドの物理メモリとI /O空間のマッピングに使用されます。 896MBはx86プロセッサプラットフォームの経験値であり、ハイエンドメモリとI /Oアドレス空間をマッピングするために128MBのリニアアドレス空間が残っています組み込みシステムでは、このしきい値は特定の条件に従って変更できます例えばMIPSは0x20000000Bに設定します。この場合、システム内の物理メモリ容量が0x20000000Bより大きい場合にのみ、カーネルはハイエンドメモリの割り当てとマッピングを可能にするためにCONFIG_HIGHMEMオプションを設定する必要があります。ハイエンド物理メモリおよびハイエンド物理メモリのしきい値を設定するための条件は、上記のメモリ領域の説明で説明されています。

Copyright © Windowsの知識 All Rights Reserved