Bor*_*kov 5 kernel virtual-memory
我对 TLDP 中虚拟内存的解释完全困惑:
http://www.tldp.org/LDP/tlk/kernel/processes.html#tthFtNtAAB
他们说:
每个单独的进程都在其自己的虚拟地址空间中运行,除非通过安全的内核管理机制,否则无法与另一个进程交互。
我的“自己的虚拟地址空间”在 32 位模式下读取为自己的 4Gb RAM:0000:0000 - FFFF:FFFF。但他们不是那个意思,对吧?如果两个进程指向虚拟地址 1111:1111,它们意味着相同的物理地址,那么所有进程共享相同的 4 Gb 虚拟地址空间?
此外,我在这里阅读了有关 Windows 的内容,它们确实为每个进程提供了单独的虚拟地址空间,为用户模式提供了单独的 2Gb RAM,为内核模式提供了共享的 2Gb,因此两个不同的进程都可以指向 1111:1111,它映射到不同的物理内存。他们吗?:)
更新:我的问题的插图。哪些图片适合 Linux:
情况1:
案例二
Linux 和 Windows 在这里的工作方式几乎相同。每个进程都有自己的“虚拟”地址空间。这并不意味着内存实际上是物理可用的(显然大多数 32 位计算机从来没有足够的内存),这就是为什么它是虚拟的。
此外,那里使用的地址与物理地址不对应。因此AAAA:0000的物理内存段可以对应9128:2af2,关键是你不必关心。应用程序所关心的只是感兴趣的东西在它自己的内存段中的位置。是的,这也意味着两个应用程序可以在他们自己的内存视图中指向同一个地址并获得不同的东西。
除了进程的实际物理内存页面之外,还有很多有趣的东西可以映射到那里,例如属于设备的地址(想想视频卡)、动态链接的库或进程之间共享的内存(这是“安全的内核管理机制”是什么意思)。
如果您想更深入地研究虚拟内存和进程地址空间布局,或者如果您无法轻松掌握一本http://duartes.org/gustavo/ blog/post/anatomy-of-a-program-in-memory也很好读。
“自己的虚拟地址空间”其实和你说的正好相反:它的意思是地址11111111在每个进程中指向物理内存中的不同位置。如果虚拟地址在不同进程中对应相同的物理地址,那么这些进程将共享一个地址空间。事实上,一些地址空间是在几个进程之间共享的(例如,after fork
,几乎所有的页面都是在父子进程之间共享的)。这对应于您的“案例 2”图片。Linux 和 Windows 在这方面没有什么不同。
Linux 实际上可以fork
在一些没有MMU,只有 MPU(内存保护单元)的小型嵌入式设备上运行(以降级模式,其中不支持)。在这样的设备上,没有虚拟地址空间(情况 2),但进程之间仍然存在分离,因为每个进程对内存页都有自己的一组权限。