Linux kernel Linux虚拟到物理映射到RAM

Linux kernel Linux虚拟到物理映射到RAM,linux-kernel,Linux Kernel,我有一个关于Linux的简单问题 让我们假设我们有1GB内存。我从这个1GB内存中读到的 1GB RAM本身分为高内存和低内存 高内存为128MB,低内存为896MB(总容量均为1GB) 我的问题是0x0GB到3GB的数据在哪里映射到RAM 1) 用户空间为3GB—它位于RAM中的什么位置?如果896 MB+高电平 已经占据了整个RAM。用户空间3GB RAM的空间在哪里 4GB +---------------+-------------+ | 128MB

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

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

1GB RAM本身分为高内存和低内存 高内存为128MB,低内存为896MB(总容量均为1GB)

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

1) 用户空间为3GB—它位于RAM中的什么位置?如果896 MB+高电平 已经占据了整个RAM。用户空间3GB RAM的空间在哪里

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

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

如果您有1GB的RAM,可用的物理内存将通过虚拟地址空间映射。同一物理内存页有可能(在许多情况下很可能)被多次映射

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

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


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

那么单独保留128MB(Vmalloc区域)怎么样?这仅适用于内核调用(Vmalloc)。或者其中的一部分也用于用户进程?吉尔·汉密尔顿:不确定你是否收到我的评论:又是这样:那么单独保留128MB(Vmalloc区域)怎么样?这仅适用于内核调用(Vmalloc)吗。或者其中一部分也用于用户进程?128MB是虚拟空间。它实际上并没有留出128MB的内存。这个128MB的区域可用于在单个页面中进行映射(否则内核将无法访问任何尚未直接映射的内容)。换句话说,它是可用于临时映射的空间。是的,这个区域只对内核可用。用户空间永远不允许访问虚拟地址0xc0000000以上的任何内容。我不理解这一点-“否则内核将无法访问尚未直接映射的任何内容”。你能解释一下吗。我感到困惑。另外,临时映射是什么意思?直接映射是指每个页面的一对一映射虚拟=>物理:[0xc0000000=>00000000,0xc0001000=>00001000…0xf7fff000=>37fff000]。任何其他RAM(物理地址高于0x38000000)只有在从0xf8000000(最大128MB)开始显式映射到虚拟窗口中的某个位置时,内核才能访问。例如,当访问PCI设备的BAR时,以及出于任何其他原因,内核必须访问低896MB RAM之外的数据时,都会使用此选项。(“临时映射”确实不正确。内存可能在启动早期分配/保留,并保留到关机。)