Linux中的全局或本地线性地址空间?

时间:2012-07-28 04:04:18

标签: linux memory-management address-space

在linux中,因为段的基数都是0,所以逻辑地址与线性地址一致(Book“Understanding the linux kernel”)。我认为不同进程的逻辑地址可能是相同的,因此不同进程的线性地址可能相同,并且每个进程视图4GB,每个进程都会有自己的线性地址空间(local address space)。但是其他一些文章说所有进程共享一个大的线性地址空间,并且段机制用于将不同的进程映射到线性地址空间的不同部分。听起来像是具有更宽地址位的全局线性地址空间。我哪里错了?或者它们用于不同的架构?

2 个答案:

答案 0 :(得分:3)

英特尔支持3种地址:

逻辑地址 - (段单位)--->线性地址---(寻呼单元)--->实际地址

如您所知,所有内核和用户代码都访问数据或文本思想虚拟地址(CPU中的逻辑地址)。地址被转换为线性地址,如下图所示:

enter image description here

由于linux实现不支持线性寻址的概念,并且段仅用于权限控制。 Linux内核将每个段的偏移值配置为零。这就是为什么你看不到内核和内核中的线性地址直接在分页单元上使用虚拟地址的原因。

获取线性地址后,MMU寻呼单元引用CR3寄存器获取paing表的基数以生成物理地址。

enter image description here

与cpu缓存相同,分页单元每个CPU核心还有一个TLB缓存,以加快在内存上执行的地址转换。

参考: intel64 software developer's manual

答案 1 :(得分:1)

每个Linux process都有自己的address space;它是virtual memory。不同的进程具有不同的地址空间(但进程内的所有线程共享相同的地址空间)。

您可以通过阅读1234或在流程/proc/1234/maps内部获取Linux上流程/proc/self/maps的地图

尝试以下命令

 cat /proc/$$/maps
 cat /proc/self/maps

并考虑他们的输出;第一个命令显示shell的内存映射;第二个显示运行cat

的进程的内存映射

地址空间在程序启动时设置为execve(2),并使用mmap(2)和相关syscalls进行更改。

应用程序仅通过系统调用与内核交互。内核有一个“不同的”地址空间,你不应该关心它(除非你在内核中编码)。

还请阅读一本好书,如Advanced Unix Programming和/或Advanced Linux Programming

另请参阅系统调用上的this explanation

请注意,分段寻址特定于i386并且已过时:大多数系统不再使用它。它在x86-64的64位模式下完全消失了。所有Linux系统都使用flat memory model

请仔细阅读所有参考资料。