
我正在將應用軟體整合到晶片組供應商的客製化嵌入式 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 高記憶體處理。