天天看點

Linux核心配置設定記憶體的方式

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);

傳遞參數:

繼續閱讀