gpt4 book ai didi

linux - 如何在并发运行的不同进程上多次使用同一个 Linux 程序加载内存地址?

转载 作者:IT王子 更新时间:2023-10-29 00:11:48 27 4
gpt4 key购买 nike

我正在研究 64 位机器上 Linux 2.6.32 上的进程执行。在研究 /proc/$PID/maps 的输出时,我观察到一件事:

$ cat /proc/2203/maps | head -1
00400000-004d9000 r-xp 00000000 08:02 1050631 /bin/bash

$ cat /proc/27032/maps | head -1
00400000-00404000 r-xp 00000000 08:02 771580 /sbin/getty

似乎所有程序的maps 文件显示每个程序的可执行代码都加载到从0x00400000 开始的内存块中。

我知道这些是虚拟地址。但是,我不明白这些地址对于多个并发运行的进程是如何相同的。使用公共(public)起始地址加载所有进程背后的原因是什么?操作系统如何区分一个进程与另一个进程的虚拟加载点?

编辑:

根据我对使用分页的地址空间虚拟化的理解,我认为部分虚拟地址用于通过使用它来索引一个或多个页表来查找内存块(帧)的物理地址。考虑这种情况。地址看起来是 32 位的(这是另一件让我感到困惑的事情——为什么程序地址是 32 位的,而加载的库的地址是 64 位的?)。将地址分成十位、十位和十二位,分别对应页目录项、页表项和页偏移量,不应该 0x00400000 总是表示“页目录项 1,页表entry 0, offset 0", 不管哪个程序执行地址转换?

我可以看到如何做到这一点的一种方法是,如果操作系统在每次执行任务切换时修改页目录条目 #1 以指向与程序对应的页表。如果是这样的话,听起来会增加很多复杂性——鉴于程序代码是位置无关的,将程序加载到任意虚拟地址并从那里开始不是更容易吗?

最佳答案

答案是每个进程都有自己的页表。它们在进程切换时切换。

更多信息请访问 http://www.informit.com/articles/article.aspx?p=101760&seqNum=3 .

内核在上下文切换发生时切换页表。在内核映射到每个进程的操作系统上,内核页面可以保留。另一方面,为用户进程提供 4GiB 的操作系统(32 位)在进入内核(系统调用)时也必须进行上下文切换。

虽然虚拟寻址不需要不同的进程有不同的页表,(依赖关系相反),但我想不出任何当前的操作系统不给每个进程自己的页表。

关于linux - 如何在并发运行的不同进程上多次使用同一个 Linux 程序加载内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10844871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com