Linux Device Driver - vmalloc - 2

前篇: vmalloc Oops 


在 Linux Device Driver 3rd 書中的 8.3.3 開始提到 vmalloc;

現在 device driver 實作大部分主張使用 kmalloc(),
因為可以獲得實體記憶體的一塊連續空間,
且在一些硬體動作上 (DMA/ USB/... )  硬體是用 實體位置 來處理.
( kmalloc 回傳的仍是 虛擬位置, 只是分配空間在實體上是連續的 )
比較不會產生硬體動作問題.
( 有時程式開發並不曉得另一個人會不會拿這塊位置去做 e.g. DMA 的操作.. )
( 位置轉換可透過 virt_to_phys() 和 phys_to_virt() 轉換 )

但 kmalloc 一般會有大小限制, e.g. 128K ,
( kmalloc 從 3.10 開始, 大小從 128K 提升到 2^30
( linux/slab.h::KMALLOC_MAX_SIZE )
且連續的空間不一定好找,  如果需要較大的空間,
這時候有另一個選擇 - vmalloc, vmalloc 所回傳的空間, 只是虛擬空間連續,
但實體空間可能是不連續分散的..
( 除了 vmalloc 外, 另外一種方式是開機 insmod 先都 kmalloc 要下來自己管理..
  但 reuse 使用率某些狀況下可能不佳..., )

但 vmalloc 的效能是比較差的, 因為他必須把幾個實體空間映射到連續的虛擬空間.
並修改 page table. 而可能有 cache 或 TLB thrashing 問題..
所以通常不會用在會頻繁使用的資料上.

vmalloc 可用的空間可能是 VMALLOC_START ~ VMALLOC_END
e.g. VMALLOC_START 從 3G + 實體記憶體大小 開始
       前面是 iomap 映射實體記憶體.



而 linux 的 記憶體管理機制, 主要由
    buddy system
    slab allocator

buddy system 是 Linux kernel 底層的記憶體管理機制
slab allocator 是透過 buddy system 的 API , 來申請使用 struct slab

先記錄到這,  後續..







留言

熱門文章