Linux 3/1 パーティショニングと物理図

Linux 3/1 パーティショニングと物理図

私はLinux 3/1パーティション(または2/2、1/3など)と物理メモリへのマッピングがどのように機能するかを理解しようとしています。 x86を仮定しましょう。

特に私が理解していないのは、カーネルのva [3GiB、4GiB)で1GiBが常にpa [0、1GiB]にマップされる理由です。分割位置は(仮想)ですPAGE_OFFSET

メモリが多ければどうなりますか?私が持っているものが少ない場合はどうなりますか?ユーザー空間のすべてのメモリはどこに行きますか?

TLDPでは、ボトム物理1GiBが常にカーネルに使用されることを知っています(なぜですか)。高メモリ使用(この記事を通して)仮想アドレス空間が物理アドレス空間よりも小さい場合は、無駄になるメモリが多いため(正しいですか)、x86-64では仮想アドレス空間が異常であるため使用されません。

カーネルに常に残っていることの1つは、コンテキストスイッチでも同じままであり、current変更する必要がないことですcr3

この回答説明する:

大容量メモリは、ユーザ空間プログラムがアドレスを指定できるメモリセグメントです。メモリ不足に触れることができません。

低メモリは、Linuxカーネルが直接解決できるメモリセグメントです。カーネルが高いメモリにアクセスする必要がある場合は、まずそれを独自のアドレス空間にマップする必要があります。

人々は「低メモリ」と「高メモリ」という用語を乱用していますか?

最後に、LDD3はこう言いました。

カーネルは、カーネルアドレス空間にマップされていないメモリでは直接動作できません。つまり、カーネルには直接アクセス可能なメモリを格納するために独自の仮想アドレスが必要です。したがって、カーネルが長年処理できる物理メモリの最大量は、カーネルコード自体に必要なスペースを引いたカーネルの仮想アドレス空間部分にマッピングできる量でした。したがって、x86 ベースの Linux システムでは、最大 1 GB 未満の物理メモリを使用できます。

pこれは、マッピングが常に適用されるように、カーネルのポインタが物理アドレスではなく仮想アドレスを保持する必要があることを意味しますか? 「1GiB物理メモリ」制限があるのはなぜですか?

ベストアンサー1

今日、32ビットx86は、Linuxが誕生した1990年代初頭の16ビット8086ほど役に立ちません。当時は386が提供する4GBの仮想アドレス空間で十分でした。一般的なデスクトップコンピュータには数十のアドレス空間しかなかったからです。メガバイトメモリ。

Linusは仮想アドレス空間を分割し、上位1GB(アドレス0xc0000000から始まる)をカーネル用に予約し、下位3GB(アドレス0から開始)をユーザー空間プロセスに使用できるようにしました。その後、すべての物理RAMは3 GBから始まるアドレスPAGE_OFFSETからマップされます。 (前述のように)一般的な物理RAM容量はそれよりはるかに少なく、この分割によりユーザースペースに快適な3GBが残ったので、当時は1GBで十分でした。

ページングがアクティブになる前に(つまり、仮想物理アドレスマッピング)、カーネルコードと静的データを含むカーネルイメージが物理メモリの先頭にロードされます。 (正確ではありませんが、PC プラットフォームの特性によっては通常 2 MB で始まります。) ページングがイネーブルの場合、物理アドレス N のメモリは仮想アドレス N+PAGE_OFFSET で終了します。これは、カーネルイメージがカーネルメモリ領域の低い部分(通常は数メガバイト)を占めることを意味します。

これまで、仮想アドレス空間について説明しました。予約済み特定のものについては。実際にこれらのアドレスを使用するには、物理​​RAMページフレームを仮想アドレスにマッピングする必要があります。最初は、マッピングに使用できる物理RAMが少なすぎるため、カーネル仮想アドレス空間のごく一部しかマッピングされていませんでしたが、より大きなRAMが安くなり、急速に急速に変わり、1GBになりました。すべてのアドレスを処理するのに十分なスペースがありません。 RAM。したがって、必要に応じていくつかの追加のRAMをマップするためのウィンドウを提供する「大容量メモリ」メカニズムが導入されました。

それでは、カーネルの仮想アドレス空間にRAMが必要なのはなぜですか?問題は、CPUが仮想(マッピングされた)アドレスを介してのみメモリ(プログラミング方式)にアクセスできることです。レジスタのポインタは、プログラムフローを導く命令ポインタと同様に、仮想アドレス空間へのポインタである。カーネルは、後でユーザー空間プロセスに提供されるバッファをゼロ化するなど、RAMに自由にアクセスできる必要があります。

カーネルがRAM全体をアドレス空間に格納しても、ユーザー空間がそれにアクセスできないという意味ではありません。 RAMページフレームに対する複数のマッピングが存在してもよい。プロセスが実行用に選択されている場合は、カーネルメモリスペースまたはユーザースペースのアドレスに永続的にマッピングできます。

おすすめ記事