Linux kernel 32位和64位内核上的zone_NORMAL和zone_HIGHMEM

Linux kernel 32位和64位内核上的zone_NORMAL和zone_HIGHMEM,linux-kernel,virtual-memory,Linux Kernel,Virtual Memory,我试图使linux内存管理更清晰一点,以达到调优和性能的目的 通过阅读在上找到的这本非常有趣的红皮书“Linux性能和调优指南”,我发现了一些我不完全理解的东西 在32位体系结构(如IA-32)上,Linux内核只能直接寻址第一个千兆字节的物理内存(考虑保留范围时为896MB)。所谓的正常区域上方的内存必须映射到较低的1 GB。这种映射对应用程序是完全透明的,但是在ZONE\u HIGHMEM中分配内存页会导致性能降低 为什么896MB以上的内存必须映射到1GB以下的内存 为什么在区域\u HI

我试图使linux内存管理更清晰一点,以达到调优和性能的目的

通过阅读在上找到的这本非常有趣的红皮书“Linux性能和调优指南”,我发现了一些我不完全理解的东西

在32位体系结构(如IA-32)上,Linux内核只能直接寻址第一个千兆字节的物理内存(考虑保留范围时为896MB)。所谓的
正常区域上方的内存必须映射到较低的1 GB。这种映射对应用程序是完全透明的,但是在
ZONE\u HIGHMEM
中分配内存页会导致性能降低

  • 为什么896MB以上的内存必须映射到1GB以下的内存
  • 为什么在
    区域\u HIGHMEM
    中分配内存页会对性能产生影响
  • 那么,
    ZONE\u HIGHMEM
    用于什么
  • 为什么一个能够识别高达4gb(
    CONFIG\u HIGHMEM=y
    )的内核只能使用第一个千兆字节

  • 提前感谢

    当用户进程进入内核时,页面表不会更改。这意味着一个线性地址空间必须能够覆盖用户进程可用的内存地址和内核可用的内存地址


    在IA-32上,它允许4GB的线性地址空间,通常第一个3GB的线性地址空间分配给用户进程,最后一个1GB的线性地址空间分配给内核

    内核必须使用其1GB的地址范围才能寻址它需要的物理内存的任何部分。896MB以上的内存没有“映射到低1GB”-发生的情况是896MB以下的物理内存在内核的线性地址空间部分被分配一个永久线性地址,而当内存超过该限制时,必须在线性地址空间的其余部分被分配一个临时映射


    ZONE\u HIGHMEM
    页面映射到用户空间进程时,对性能没有影响-对于用户空间进程,所有物理内存页面都是相等的。当内核需要访问
    ZONE\u HIGHMEM
    中的非用户页面时,会对性能产生影响-为此,如果尚未映射,则必须将其映射到线性地址空间

    “在IA-32上,它允许4GB的线性地址空间,通常前3GB的线性地址空间分配给用户进程,最后1GB的线性地址空间分配给内核。“这是一种常见的分配模式吗?我可以为用户进程分配2GB的空间,为内核分配2GB的空间吗?怎么做?@yegle:你可以在内核构建时更改用户/内核的划分。您必须回答了
    Y
    EXPERIMENTAL
    选项,然后您将看到用户/内核拆分的选择(默认的3GB/1GB,以及2GB/2GB和1GB/3GB)。@caf,我有两个问题。问题1:当陷阱发生时,页面表没有改变。因此,在内核中,前3gb指向用户进程内存,其余指向内核。如果是这样,我们需要额外调整吗?Q2:你说“内核必须使用它的1GB地址范围来解决它需要的物理内存的任何部分。”为什么当内核有一个MMU将虚拟地址转换成物理地址时,内核直接访问物理内存?@ PaulDC:作为一个例子,考虑内核满足用户空间<代码>读()。
    从位于
    区域\u HIGHMEM
    的页面缓存页面请求。为此,它必须从pagecache页面复制到提供的用户空间缓冲区,这意味着它需要能够寻址pagecache页面,因此它必须映射到内核的某个地址空间。