首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux 3/1虚拟地址分割

Linux 3/1虚拟地址分割
EN

Stack Overflow用户
提问于 2009-11-01 23:21:34
回答 3查看 8.6K关注 0票数 11

当涉及到需要highmem处理1GB以上的RAM时,我遗漏了一些东西。有人能指出我哪里出了问题吗?谢谢!

据我所知:

进程的虚拟内存(高内存区域)的

  • 1GB保留给内核操作。用户空间可以使用剩余的3GB。
  • 虚拟机的虚拟内存特性将(连续的)虚拟内存页映射到物理页。

我不知道的是:

  • 什么操作使用内核虚拟内存?我想像kmalloc(.)在内核空间中将使用内核虚拟内存。
  • I认为在这种方案下可以使用4GB内存。我不明白为什么内核1GB的虚拟空间是寻址物理空间时的限制因素。这就是我的理解崩溃的地方。请告诉我,

我一直在读这篇文章(http://kerneltrap.org/node/2450),这很棒。但这并不是我喜欢的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-02 06:16:13

内核虚拟空间之所以成为可使用物理内存的限制因素,是因为内核需要访问所有物理内存,并且访问物理内存的方式是通过内核虚拟地址。内核不使用允许直接访问物理内存位置的特殊指令-它必须为它想要交谈的任何物理范围设置页表条目。

在“旧样式”方案中,内核设置了每个进程的页表,以便每个进程的页表直接将虚拟地址从0xC0000000映射到0xFFFFFFFF,将物理地址从0x00000000映射到0x3FFFFFFF (这些页面被标记为只能在环形0内核模式下访问)。这些是“内核虚拟地址”。在这种方案下,内核可以直接读写任何物理内存位置,而无需修改MMU来更改映射。

在HIGHMEM方案下,从内核虚拟地址到物理地址的映射不是固定的-物理内存的一部分被映射到内核虚拟地址空间中,因为内核需要访问该内存。这允许使用更多的物理内存,但代价是必须不断地更改虚拟到物理的映射,这是一个非常昂贵的操作。

票数 12
EN

Stack Overflow用户

发布于 2009-11-01 23:38:33

在每个进程中将1GB映射到内核允许进程切换到内核模式,而无需执行上下文切换。然后,可以在调用进程的地址空间中适当地处理对系统调用(如read()mmap()和其他调用)的响应。

如果没有在每个进程中为内核预留空间,那么在执行用户空间代码之间切换到“内核模式”将更加昂贵,并且无法通过硬件MMU (内存管理单元)对正在服务的系统调用使用虚拟地址映射。

运行大于1GB物理内存的32位内核的系统能够在ZONE_HIGHMEM中分配物理内存位置(大致高于1GB标记),这可能要求内核跳过圈,以便某些操作与它们交互。PAE (物理地址扩展)的添加扩展了这个问题,允许最多64 1GB的物理内存,降低1GB物理地址内存中的内存与ZONE_HIGHMEM中分配的区域的比率。

票数 6
EN

Stack Overflow用户

发布于 2009-11-01 23:28:06

例如,

  1. 系统调用使用内核空间。
  2. 您可以拥有64 4gb的物理内存,但是在32位平台上,由于32位虚拟地址,处理器只能访问4GB。实际上,您可以拥有1GB的RAM和3GB的交换空间,虚拟寻址将使它看起来像4GB。在64位平台上,虚拟寻址实际上是无限的。
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1658757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档