linux内核如何pipe理小于1GB的物理内存?

我正在学习linux内核的内部知识,在阅读“理解Linux内核”的同时,还碰到了很多与内存有关的问题。 其中之一是,如果我的系统上安装了只有512MB的物理内存,Linux内核如何处理内存映射。

就像我读的那样,内核映射0(或16)MB-896MB物理内存到0xC0000000的线性地址并且可以直接对它进行寻址。 所以,在上面描述的情况下,我只有512 MB:

  • 内核如何从仅512 MB映射896 MB? 在所描述的scheme中,内核进行设置,以便每个进程的页表将从0xC0000000到0xFFFFFFFF(1GB)的虚拟地址直接映射到从0x00000000到0x3FFFFFFF(1GB)的物理地址。 但是,当我只有512 MB物理RAM时,如何映射虚拟地址从0xC0000000-0xFFFFFFFF到物理0x00000000-0x3FFFFFFF? 点是我有一个物理范围只有0x00000000-0x20000000。

  • 在这种情况下用户模式进程呢?

  • 每篇文章只解释了情况,当你安装了4GB内存,内核将1GB映射到内核空间,用户进程使用剩余的RAM。

我会感谢任何帮助提高我的理解。

谢谢..!

不是所有的虚拟(线性)地址都必须映射到任何东西。 如果代码访问未映射的页面,页面错误上升。

物理页面可以同时映射到多个虚拟地址。

在4 GB虚拟内存中有2个部分:0x0 … 0xbfffffff – 进程虚拟内存和0xc0000000。0xffffffff是内核虚拟内存。

  • 内核如何从仅512 MB映射896 MB?

它映射高达896 MB。 所以,如果你只有512个,只有512 MB映射。

如果你的物理内存在0x00000000到0x20000000之间,它将被映射为直接内核访问虚拟地址0xC0000000到0xE0000000(线性映射)。

  • 在这种情况下用户模式进程呢?

用户进程的物理内存将映射到虚拟地址0x0 …. 0xc0000000(不是顺序的,而是随机的页面到页面的映射)。 这个映射将是从0到896MB的页面的第二个映射。 页面将从免费页面列表中获取。

  • 用户模式在RAM中进程在哪里?

无处不在。

  • 每篇文章只解释情况,当你安装了4 GB的内存

不,每篇文章都解释了4 Gb的虚拟地址空间是如何映射的。 虚拟内存的大小总是4 GB(对于没有内存扩展的32位机器,如x86的PAE / PSE / etc)

8.1.3. Memory Zones 由Robert Love 8.1.3. Memory ZonesLinux Kernel Development (我使用第三版)的内存区域,有几个物理内存区域:

  • ZONE_DMA – 包含16 MB以下的内存页框
  • ZONE_NORMAL – 包含16 MB以上和896 MB以下的内存页框
  • ZONE_HIGHMEM – 包含896 MB以上的内存页框

所以,如果你有512 MB,你的ZONE_HIGHMEM将是空的,ZONE_NORMAL将有496 MB的物理内存映射。

另外,请看2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB 2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB本书的2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB部分2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB 。 这是关于情况,当你有更less的内存比896 MB。

另外,对于ARM,有一些虚拟内存布局的描述: http : //www.mjmwired.net/kernel/Documentation/arm/memory.txt

第63行PAGE_OFFSET high_memory-1是内存的直接映射部分

硬件提供了一个内存pipe理单元 。 这是一个能够截取和修改任何内存访问的电路。 无论处理器何时访问RAM,例如读取下一条要执行的指令,或者作为由指令触发的数据访问,它都是在某个地址 (大致来说是一个32位值)进行的。 一个32位的字可以有超过40亿个不同的值,所以有一个4GB的地址空间 :这就是可以有一个唯一地址的字节数。

所以处理器把请求发送到它的存储器子系统,就像“在地址x处获取字节并把它交还给我”。 请求通过MMU,决定如何处理请求。 MMU实际上将4 GB的空间分成页面 ; 页面大小取决于您使用的硬件,但典型的大小是4和8 kB。 MMU使用表来告诉它如何处理每个页面的访问:要么访问被授予一个重写的地址(页面条目说:“是的,包含地址x的页面存在,它是在地址y的物理RAM” )或被拒绝,此时内核被调用来进一步处理事情。 内核可能会决定终止违规进程,或者做一些工作并更改MMU表,以便可以再次尝试访问,这次可以成功。

这是虚拟内存的基础:从这个angular度来看,这个进程有一些内存,但是内核已经把它移到了硬盘的“交换空间”中。 MMU表中相应的表被标记为“不存在”。 当进程访问他的数据时,MMU调用内核,该内核从交换中获取数据,将其放回到物理RAM中的某个空闲空间,并将MMU表改为指向该空间。 内核然后跳回到进程代码,在触发整个事情的指令。 进程代码看不到整个业务,除了内存访问需要相当长的一段时间。

