As far as I understand, the use in the GFP_USER
flag (in the call to kmalloc
) is used to allocate memory for user space. Does it means that the allocated page are in kernel space, which are accessible to user?
Does these pages required to be mmapp
'ed in user space or the address is directly accessible to user.
If they need to mmapp
then what is difference between GFP_USER
and GFP_KERNEL
?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Brief explanation can be found in kernel sources:
GFP_KERNEL
is typical for kernel-internal allocations. The caller requires ZONE_NORMAL or a lower zone for direct access but can direct reclaim.
GFP_USER
is for userspace allocations that also need to be directly accessibly by the kernel or hardware. It is typically used by hardware for buffers that are mapped to userspace (e.g. graphics) that hardware still must DMA to. cpuset limits are enforced for these allocations.
#define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
#define GFP_USER (__GFP_RECLAIM | __GFP_IO | __GFP_FS | __GFP_HARDWALL)
From here:
__GFP_HARDWALL enforces the cpuset memory allocation policy.