歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核內存分配類型和方法

函數功能描述:
struct page alloc_pages(unsigned int flags, unsigned int order);函數以gfp_mask分配方式分配2的order次方(1<<order)個*連續的物理頁*。
分配的頁可以通過void
page_address(struct page page)函數獲得該page對應的邏輯地址指針。如果無需用到struct page可以直接用__get_free_pages(unsigned int flags, unsigned int order)分配並返回一個指向一個內存區第一個字節的指針, 內存區是幾個(*物理上連續)頁長但是*沒有清零*。還可以使用get_zeroed_page(unsigned int flags);返回一個指向新頁的指針並且用*零填充了該頁*.

輸入參數說明:
gfp_mask:是分配標志,內核分配內存有多種方式,該參數告訴內核如何分配以及在哪分配所需的內存,內存分配最終總是調用 _get_free_pages( ) 來實現,這也是 GFP 前綴的由來。其中分配標志(gfp_mask)可以取以下各值:

GFP_KERNEL 該分配方式最常用,是內核內存的正常分配,它可能睡眠。
GFP_ATOMIC 該分配方式常用來從中斷處理和進程上下文之外的其他代碼中分配內存,從不睡眠。
GFP_USER 用來為用戶空間分配內存頁,可能睡眠。
GFP_HIGHUSER 類似GFP_USER,如果有高端內存,就從高端內存分配頁。
GFP_NOIO
GFP_NOFS 功能類似於GFP_KERNEL,但是為內核分配內存的工作增加了限制。具有GFP_NOFS 的分配不允許執行任何文件系統調用,而 GFP_NOIO 禁止任何 I/O 初始化。它們主要用在文件系統和虛擬內存代碼,那裡允許分配休眠,但不應發生遞歸的文件系統調用。

有的標志用雙下劃線做前綴,他們可與上面標志“或”起來使用,以控制分配方式:
_GFP_DMA 要求分配可用於DMA的內存。
_GFP_HIGHMEM 分配的內存可以位於高端內存。
_GFP_NOWARN 當一個分配無法滿足,阻止內核發出警告(使用 printk )。
_GFP_HIGH 高優先級請求,允許為緊急狀況消耗被內核保留的最後一些內存頁。
_GFP_REPEAT
_GFP_NOFAIL
_GFP_NORETRY 告訴分配器當滿足一個分配有困難時,如何動作。_GFP_REPEAT 表示努力再嘗試一次,仍然可能失敗;__GFP_NOFAIL告訴分配器盡最大努力來滿足要求,始終不返回失敗,不推薦使用;__GFP_NORETRY 告知分配器如果無法滿足請求,立即返回。

order:指要分配的物理頁數,其取值為2的order次方個。
返回參數說明:
alloc_pages( )函數返回page結構體指針,指向所分配的物理頁中的第一個頁,如果分配不成功,則返回NULL。

Copyright © Linux教程網 All Rights Reserved