几乎连续的内存也总是在物理上连续吗?如果没有,如何在物理上非连续的RAM块上分配几乎连续的内存并进行内存映射?感谢详细的答案。
答案 0 :(得分:2)
简短回答:您无需关心(除非您是内核/驱动程序开发人员)。对你来说都是一样的。
更长的答案:相反,几乎连续的记忆通常不在物理上连续(只是非常少量)。除了巧合,或机器刚刚启动后不久。但是,这不是必要的。
分配大量物理连续RAM的唯一方法是使用大页面(因为一页内的内存需要是连续的)。然而,这是一个无用的尝试,因为对于您的过程没有可观察到的差异,您认为它是连续的内存是否实际连续,但使用大页面存在缺点。
在物理上非连续的RAM上的存储器映射不是特别“特殊”的方式。它遵循所有内存管理遵循的相同方法。
操作系统在“页面”中划分虚拟内存,并为您的进程创建页表条目。当您访问某个位置的内存时,相应的页面根本不存在,或者它存在且对应于RAM中的真实页面,或者它存在但不存在对应于RAM中的真实页面。
如果页面存在于RAM中,则根本不会发生任何事情 1 。否则会生成故障并运行某些操作系统代码。如果事实证明该页面根本不存在(或者没有正确的访问权限),则您的进程会因分段错误而终止。
否则,操作系统会选择一个未使用的任意页面(或者交换掉它认为最不重要的页面),然后将数据从磁盘加载到该页面中。在内存映射的情况下,数据来自映射文件,否则它来自交换(对于全新分配的内存,复制零页)。然后操作系统将控制权返回给您的流程。你永远不会知道这件事。
如果您访问位于不同页面的“连续”(或者您认为!)内存区域中的其他位置,则会运行完全相同的过程。
<小时/> 1 实际上,它有点复杂,因为页面可能存在于RAM中但不是“正式”存在,是要回收的页面列表的一部分等。但这太复杂了。
答案 1 :(得分:1)
不,它不必。虚拟内存的任何页面都可以映射到任意物理页面。因此,您可以让虚拟内存的相邻页面指向不相邻的物理页面。该映射由OS维护,并由CPU的MMU单元使用。