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。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页

相关内容

    暂无相关文章