linux內核內存分配

1 kmalloc和 vmalloc

  都是以字節爲單位分配內存

  kmalloc分配的內存都是位於3GB~high memory之間,這段內核空間與物理內存一一映射,即差爲一固定值,vmalloc  分配的內存空間在VMALLOC_START~4GB之間,虛擬地址上連續物理地址上不一定連續.

  一般情況下,只有硬件設備才需要物理地址連續的內存,因爲硬件設備往往存在於MMU之外,不瞭解虛擬內存,但爲了性能上的考慮,內核中一般使用kmalloc只有需要獲得較大的內存時用vmalloc(kamalloc分配內存小於128kb),例如模塊被動態加載到內核當中時,就把模塊裝載到vmalloc分配的內存上。

  使用kmalloc需使用GFP_標識,kmalloc會通過__get_free_pages進行,類型如下

      GFP_KERNEL 用於進程上下文,內存不足時可以睡眠,等待空閒頁的出現。

      GFP_ATOMIC 用於不可以睡眠進程的上下文,如中斷,或軟中斷

      GFP_DMA從ZONE_DMA進行分配,常和第一二個標識一起使用。

      GFP_USER爲用戶空間分配內存,可能睡眠

      GFP_HIGHUSER首先試圖從ZONE_HIGHMEM分配,若分配不到,嘗試從ZONE_NORMAL和ZONE_DMA分配

      GFP_NOIO類同於GFP_KERNEL但在試圖獲取內存時不允許進行任何I/O操作

      GFP_NOFS類同於GFP_KERNEL,但在試圖獲取內存時不允許進行文件系統調用

      GFP_NOWAIT分配過程不會睡眠。

     標示符在linux/gfp.h

2 按頁分配

  get_zeroed_page(unsigned int flags);

  __get_free_page(unsigned int flags);

  __get_free_pages(unsigned int flags,ubsigned int order);

釋放頁void free_page(unsigned long addr);

           void free_pages(unsigned long addr,unsigned long order);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章