我注意到,当我使用 GDB 打开两个进程进行调试时,/proc/PID/maps 指示这两个进程具有相同的地址区域:
cat /proc/4170/maps
555555554000-555555555000 r--p 00000000 08:01 655807 /home/user/1
555555555000-555555556000 r-xp 00001000 08:01 655807 /home/user/1
555555556000-555555557000 r--p 00002000 08:01 655807 /home/user/1
555555557000-555555558000 r--p 00002000 08:01 655807 /home/user/1
555555558000-555555559000 rw-p 00003000 08:01 655807 /home/user/1
cat /proc/4177/maps
555555554000-555555555000 r--p 00000000 08:01 664427 /home/user/2
555555555000-555555556000 r-xp 00001000 08:01 664427 /home/user/2
555555556000-555555557000 r--p 00002000 08:01 664427 /home/user/2
555555557000-555555558000 r--p 00002000 08:01 664427 /home/user/2
555555558000-555555559000 rw-p 00003000 08:01 664427 /home/user/2
我不明白这是如何处理的,我认为每个进程都应该有自己的页表?
答案1
我不明白这是如何处理的,我认为每个进程都应该有自己的页表?
这正是这里发生的事情。中的地址/proc/.../maps
是虚拟地址,不是物理地址;它们通过每个进程的页表进行解释,以便进程在物理内存中获得单独的页面(共享页面除外)。
因此,两个进程在虚拟地址 555555558000-555555559000 处都有可用的可写内存,但每个进程对该内存都有不同的页表,最终指向不同的物理地址。
(我稍微简化了一下,还有一些额外的细节例如写时复制等,但我们可以在这里忽略它。)