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 高記憶體處理

相關內容