Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 核心高端內存映射三種方式詳解

編輯:Linux 系統常見問題解答

核心線性地址空間分佈 (32位, 3G/1G 分割)

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 (直接映射區上限) 的部分稱為高端內存。核心無法直接通過線性地址訪問,必須建立臨時/永久映射。

三種映射方式

1. 映射到內核動態映射空間 (vmalloc)

  • 函數:vmalloc() / vfree()
  • 特點:線性地址連續,物理頁面可來自低端或高端內存,不要求物理連續。
  • 適用:大塊非連續物理內存分配,如模塊加載、大數據結構。
  • 缺點:需更新頁表,TLB 刷新,性能較直接映射差;映射建立/撤銷有開銷。

2. 永久內核映射 (kmap / kunmap)

  • 映射區:PKMAP_BASE 到 FIXADDR_START (通常 4GB-8MB ~ 4GB-4MB),4MB 空間,僅需一頁表,對應 pkmap_page_table。
  • 函數:
    • void *kmap(struct page *page):將高端 page 映射至永久區,返回線性地址。可睡眠 (可能等待映射槽位)。
    • void kunmap(struct page *page):解除映射,釋放槽位。
  • 限制:僅 1024 個並發映射槽位 (4MB / 4KB),必須及時 kunmap,否則耗盡導致後續 kmap 阻塞甚至死鎖。
  • 適用:需要長時間訪問高端內存的場景,如文件系統讀寫緩衝區。

3. 臨時映射 (kmap_atomic / kunmap_atomic)

  • 映射區:固定映射區保留部分 (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):恢復抢佔。
  • 特點:極快、無鎖、可在中斷上下文/軟中斷/任務佇列中使用。
  • 適用:極短暫訪問高端頁,如網絡包處理、塊設備請求處理。

關鍵差異總結

特性vmallockmap (永久)kmap_atomic (臨時)
映射區域VMALLOC 區PKMAP 區 (4MB)FIXMAP 區 (每 CPU 槽位)
並發限制虛擬地址空間大小1024 槽位 (全局)每 CPU 每類型 1 槽位
可睡眠是是否 (禁用抢佔)
中斷上下文否否是
映射生命週期長期長期 (需手動釋放)極短 (函數級)
性能開銷較大 (頁表更新、TLB flush)中等 (全局鎖、等待槽位)極小 (無鎖、直接寫頁表)

用戶空間與高端內存

用戶進程無「高端內存」概念。進程缺頁中斷時,核心可將任意物理頁 (含高端內存) 映射進用戶地址空間。核心保留高端線性地址主要為訪問非直接映射的核心數據結構、設備內存等。

Copyright © Windows教程網 All Rights Reserved