Linuxのハイメモリとローメモリとは何ですか?


92

HighmemとLowmemの違いに興味があります。

  1. なぜそんなに違いがあるのですか?
  2. そうすることで何が得られますか?
  3. それぞれにどのような機能がありますか?

@hiro、「HIGHMEM」はldd3で説明されている「カーネル仮想アドレス」を意味します。仰るとおりです。紛らわしいのは、ldd3が「LOWMEM」「HIGHMEM」を定義し、「カーネル仮想アドレス」「カーネルロジックアドレス」も定義していることです。それらは同じものですが、名前は異なります。それはソフトウェアの「美」であり、記述言語に依存します。
スティーブ

回答:


69

32ビットアーキテクチャでは、RAMをアドレス指定するためのアドレス空間の範囲は次のとおりです。

0x00000000 - 0xffffffff

または4'294'967'295(4 GB)。

Linuxカーネルは、それを3/1(2/2または1/3 1でも可)に分割し、それぞれユーザースペース(高メモリ)とカーネルスペース(低メモリ)に分割します。

ユーザー空間の範囲:

0x00000000 - 0xbfffffff

新しく生成されたすべてのユーザープロセスは、この領域内のアドレス(範囲)を取得します。ユーザープロセスは一般的に信頼されていないため、カーネルスペースへのアクセスは禁止されています。さらに、それらは一般的なルールとして、緊急ではないと見なされます。カーネルは、これらのプロセスへのメモリの割り当てを延期しようとします。

カーネル空間の範囲:

0xc0000000 - 0xffffffff

カーネルプロセスは、ここでそのアドレス(範囲)を取得します。カーネルはこの1 GBのアドレスに直接アクセスできます(1 GB全体ではなく、高メモリアクセス用に128 MBが予約されています)。

カーネル空間で生成されたプロセスは信頼され、緊急であり、エラーがないと想定され、メモリ要求は即座に処理されます。

すべてのカーネルプロセスは、必要に応じてユーザー空間の範囲にもアクセスできます。これを実現するために、カーネルはユーザー空間(高メモリ)からそのカーネル空間(低メモリ)にアドレスをマッピングします。上記の128 MBは特にこのために予約されています。


1スプリットが3 / 1、2 / 2、または1/3のいずれであるかは、CONFIG_VMSPLIT_...オプションによって制御されます。おそらく、/boot/config*どのオプションがカーネル用に選択されているかを確認するために下で確認できます。


これは古く、あなたがここにいるのかどうかわかりません。しかし、私は一つのことを聞きたいです:カーネルスペースに確保された128MB(高メモリアクセス用)、それはすべてユーザースペースメモリ領域の参照ですか?したがって、カーネルプロセスは、この領域を参照することにより、任意のユーザースペースにアクセスできます。
アムム

1
なぜそれは常に1/4なのですか?すなわち、なぜそれを5/1またはそれを分割できなかったのですか?
mgalgs

ここで「直接アクセスできる」とはどういう意味ですか?つまり、カーネル自体は仮想メモリメカニズムを介してアクセスされないのですか?
テレン

1
高/低メモリについてあなたが言うことは間違っていると信じています:純粋な32ビットシステムでは、カーネルは3GBのユーザースペース全体に直接アクセスできると考えています(カーネルはカーネルスペースとユーザースペースにアクセスできます)。ただし、PAEカーネルを使用している場合はさらに複雑になり、3GBを超えるRAMが搭載され、各プロセスは3GBになり、ユーザー空間全体に直接アクセスできなくなります。これは、カーネル空間に高いメモリと128MBのメモリが入る場所です。64ビットカーネルでは、すべてのユーザー空間にカーネルからアクセスできるため、高機能の男性ではなく簡単になります。
ctrl-alt-delor 14

2
@mgalgs¼、2/4、および¾は、公開されたデフォルトの選択肢のセットにすぎません。2007年以来、5/16と15/32を選択することもできます。どの#define行を編集するか知っている場合は、独自のほとんど任意の分割を選択できます。
ヨルゲンセン

28

最初に参照するのは、Linuxデバイスドライバー(オンラインと書籍の両方で入手可能)、特にトピックに関するセクションがある第15章です。

