Linux虚拟到物理映射到RAM

时间:2014-07-04 15:26:58

标签: linux-kernel

我有一个关于Linux的简单问题。

让我们假设我们有1GB的RAM。我读到了这个1GB内存

1GB RAM本身分为高内存和低内存 高内存为128MB,低内存为896MB(两者均为1GB)

我的问题是映射到RAM的0x0GB到3GB数据在哪里

1)用户空间为3GB - 它驻留在RAM中的哪个位置?如果是896 MB +高    已占据整个RAM。 Userspace 3GB RAM的空间在哪里?

4GB     +---------------+-------------+
        |     128MB     |             | 
        +---------------+ <------+    |->|------------+                 
        |     896MB     |        |       |   128MB    | 
    3GB +---------------+ <--+   +------>+------------+ 
        |               |    |           | 896 MB     |
        |     /////     |    +---------->+------------+
        |               |     
    0GB +---------------+     

1 个答案:

答案 0 :(得分:2)

你混淆了不同的概念。 [0-3GB] + [3-4GB]区域位于虚拟地址空间(特定布局非常特定于i386 [即x86 32位],顺便说一句。)

如果您有1GB的RAM,则可通过虚拟地址空间映射可用的物理内存。有可能(并且在许多情况下,可能)对同一物理内存页面进行多次映射。

默认情况下,在i386中,低896MB的RAM直接映射到内核虚拟地址空间,从3GB标记(0xc0000000)开始。内核实际上为其代码和数据区域使用了最低几兆字节。然后将其余大部分放入分配池中,随后可以将其分配给内核或用户进程使用。

因此,用户虚拟地址空间使用一些相同的物理内存。物理页面根据进程的需要逐个分配,并映射到低3GB的虚拟空间。每次有上下文切换时,此映射都会更改。也就是说,进程A的虚拟地址空间映射不同于进程B的页面集 - 除了内核部分(高于0xc0000000)不会改变。

实际执行代码时,程序中使用的每个代码或数据地址都是虚拟地址。虚拟地址按页面表转换为硬件中的物理地址。内核设置并完全控制页表。