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

C 虚拟地址到物理地址的映射,c,linux,unix,operating-system,C,Linux,Unix,Operating System,我有一个疑问,当每个进程都有自己单独的页表时,为什么需要系统范围的页表?另外,若页表将虚拟地址映射到物理地址,那个么我认为两个进程可能映射到相同的物理地址,因为所有进程都有相同的虚拟地址空间。系统范围页面表上的任何良好链接也可以解决我的问题?每个进程都有自己独立的虚拟地址空间-两个进程可以将virtpage 1映射到不同的物理空间。进程可以参与共享内存,在这种情况下,每个进程都有一些到相同physpage的virtpage映射 进程的虚拟地址空间可用于将virtpages映射到physpages

我有一个疑问,当每个进程都有自己单独的页表时,为什么需要系统范围的页表?另外,若页表将虚拟地址映射到物理地址,那个么我认为两个进程可能映射到相同的物理地址,因为所有进程都有相同的虚拟地址空间。系统范围页面表上的任何良好链接也可以解决我的问题?

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

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

由于许多进程加载相同的库,因此操作系统通常将lib放在一组只读可执行页面中,然后在virtpage空间中为每个进程加载映射,以指向这一组页面,从而节省物理内存

进程可能具有不指向任何内容的virtpage映射,例如,如果进程的部分内存写入了页面文件-进程将尝试访问该页面,CPU将触发页面错误,操作系统将看到页面错误并通过暂停进程来处理,将页面从页面文件读回ram,然后继续该过程

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

第二种类型是当操作系统没有映射时,例如,进程的内存已交换到磁盘,如上所述。在轻负载的机器上,这种情况很少发生,但随着内存压力的增加,这种情况会更加频繁,高达每秒100到1000次,甚至更多

第三种类型是操作系统没有映射,因为映射不存在-进程试图访问不属于它的内存。这会生成一个segfault,通常会终止进程。这些情况不应该经常发生,只取决于软件在机器上的编写情况,与调度或机器负载无关


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

你需要考虑共享内存。每个进程都需要自己的虚拟到物理映射,但系统需要对整个物理内存进行概述,以便在进程需要更多虚拟内存映射到物理内存时知道可以使用什么。的可能副本