理想的な世界では、すべてのシステムコンポーネントは、アクセスする必要があるすべてのメモリをマップできます。そして、これはLinuxおよびほとんどのオペレーティングシステム上のプロセスに当てはまります。32ビットプロセスは2 ^ 32バイト未満の仮想メモリにしかアクセスできません(実際、典型的なLinux 32ビットアーキテクチャでは約3GB)。カーネルにとっては難しくなります。カーネルは、システムコールが実行しているプロセスの全メモリ、物理メモリ全体、および他のメモリマップハードウェアデバイスをマップできる必要があります。

そのため、32ビットカーネルが4 GBを超えるメモリをマップする必要がある場合、高メモリサポートでコンパイルする必要があります。高メモリとは、カーネルのアドレス空間に永続的にマップされないメモリです。(低メモリは逆です。常にマップされているため、ポインタを間接参照するだけでカーネルでアクセスできます。)

カーネルコードからハイメモリにアクセスする場合は、kmap最初に呼び出して、ページデータ構造(struct page)からポインターを取得する必要があります。呼び出しkmapは、ページのメモリが高いか低いかに関係なく機能します。kmap_atomic制約が追加されたものもありますが、きめ細かいロックを使用するため、マルチプロセッサマシンではより効率的です。取得されるポインタkmapはリソースです。アドレス空間を使い果たします。終了したら、kunmap(またはkunmap_atomic)を呼び出してそのリソースを解放する必要があります。ポインタは無効になり、kmap再度呼び出すまでページのコンテンツにアクセスできなくなります。


2
答えてくれたGillesに感謝します。しかし、私はまだ全体のコンセプトを得ることができません。情報を減らさずに、もう少しシンプルにしてください。
セン

17

これはLinuxカーネルに関連しています。Unixカーネルがこれをどのように処理するかはわかりません。

ハイメモリは、ユーザー空間プログラムがアドレスできるメモリのセグメントです。低メモリに触れることはできません。

低メモリは、Linuxカーネルが直接アドレス指定できるメモリのセグメントです。カーネルがハイメモリにアクセスする必要がある場合は、まずカーネルを独自のアドレススペースにマップする必要があります。

セグメントの場所を制御できるパッチが最近導入されました。トレードオフは、アドレス可能なメモリをユーザー空間から取り去ることができるため、使用する前にマップする必要のないより多くのメモリをカーネルが持つことができることです。

追加のリソース:


4

HIGHMEMはカーネルのメモリ空間の範囲ですが、アクセスするメモリではありませんが、アクセスしたいものを置く場所です。

典型的な32ビットLinux仮想メモリマップは次のとおりです。

  • 0x00000000-0xbfffffff:ユーザープロセス(3GB)

  • 0xc0000000-0xffffffff:カーネルスペース(1GB)

(ここでは、CPU固有のベクトルなどは無視されます)。

Linuxは、1GBのカーネルスペースをLOWMEMとHIGHMEMの2つの部分に分割します。分割はインストールごとに異なります。

たとえば、LOWおよびHIGHメモリに512MB-512MBを選択すると、カーネルのブート時に512MB LOWMEM(0xc0000000-0xdfffffff)が静的にマッピングされます。通常、物理メモリの最初の非常に多くのバイトがこのために使用されるため、この範囲の仮想アドレスと物理アドレスは、たとえば0xc0000000の一定のオフセットを持ちます。

一方、後者の512MB(HIGHMEM)には静的なマッピングがありません(ただし、ページを半永久的にマッピングしたままにすることはできますが、ドライバーコードで明示的に行う必要があります)。代わりに、ここでページが一時的にマッピングおよびマッピング解除されるため、この範囲の仮想アドレスと物理アドレスには一貫したマッピングがありません。HIGHMEMの一般的な用途には、シングルタイムデータバッファが含まれます。


3

私の記憶では、「High Memory」はアプリケーションスペースに、「Low Memory」はカーネルに使用されます。

利点は、(ユーザー空間)アプリケーションがカーネル空間のメモリにアクセスできないことです。


0

多くの人は、メモリ不足はオペレーティングシステム用だと言っています。これは通常真実ですが、そうである必要はありません。高メモリと低メモリはメモリ空間の2つの部分にすぎませんが、Linuxシステムでは低メモリはカーネル用であり、ユーザープロセス用の高メモリです。

「恐竜の本(オペレーティングシステムの概念)」によれば、オペレーティングシステムをローメモリまたはハイメモリのいずれかに配置できます。この決定に影響を与える主な要因は、割り込みベクターの位置です。割り込みベクターは多くの場合低メモリにあるため、プログラマは通常オペレーティングシステムも低メモリに配置します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.