get_dma_pages(gfp_mask, order) 用来获得适用于DMA的页. include/linux/gfp.h?v=4.7, line 503 在空闲内存无法满足请求以至于分配失败的情况下,所有上述函数都返回空指针(比如alloc_pages和alloc_page)或者0(比如get_zeroed_page、__get_free_pages和__get_free_page). 因此内核在各次分配之后都必须检查返回...
分配单页的函数alloc_page和__get_free_page, 还有__get_dma_pages是借助于宏定义的. // http://lxr.free-electrons.com/source/include/linux/gfp.h?v=4.7#L483#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)// http://lxr.free-electrons.com/source/include/linux/gfp.h?v=4.7#L500#de...
prepare_alloc_pages函数负责为alloc_context结构体的局部变量ac赋予初始值,尤其是high_zoneidx和zonglist的设定,其依据是分配掩码gfp_mask。根据gfp_mask的不同,优先分配的内存zone也有所不同。例如,对于仅包含ZONE_DMA32和ZONE_NORMAL两个zone的内存节点,high_zoneidx值决定了优先分配的zone。finali...
__get_free_pages((gfp_mask) | GFP_DMA, (order)) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. get_zeroed_page的实现也没什么困难, 对__get_free_pages使用__GFP_ZERO标志,即可分配填充字节0的页. 再返回与页关联的内存区地址即可. AI检测代码解析 ...
void * __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp) { //物理空间页的申请 page = alloc_pages(gfp, order); //对物理空间进行清零cache { unsigned long kaddr = (unsigned long)page_address(page); memset(page_address(page), 0, size); ...
_ _GFP_DMA(要求分配在能够 DMA 的内存区) _ _GFP_HIGHMEM(指示分配的内存可以位于高端内存) _ _GFP_COLD(请求一个较长时间不访问的页) _ _GFP_NOWARN(当一个分配无法满足时,阻止内核发出警告) _ _GFP_HIGH(高优先级请求,允许获得被内核保留给紧急状况使用的最后的内存页) ...
(比如ZONE_DMA32/ZONE_NORMAL),这里记录能分配的最高的zone index */ 119 bool spread_dirty_pages; 120 }; <mm/page_alloc.c> 4674 static inline bool prepare_alloc_pages(gfp_t gfp_mask, unsigned int order, 4675 int preferred_nid, nodemask_t *nodemask, 4676 struct alloc_context *ac, gfp_...
struct page page = alloc_pages(GFP_KERNEL, 0);if (!page)printk("内存分配失败");return -ENOMEM;char buffer = page_address(page);这里要注意三点:alloc_pages返回的是structpage指针而不是直接可用的虚拟地址,需要用page_address转换;GFP_KERNEL标志只能在可能休眠的上下文中使用;分配成功后必须记录page...
struct page *alloc_pages(gfp_t gfp_mask, unsigned int order). `gfp_mask`:分配标志,用于指定分配内存时的行为和约束,例如是否可以睡眠、是否需要高端内存等。常见的标志有 `GFP_KERNEL`(用于内核正常分配,可以睡眠)、`GFP_ATOMIC`(用于原子分配,不能睡眠)等。 `order`:表示连续分配的页面数量,以 2 的幂...
#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) #define __get_free_page(gfp_mask) \ __get_free_pages((gfp_mask), 0)` #define __get_dma_pages(gfp_mask, order) \ __get_free_pages((gfp_mask) | GFP_DMA, (order)) get_zeroed_page的实现,是对__get_free_pages使用__GFP_...