閱讀222 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Ubuntu 13.04 – Install Jetty 9
  下一篇:go 高可用開源方案 Keepalived VS Heartbeat對比