虚拟地址到物理地址的映射

时间:2012-01-25 16:55:01

标签: c linux unix operating-system

我怀疑每个进程是否有自己独立的页表,那为什么需要系统范围的页表?此外,如果Page表是将虚拟地址映射到物理地址,那么我认为两个进程可能映射到相同的物理地址,因为所有进程都具有相同的虚拟地址空间。系统范围页面表上的任何好的链接也会解决我的问题吗?

1 个答案:

答案 0 :(得分:10)

每个进程都有自己独立的虚拟地址空间 - 两个进程可以将virtpage 1映射到不同的实际页面。进程可以参与共享内存,在这种情况下,它们每个都有一些virtpage映射到同一个physpage。

进程的虚拟地址空间可用于将virtpages映射到physpages,内存映射文件,设备等.Virtpages不必连接到RAM。一个进程可以对整个1GB文件进行内存映射 - 在这种情况下,它的物理内存使用量可能只有几兆,但其虚拟地址空间使用量将为1GB或更多。许多进程可以做到这一点,在这种情况下,所有进程中虚拟地址空间使用量的总和可能是40 GB,而总物理内存使用量可能只有100兆;这在32位系统上很容易实现。

由于许多进程加载相同的库,操作系统通常将lib放在一组只读可执行页面中,然后在virtpage空间中加载映射,以便每个进程指向一组页面,以节省在物理记忆上。

进程可能具有不指向任何内容的virtpage映射,例如,如果进程的一部分内存被写入页面文件 - 进程将尝试访问该页面,CPU将触发页面错误,操作系统将看到页面错误并通过挂起进程来处理它,从页面文件中读回页面然后恢复进程。

通常有3种类型的页面错误。第一种类型是当CPU没有TLB中的虚拟物理映射时 - 处理器调用OS中的pagefault软件中断,操作系统将映射放入处理器进行该过程,然后proc重新运行违规说明。这些每秒发生数千次。

第二种类型是OS没有映射时,因为例如,进程的内存已经交换到磁盘,如上所述。这些很少发生在轻载的机器上,但随着内存压力的增加,更频繁地发生,每秒高达100s到1000s,甚至可能更多。

第三种类型是操作系统没有映射,因为映射不存在 - 进程正在尝试访问不属于它的内存。这会产生段错误,通常会导致进程被终止。这些不应该经常发生,并且完全取决于软件在机器上的编写情况,并且与调度或机器负载没有任何关系。

即使你已经知道这一点,我想我会把它扔进社区。