32 位架构上的拆分

32 位架构上的拆分

我正在将应用软件集成到芯片组供应商的定制嵌入式 Linux 发行版中。这是我正在开发的基于 ARM 的产品。我注意到内核是用 64 位构建的,但其余的用户空间是 32 位的。

即使用户空间为 32 位,将内核构建为 64 位是否有任何性能优势?该 SOC 基于 ARM cortex-a53。

有人建议将用户空间设置为 32 位将导致用户空间的 RAM 占用空间更小。这同样适用于内核,但内核是 64 位的。我猜性能会有提升?

有关硬件的一些具体信息:

  • ARM 皮质 a53
  • 1 GB 内存

PS:由于保密限制,我无法透露供应商名称。

答案1

Linux进程的虚拟地址空间分为两个区域:

  • 内核空间
  • 用户空间。

32 位架构上的拆分

在32位架构上,例如arm或i386,传统的分割是3:1,如下所示:

    +--------+ 0xffffffff
    | Kernel |
    +--------+ 0xc0000000
    |        |
    | User   |
    |        |
    +--------+ 0x00000000
  • 内核空间 - 1 GiB
  • 用户空间 - 3 GiB

因此,内核在任何一次最多可以映射 1 GiB 的物理内存,但还有进一步的分割,因为我们需要临时映射的虚拟地址空间来访问其余的物理内存。拆分如下:

  • 低896 MiB(0xc0000000到0xf7ffffff)直接映射到内核物理地址空间
  • 剩余的 128 MiB(0xf8000000 到 0xffffffff)由内核按需使用来映射到高端内存。

安排如下:

                                                 physical memory 2 GiB 
                                          +------> +------------+
                                          |        |  1152 MiB  |  
                                          |        |            |  
    +------------------+ 0xffffffff  -----+        |  HIGH MEM  |  
    | On Demand 128MiB |                           |            |  
    +------------------+ 0xf8000000  ------------> +------------+  
    |                  |             ------+  
    |  Direct mapped   |                   +-----> +------------+   
    |    896 MiB       |             --+           |   896 MiB  |        
    +------------------+ 0xc0000000    +---------> +------------+  

因此,Linux 内核通过 highmem 接口提供对 2/4/6/8 GiB 范围内的物理内存的间接访问。但是,创建临时映射的相关成本可能相当高。架构必须操作内核的页表、数据 TLB 和/或 MMU 的寄存器。

关于 64 位架构

3G/1G 划分不适用。由于地址空间巨大,可以选择用户空间和内核空间之间的分割方案,允许将整个物理内存映射到内核地址空间。从而节省了 32 位体系结构产生的临时映射的所有开销。

在 64 位架构上的 Linux 内核中,高内存支持是可选的,在 64 位架构上的 Linux 中,高内存支持甚至被禁用。

参考:Linux 高内存处理

相关内容