page = alloc_pages(GFP_KERNEL, get_order(1234));
配置設定失敗傳回NULL
GFP_KERNEL ---> 配置設定标志,當沒有足夠記憶體配置設定時,睡眠阻塞,直到有記憶體配置設定
其他常用配置設定标志 GFP_ATOMIC,不會阻塞,沒有足夠記憶體配置設定時傳回錯誤
配置設定2的get_order(1234)次方個頁框
配置設定頁框,如果配置設定多個頁,配置設定的多個頁在實體位址上是連續的
釋放連續的頁框
__free_pages(page, get_order(1234));
unsigned long p;
p = __get_free_pages(GFP_KERNEL, get_order(1234));
失敗傳回0
成功傳回虛拟位址
free_pages(p, get_order(1234));
配置設定記憶體
void *p;
p = kmalloc(1234, GFP_KERNEL);
一般來說,kmalloc通常用于配置設定少量記憶體,保證可移植一般不超過128k
配置設定記憶體:
在虛拟位址上連續, 在實體位址上也連續
kzalloc();
kfree(p);
p = vmalloc(0x900000);
一般來說,vmalloc通常用于配置設定大量記憶體,
在虛拟位址上連續, 在實體位址上不一定連續
vfree(p);
使用高速記憶體池對象
struct kmem_cache *kc;
建立對象
kc = kmem_cache_create("kc", 16, 0, SLAB_HWCACHE_ALIGN, NULL);
配置設定記憶體塊
p = kmem_cache_alloc(kc, GFP_KERNEL);
釋放記憶體塊
kmem_cache_free(kc, p);
銷毀對象
kmem_cache_destroy(kc);
##########################################################
使用永久映射區通路高端記憶體(實體記憶體896M以上部分)
struct page *page
page = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, get_order(1234));
p = kmap(page);
p = ioremap(0, SZ_1K) ---> 把一段實體位址映射到虛拟位址空間
iounmap(p); ---> 取消映射
v = ioread32(p); ---> p:寄存器虛拟位址
iowrite32(v, p);---> v:要寫入的值
v = ioread16(p);
iowrite16(v, p);
v = ioread8(p);
iowrite8(v, p);
為dma裝置配置設定記憶體
virt = dma_alloc_coherent(NULL, 512, &phys, GFP_KERNEL);
傳回2個位址:
virt ---> 虛拟位址
phys ---> 實體位址
釋放記憶體
dma_free_coherent(NULL, 512, virt, phys);
傳遞參數: