Vmalloc()
vmalloc()其名稱中的v即是virtual(虛擬)的意思,因為其作用是在虛擬位置空間配置一段連續m記憶體空間,但是在實體記憶體不一定是連續的。以下介紹vmalloc()與其親戚ioremap()的原型:
#include <linux/vmalloc.h>
void *vmalloc(unsigned long size);
void vfree(void *addr);
void *ioremap(unsigned long offset,unsigned long size);
void iounmap(void *addr);
kmalloc()與get_free_page()傳回的地址也是虛擬位址,但其實體記憶體位址與其虛擬記憶體位置有著1對1關係,有可能只位移一個PAGE_OFFSET常數值而已。vmalloc與ioremap所用的位址範圍則是完全靠人工虛構出來的,每一次配置動作,都必須適當修改分頁表,才能建構記憶區。
vmalloc使用的時機大都是需要配置一大塊僅供軟體使用的連續緩衝區。用到vmalloc的實例是create_module()系統呼叫,它必須先配置足夠記憶空間來容納模組。模組裡的程式與資料可使用copy_from_user()來傳到vmalloc()所配置的記憶體。用這種方式,模組就好像被載入到一塊連續記憶體。ioremap()也會建構新的分頁表,但是它不配置記憶體,傳回的一個特殊的虛擬位置,可用來存取指定的實體的記憶體位置。我們可以稱作映射(mapping),這部分在硬體操作上會再更詳細介紹。