我正在将应用软件集成到芯片组供应商的定制嵌入式 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 高内存处理。