MMU还处理访问权限,这会阻止进程读取或写入属于其他进程的数据或内核。 每个进程都有自己的一组MMU表,内核pipe理这些表。 因此,每个进程都有自己的地址空间,就好像它独立在一台装有4 GB RAM的机器上一样 – 除了进程最好不能访问它没有从内核中正确分配的内存,因为相应的页面被标记作为缺席或禁止。

当内核通过某个进程的系统调用被调用时,内核代码必须在进程的地址空间内运行; 因此内核代码必须位于每个进程的地址空间中(但受保护:MMU表阻止从无特权的用户代码访问内核内存)。 由于代码可以包含硬编码地址,因此内核最好在所有进程的相同地址; 通常在Linux中,该地址是0xC0000000。 每个进程的MMU表将映射部分地址空间映射到任何物理 RAM块,内核实际上是在启动时加载的。 请注意,内核内存永远不会换出(如果可以从交换空间读回数据的代码本身被换出,事情会变得相当快)。

在个人电脑上,事情可能会更复杂一些,因为有32位和64位模式,段寄存器和PAE(作为一种具有大页面的二级MMU)。 基本概念保持不变:每个进程都有自己的虚拟4 GB地址空间视图,而内核使用MMU将每个虚拟页面映射到RAM中适当的物理位置,或根本就没有。

osgx有一个很好的答案,但我看到一个人仍然不明白的评论。

每篇文章只解释了情况,当你安装了4 GB的内存,内核将1 GB映射到内核空间,用户进程使用剩余的RAM。

这是很多混乱。 有虚拟内存 ,有物理内存 。 每32位CPU有4GB的虚拟内存。 Linux内核的传统拆分是用于用户内存和内核内存的3G / 1G,但较新的选项允许不同的分区。

为什么区分内核和用户空间? – 我自己的问题

当任务交换时,MMU必须更新。 内核MMU空间对于所有进程应该保持不变。 内核必须随时处理中断和故障请求。

虚拟到物理映射如何工作? – 我自己的问题

虚拟内存有许多排列组合。

  • 一个私人映射到物理RAM页面。
  • 一个重复的虚拟映射到单个物理页面。
  • 引发SIGBUS或其他错误的映射。
  • 由磁盘/交换支持的映射。

从上面的列表中,很容易看出为什么你可能拥有比物理内存更多的虚拟地址空间。 事实上, error handling程序通常会检查进程内存信息,以查看页面是否映射 (我的意思是分配给进程),但不在内存中 。 在这种情况下,故障处理程序将调用I / O子系统来读取页面。 当页面被读取并且MMU表被更新以将虚拟地址指向新的物理地址时,导致故障的过程重新开始。

如果你了解了上述内容,就会明白为什么你想拥有比物理内存更大的虚拟映射。 这是如何支持内存交换。

还有其他用途。 例如,两个进程可能使用相同的代码库。 由于链接,它们可能位于进程空间中的不同虚拟地址处 。 在这种情况下,您可以将不同的虚拟地址映射到相同的物理页面 ,以节省物理内存。 这对于新的分配是相当普遍的; 他们都指向一个物理的“零页”。 当您触摸/写入内存时,复制零页面并分配一个新的物理页面(COW或在写入时复制)。

将虚拟页面作为caching而另一个作为非caching也是有用的。 可以检查这两个页面来查看哪些数据被caching,哪些不是。

主要是虚拟的物理的不一样! 说起来容易,但在查看Linux VMM代码时往往会感到困惑。

嗨,其实,我不在x86硬件平台上工作,所以在我的post可能存在一些技术错误。

据我所知,0(或16)MB – 896MB之间的范围是专门列出的,当你有更多的RAM时,比如说,你的主板上有1GB的物理内存,这叫做“低内存”。 如果你的主板上有比896MB更多的物理内存,那么剩下的物理内存被称为highmem。

说到你的问题,你的主板上有512MiBytes物理内存,所以实际上没有896,没有highmem。

总RAM内核可以看到,也可以映射为512MB。

因为物理内存和内核虚拟地址之间有一对一的映射,所以内核有512Mbytes的虚拟地址空间。 我真的不确定前面的句子是否正确,但这是我的想法。

我的意思是如果有512MBytes,那么内核可以pipe理的物理RAM的数量也是512MyBytes,而且内核不能像512MBytes那样创build这么大的地址空间。

参考用户空间,有一个不同点,用户应用程序的页面可以换成硬盘,但是内核的页面不能。

所以,对于用户空间来说,在页表和其他相关模块的帮助下,似乎还有4GB的地址空间。 当然,这是虚拟地址空间,而不是物理RAM空间。

这是我的理解。

谢谢。

如果物理内存小于896 MB,那么Linux内核将线性地映射到该物理地址。

有关详情,请参阅http://learnlinuxconcepts.blogspot.in/2014/02/linux-addressing.html