ARM Linux 上的核心記憶體佈局

Russell King <rmk@arm.linux.org.uk>

2005 年 11 月 17 日 (2.6.15)

本文件描述了 Linux 核心用於 ARM 處理器的虛擬記憶體佈局。 它指出了哪些區域可供平臺使用,以及哪些區域由通用程式碼使用。

ARM CPU 能夠定址最大 4GB 的虛擬記憶體空間,這必須在使用者空間程序、核心和硬體裝置之間共享。

隨著 ARM 架構的成熟,有必要保留某些 VM 空間區域以用於新設施; 因此,本文件可能會隨著時間的推移保留更多的 VM 空間。

開始

結束

用途

ffff8000

ffffffff

copy_user_page / clear_user_page 使用。 對於 SA11xx 和 Xscale,這用於設定微型快取對映。

ffff4000

ffffffff

ARMv6 及更高版本 CPU 上的快取別名。

ffff1000

ffff7fff

已保留。 平臺不得使用此地址範圍。

ffff0000

ffff0fff

CPU 向量頁。 如果 CPU 支援向量重定位(控制暫存器 V 位),則 CPU 向量將對映到此處。

fffe0000

fffeffff

XScale 快取重新整理區域。 這在 proc-xscale.S 中用於重新整理整個資料快取。 (XScale 沒有 TCM。)

fffe8000

fffeffff

用於在 CPU 內部安裝了 DTCM 的平臺的 DTCM 對映區域。

fffe0000

fffe7fff

用於在 CPU 內部安裝了 ITCM 的平臺的 ITCM 對映區域。

ffc80000

ffefffff

Fixmap 對映區域。 由 fix_to_virt() 提供的地址將位於此處。

ffc00000

ffc7ffff

保護區域

ff800000

ffbfffff

韌體提供的 DT blob 的永久、固定的只讀對映

fee00000

feffffff

PCI I/O 空間的對映。 這是 vmalloc 空間中的靜態對映。

VMALLOC_START

VMALLOC_END-1

vmalloc() / ioremap() 空間。 由 vmalloc/ioremap 返回的記憶體將動態放置在此區域中。 機器特定的靜態對映也透過 iotable_init() 位於此處。 VMALLOC_START 基於 high_memory 變數的值,VMALLOC_END 等於 0xff800000。

PAGE_OFFSET

high_memory-1

核心直接對映的 RAM 區域。 這映射了平臺的 RAM,通常以 1:1 的關係對映所有平臺 RAM。

PKMAP_BASE

PAGE_OFFSET-1

永久核心對映。 將 HIGHMEM 頁面對映到核心空間的一種方法。

MODULES_VADDR

MODULES_END-1

核心模組空間。 透過 insmod 插入的核心模組使用動態對映放置在此處。

TASK_SIZE

MODULES_VADDR-1

使用 KASan 時的 KASAn 影子記憶體。 從 MODULES_VADDR 到記憶體頂部的範圍在此處被陰影化,每位元組記憶體 1 位。

00001000

TASK_SIZE-1

使用者空間對映。 每個執行緒的對映透過 mmap() 系統呼叫放置在此處。

00000000

00000fff

CPU 向量頁/空指標陷阱。 不支援向量重對映的 CPU 將其向量頁放置在此處。 核心和使用者空間的 NULL 指標取消引用也透過此對映捕獲。

請注意,與上述區域衝突的對映可能會導致核心無法啟動,或者可能導致核心在執行時(最終)崩潰。

由於未來的 CPU 可能會影響核心對映佈局,因此使用者程式不得訪問未對映在其 0x0001000 到 TASK_SIZE 地址範圍內的任何記憶體。 如果他們希望訪問這些區域,他們必須使用 open() 和 mmap() 設定自己的對映。