linux上的虚拟内存

linux上的虚拟内存,linux,memory,memory-management,virtual-memory,Linux,Memory,Memory Management,Virtual Memory,虚拟页面映射到VM机制中的物理页面。一旦必须分页进入新页面,物理页面将被逐出。 我总是假设pagein/pageout是到交换区域或实际映射到VM的文件区域。 我已经读到Linux在启动时会将所有物理页面映射到虚拟页面,这就是为什么监控工具会显示内核保留的大量内存。 所以我的问题是,这种方法的好处是什么?虚拟页在物理页被逐出之前并不存在于磁盘上,而代价高昂的部分是页的进出,这是无法避免的。此外,在我看来,将这些原本为内核保留的页面传递给请求它们的各个进程似乎更为复杂。 我在这里误解了什么?Lin

虚拟页面映射到VM机制中的物理页面。一旦必须分页进入新页面,物理页面将被逐出。 我总是假设pagein/pageout是到交换区域或实际映射到VM的文件区域。 我已经读到Linux在启动时会将所有物理页面映射到虚拟页面,这就是为什么监控工具会显示内核保留的大量内存。 所以我的问题是,这种方法的好处是什么?虚拟页在物理页被逐出之前并不存在于磁盘上,而代价高昂的部分是页的进出,这是无法避免的。此外,在我看来,将这些原本为内核保留的页面传递给请求它们的各个进程似乎更为复杂。
我在这里误解了什么?

Linux虚拟内存通常用于抽象物理内存,以允许操作系统控制内存访问。内核维护从虚拟地址映射到物理地址的页表

分页内存是指当前存储在磁盘交换上的页面被带入内存。分页内存输出是指将页写入磁盘交换并从内存中清除。这允许将更频繁使用的页面保存在更快的存储中,而将不太频繁使用的页面保存在较慢的存储中


虚拟内存还允许操作系统和进程使用比系统上实际物理内存更多的内存。

映射所有物理页面简化了将某些内容加载到即将初始化的内存中的过程。初始页面映射不分配给任何进程,只分配给内核,但这样做可以简化和加速i/o和/或将数据、代码、内核结构复制到新分配的内存中,可能只是使用memcpy或memset

从理论上讲,虚拟内存页不应该只映射到文件的一部分:它们可以是堆栈、堆、文件系统关联缓存或驱动程序数据结构。在这些情况下,虚拟空间不会映射到任何对象

我已经好几年没有看过相关的源代码了,但是分页到交换文件往往是可以避免的,至少在拥有1+G内存的现代系统上是这样。取消某些长时间未访问的只读页面的映射并将其重新映射到当前需要的任何页面,效率至少是原来的两倍,而且可能会提高10倍以上。只有修改过的页面才需要写入交换


如果希望看到截然不同的分页和交换条件,请告诉内核使用更少的内存。在Linux引导参数中添加mem=64M或更少。

我的问题是,Linux方法在启动时将所有物理页面映射到VM页面有什么好处?无论如何,交换的代价是无法避免的。老实说,我不认为这是真的,因为内核需要按需映射页面。例如,考虑SBRK或MMAP,甚至只是堆栈地址上的页错误。内核必须在启动时初始化页表,并告诉CPU页表在哪里。@Cratylus也许你说的是自由页?为了实际分配物理内存,需要对其进行跟踪。这不是任何操作系统所独有的。启动后,还需要通过访问内存,这需要假定页表结构有效。1…这样做可以简化和加快数据的i/o和/或复制。。。但是实际避免的开销是什么呢?如果页面没有被映射,那么唯一的开销就是将其添加到页面表中。对吗?其余部分(即副本)将是相同的。PT修改是否如此昂贵或我在这里感到困惑?2.取消某些只读页面的映射的效率至少是原来的两倍,而且可能超过10倍。。。但是如果不使用交换,那么VM大小与物理内存相同。我认为VM大小=交换+物理内存,因此交换空间越多越好。