4GB (0xFFFFFFFF) +--------------------------+ | Fixed Mapping (固定映射) | 4KB 隔離帶 | (ACPI_BASE 等) | +--------------------------+ | Permanent Mapping (永久) | 4MB (kmap 區, PKMAP_BASE ~ FIXADDR_START) | 高端內存長期映射 | +--------------------------+ | VMALLOC Mapping (動態) | 8MB~128MB (vmalloc 區, 線性連續物理不連續) | 非連續內存映射 | +--------------------------+ | Direct Mapping (直接) | 896MB (PAGE_OFFSET=3GB ~ 3GB+896MB) | 線性地址 = 3GB + 物理 | +--------------------------+ 3GB (0xC0000000)
物理內存 > 896MB (直接映射區上限) 的部分稱為高端內存。核心無法直接通過線性地址訪問,必須建立臨時/永久映射。
vmalloc() / vfree()PKMAP_BASE 到 FIXADDR_START (通常 4GB-8MB ~ 4GB-4MB),4MB 空間,僅需一頁表,對應 pkmap_page_table。void *kmap(struct page *page):將高端 page 映射至永久區,返回線性地址。可睡眠 (可能等待映射槽位)。void kunmap(struct page *page):解除映射,釋放槽位。FIXADDR_START ~ FIXADDR_TOP),每 CPU 專用槽位,每槽位一頁,按用途枚舉 (enum km_type) 劃分。void *kmap_atomic(struct page *page, enum km_type type):不可睡眠,禁用當前 CPU 抢佔,直接佔用對應 type 槽位,**覆蓋原有映射**。void kunmap_atomic(void *addr, enum km_type type):恢復抢佔。| 特性 | vmalloc | kmap (永久) | kmap_atomic (臨時) |
|---|---|---|---|
| 映射區域 | VMALLOC 區 | PKMAP 區 (4MB) | FIXMAP 區 (每 CPU 槽位) |
| 並發限制 | 虛擬地址空間大小 | 1024 槽位 (全局) | 每 CPU 每類型 1 槽位 |
| 可睡眠 | 是 | 是 | 否 (禁用抢佔) |
| 中斷上下文 | 否 | 否 | 是 |
| 映射生命週期 | 長期 | 長期 (需手動釋放) | 極短 (函數級) |
| 性能開銷 | 較大 (頁表更新、TLB flush) | 中等 (全局鎖、等待槽位) | 極小 (無鎖、直接寫頁表) |
用戶進程無「高端內存」概念。進程缺頁中斷時,核心可將任意物理頁 (含高端內存) 映射進用戶地址空間。核心保留高端線性地址主要為訪問非直接映射的核心數據結構、設備內存等。