kmalloc 中 GFP_USER 标志的用途是什么?

iGR*_*GRJ 4 linux linux-kernel embedded-linux kmalloc

据我了解,GFP_USER标志中的使用(在对 的调用中kmalloc)用于为用户空间分配内存。这是否意味着分配的页面位于用户可以访问的内核空间中?这些页面是否需要mmapp在用户空间中编辑,或者用户可以直接访问该地址。如果他们需要,mmapp那么GFP_USER和之间有什么区别GFP_KERNEL

Rom*_*sev 5

可以在内核源代码中找到简要说明:

GFP_KERNEL是典型的内核内部分配。调用者需要 ZONE_NORMAL 或更低的区域才能直接访问,但可以直接回收。

GFP_USER用于也需要内核或硬件直接访问的用户空间分配。它通常由硬件用于映射到用户空间(例如图形)的缓冲区,硬件仍然必须 DMA 到该缓冲区。对这些分配强制执行 cpuset 限制。

#define GFP_KERNEL      (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
#define GFP_USER        (__GFP_RECLAIM | __GFP_IO | __GFP_FS | __GFP_HARDWALL)
Run Code Online (Sandbox Code Playgroud)

这里

__GFP_HARDWALL 强制执行cpuset内存分配策略。