linuxのメモリ管理FAQ

4616 ワード

linuxのメモリ管理FAQ
一、Linuxメモリ管理はセグメント化ですか、ページ化ですか.
実モードでセグメントメモリ管理モードが導入されないまでは,プログラムは絶対アドレスを用いてメモリ操作を行うため,プログラムの移植性が悪いなどの問題があった.そこで8086時代からセグメントメモリ管理が導入する、セグメント管理はアドレスマッピングの概念を導入し、移植性の問題だけでなく、16ビットALUとセグメントレジスタのアドレス制限も解決し、すなわちより大きなメモリアドレスをサポートした.各セグメントのサイズは64 KBである.
実モードでは、システムプログラムとユーザプログラムがメモリなどのリソースにアクセスする際に権限が区別されないため、オペレーティングシステムに異常が発生する可能性が高い.そこでIntelは80286時代に保護モデルを開発した.
Intelは80386以前のプロセッサに対応するため、IA(Intel Arch)32保護モードではセグメント化を禁止できないが、ページングはOptionalであると規定している./*When operating in protected mode, some form of segmentation must be used. There is no mode bit to disable segmentation. The use of paging, however, is optional.*/.
linuxがメモリ管理でセグメント化を禁止できない以上、linuxはセグメント化が大量のメモリフラグメントをもたらすと考えているので、論理アドレスのセグメントベースアドレスを0にし、オフセット量を加えて線形アドレスを形成することで、セグメント管理メモリを簡素化し、ページ管理メモリを使用します.
IA 32では、1ページあたり4 Kである.
二、linuxの3種類のメモリアドレスと関係はどのようなものですか?
セグメントページング
論理アドレス-->線形アドレス--->物理アドレス
x 86アーキテクチャでは、メモリは3つのタイプのアドレスに分割されます.
     (logical address)  16     :32       ,               (Intel    )。
     (linear address)              32           32         。  :0x08048394,  linux          0x00000000.      =0x00000000+   =    ,        :            ;

