Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中的全局或局部线性地址空间?_Linux_Memory Management_Address Space - Fatal编程技术网

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

Linux中的全局或局部线性地址空间?,linux,memory-management,address-space,Linux,Memory Management,Address Space,在linux中,因为段的基数都是0,所以逻辑地址与线性地址一致(《理解linux内核》一书)。我认为不同进程的逻辑地址可能是相同的,因此不同进程的线性地址可能是相同的,因为每个进程视图4GB,每个进程都有自己的线性地址空间(本地地址空间)。但是其他一些文章说,所有进程共享一个大的线性地址空间,而分段机制用于将不同的进程映射到线性地址空间的不同部分。听起来像是一个具有更宽地址位的全局线性地址空间。我错在哪里?或者它们用于不同的体系结构?每个Linux都有自己的体系结构;它是。不同的进程有不同的地址

在linux中,因为段的基数都是0,所以逻辑地址与线性地址一致(《理解linux内核》一书)。我认为不同进程的逻辑地址可能是相同的,因此不同进程的线性地址可能是相同的,因为每个进程视图4GB,每个进程都有自己的线性地址空间(本地地址空间)。但是其他一些文章说,所有进程共享一个大的线性地址空间,而分段机制用于将不同的进程映射到线性地址空间的不同部分。听起来像是一个具有更宽地址位的全局线性地址空间。我错在哪里?或者它们用于不同的体系结构?

每个Linux都有自己的体系结构;它是。不同的进程有不同的地址空间(但进程内的所有线程共享相同的地址空间)

通过读取
/proc/1234/maps
或从进程内部
/proc/self/maps
可以在Linux上获得进程
1234
的映射

请尝试以下命令

 cat /proc/$$/maps
 cat /proc/self/maps
想想他们的产出;第一个命令显示shell的内存映射;第二个显示运行
cat

地址空间在程序启动时设置为,并随和相关的更改

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

读一本好书,比如和/或

另请参见关于系统调用

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


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

英特尔支持3种地址:

逻辑地址--(段单元)--->线性地址--(寻呼单元)--->物理地址

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

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

在获得线性地址后,MMU分页单元引用CR3寄存器以获取paing表的基址以生成物理地址

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

参考:

这是否意味着Linux使进程的逻辑(也是虚拟的?)地址与其线性地址相同,并且只通过分页来分隔不同的进程?我不明白“线性地址”是什么意思(Linux不使用段寻址,这是i386的一个旧的无用特性,在x86-64或其他处理器中没有使用)。你看过我给你的所有推荐信了吗?看过。我只是对书中介绍的三个地址感到困惑。现在,我应该说,在Linux中,进程可以直接看到虚拟地址,虚拟地址通过分页转换为物理地址,对吗?从应用程序的角度来看,您不应该关心物理地址;您只关心内核内部的物理地址,例如,如果对内核或内核模块进行黑客攻击。用户代码应用程序不关心物理地址。你是对的。但是我想知道linux使用的原理或机制。对于8086CPU,逻辑地址和线性地址是两个概念,但Linux不使用段,所以它们的值是相同的。那么,我是否可以说每个进程只能直接看到它们自己的虚拟地址空间,而虚拟地址空间通过分页与物理地址空间相关?您是从哪个角度提出问题的:从内核内部(例如,编写新内核模块时)还是从应用程序内部(例如,编写Linux应用程序时)?我想知道Linux的原理和机制。特别是linux如何使用硬件提供的功能,例如CPU。我在回复中仔细地给出了很多参考资料。每个参考资料都应该对您有用。