Linux內核中常見內存分配函數(三)
ioremap void * ioremap (unsigned long offset, unsigned long size)
ioremap是一種更直接的內存“分配”方式,使用時直接指定物理起始地址和需要分配內存的大小,然後將該段 物理地址映射到內核地址空間。ioremap用到的物理地址空間都是事先確定的,和上麵的幾種內存 分配方式並不太一樣,並不是分配一段新的物理內存。
ioremap多用於設備驅動,可以讓CPU直接訪問外部設備的IO空間。ioremap能映射的內存由原有的物理內存空間決定,所以沒有進行測試。Linux培訓
Boot Memory
如果要分配大量的連續物理內存,上述的分配函數都不能滿足,就隻能用比較特殊的方
式,在Linux內核引導階段來預留部分內存。
在內核引導時分配內存
void* alloc_bootmem(unsigned long size)
可以在linux內核引導過程中繞過夥伴係統來分配大塊內存。使用方法是在linux內核引導時,調用mem_init函數之前 用alloc_bootmem函數申請指定大小的內存。如果需要在其他地方調用這塊內存,可以將alloc_bootmem返回的內存首地址通過EXPORT_SYMBOL導 出,然後就可以使用這塊內存了。這種內存分配方式的缺點是,申請內存的代碼必須在鏈接到內核中的代碼裏才能使用,因此必須重新編譯內核,而且內存管理係統 看不到這部分內存,需要用戶自行管理。測試結果表明,重新編譯內核後重啟,能夠訪問引導時分配的內存塊。
通過內核引導參數預留頂部內存
在Linux內核引導時,傳入參數“mem=size”保留頂部的內存區間。比如係統有256MB內 存,參數“mem=248M”會預留頂部的8MB內存,進入係統後可以調用ioremap(0xF800000,
0x800000)來申請這段內存。
幾種分配函數的比較
分配原理最大內存其他
__get_free_pages直接對頁框進行操作4MB適用於分配較大量的連續物理內存
kmem_cache_alloc基於slab機製實現128KB適合需要頻繁申請釋放相同大小內存塊時使用
kmalloc基於kmem_cache_alloc實現128KB最常見的分配方式,需要小於頁框大小的內存時可以使用
vmalloc建立非連續物理內存到虛擬地址的映射物理不連續,適合需要大內存,但是對地址連續性沒有要求的場合Linux培訓
dma_alloc_coherent基於__alloc_pages實現4MB適用於DMA操 作
ioremap實現已知物理地址到虛擬地址的映射適用於物理地址已知的場合,如設備驅動
alloc_bootmem在啟動kernel時,預留一段內存,內核看不見小於物理內存大小,內存管理要求較高
最後更新:2017-04-03 16:48:51