物理アドレス(physical address)は、物理アドレスバスのビットで表されるアドレスである.メモリ管理部は、論理アドレスを物理アドレスに変換することができる.
三、なぜ32ビットのオペレーティングシステムの下で各プロセスに4 Gのメモリ使用制限があるのか.
32ビットオペレーティングシステムでは、仮想アドレス空間は2の32乗=4 294 967 296であるため、通常のデータオブジェクトはバイト単位であるため、1プロセスのアドレス可能範囲は4 Gメモリである
四、なぜlinuxサーバーが32ビットなのに4 G以上のメモリを認識できるのか.
本来IA 32では4 Gのメモリしか認識できないが、Intelは32ビットのOSでより多くのメモリをサポートできるようにしている.PAE(Physical Address Extension、物理アドレス拡張)技術を採用した.PAEのサポートは、プロセッサのサポートだけでなく、OSのカーネルもサポートする必要がある(我々が通常採用しているRHEL 3/4/5 kernelはPAEをサポートしている)、つまりプロセッサ内部にPAEレジスタが追加する、複数の4つのアドレスバスを記録するためのシステムは2^36=64 Gである.
五、32ビットのlinuxオペレーティングシステムの下で、どうしてlinuxシステムが認識したメモリは4 Gより大きくて、私のプログラムの各プロセスは4 G以下のメモリしか割り当てられませんか?
IntelはそのプロセッサのためにPAEをサポートするために4本のアドレスラインを追加したが、仮想アドレスは32ビットであるため、単一のプロセスでは4 G以下のメモリしか割り当てられない.
Note: Linux can use up to 64 Gigabytes of physical memory on x86 systems. However, the address space of 32-bit x86 processors is only 4 Gigabytes large. Thus means that, if you have a large amount of physical memory, not all of it can be “permanently mapped” by the kernel. The physical memory that’s not permanently mapped is called “high memory”.
RedhatのWebサイトhttp://www.redhat.com/rhel/compare/
6、32ビットのRedHat linuxは「smp」kernelと「hugemem」kernelのメモリサポートについて何かアドバイスがありますか?
Smp kernelとhugemem kernelは、PAEサポートをサポートしています.つまり、最大64 Gのメモリをサポートできることを意味します.RedHatは、物理的に16 GB以内に存在する場合は、SMP"kernel、16 GB-64 GBの間で"Hugemem"kernelを使用することをお勧めします.これは,仮想アドレス空間に1 Gがカーネル空間に用いられ,3 Gがユーザ空間に用いられるためである.一方、関健の一部のデータ構造は1 Gのカーネル空間に格納、管理32 Gのメモリの中で、これらの物理メモリを管理するために0.5 Gを使用する必要がある(OOM killerをトリガしやすい).32ビットOSではカーネルとユーザ空間の割合はいずれも1:3であるが,Hugememは4 G:4 Gになるようパッチを適用し,カーネル空間とユーザ空間が互いに独立していても性能上の損失があり,アプリケーションの実行により通常カーネルとユーザ空間の切り替えがある.メモリが16 Gより大きい場合は、64ビットのOSを使用することをお勧めします.
/* The “SMP” kernel supports a maximum of 16GB of main memory. Systems with more than 16GB of main memory use the “Hugemem” kernel. In certain workload scenarios it may be advantageous to use the “Hugemem” kernel on systems with more than 12GB of main memory. */
七、私たちは通常malloc 4 Kメモリを持っていますが、いったいどのように物理メモリに対応していますか?
linuxでは、プロセッサはメモリの線形アドレスを取得してメモリアドレスを検索する際に、メモリの物理アドレスで直接検索するのではなく、線形アドレスから主メモリの物理アドレスに変換し、TLB(Translation lookaside buffer、簡単に理解できる:線形アドレスと物理アドレスを格納するハードウェア高速バッファ)は仮想メモリアドレスを実際の物理メモリアドレスに翻訳する責任を負う.CPUアドレッシングはTLBで優先的に行われる.TLBにない場合は、ページ表からリニアアドレスから物理アドレスへの変換を行う.hugepageはTLBのヒット率を増加させることができるので、いくつかの面でシステムの性能を大幅に向上させることができます).
1、論理アドレス回転線アドレス
a、まず、命令の性質に基づいて、どのセグメントレジスタを使用すべきかを決定する.b、セグメントレジスタの内容に基づいて、GDTにおいて相応の「セグメント記述構造」を見つける
c、linuxによってすべてのセグメントのベースアドレスを0にする×00000000.だから0×00000000+オフセット量はリニアアドレスです.ページを分けない場合:線形アドレスは直接物理アドレスである.また,上記の過程では,アクセス権限のチェックがあるため,保護が実現される.
2、線形アドレスは物理アドレスを転送する
保護モードでは、制御レジスタCR 0の最上位ビットPGビット(PEビット制御が保護モードであるか否か)がページング管理メカニズムが有効か否かを制御し、PG=1でページングメカニズムが有効であれば、ページテーブル検索により線形アドレスを物理アドレスに変換する必要がある.PG=0の場合、ページングメカニズムは無効であり、線形アドレスは直接物理アドレスとする.
ページメモリ管理では、32ビットの線形アドレスは、10ビットのページディレクトリテーブルの下付き、10ビットのページテーブルの下付き、12ビットのページ内オフセットの3つの部分に分けられます.CPUは、現在のページディレクトリテーブルへのポインタを格納するCR 3レジスタを追加した.アドレス方式は、a、CR 3からページディレクトリテーブルのベースアドレスを取得する.b、10ビットページ目次表の下付きとCR 3から取得したベースアドレスに基づいて、対応するページ表のベースアドレスを得る.c、10ビットページテーブルの下付きラベルとbで得られたページテーブルのベースアドレスに基づいて、ページテーブルから相応のページ記述項目を取得する.d、ページ記述項目のページベースアドレスと線形アドレスの12ビットページ内アドレスオフセットを加算し、物理アドレスを得る.また,アドレス変換の過程においても境界や権限のチェックがあることは言うまでもない.
注意:従来の32ビットオペレーティングシステムでは、2段階のページングモデルが採用されています.
64ビットとPAEサポートは、3段階ページングモデルを採用しています.