【发布时间】:2011-11-29 13:23:47
【问题描述】:
我正在打电话
sys_readlink(const char __user *path, char __user *buf, int bufsiz)
直接,但获取 EFAULT 错误代码。出现此错误是因为 buf 指向内核空间的内存。
那么,有没有办法从内核分配用户空间内存?
kmalloc(size, GFP_USER) 类似于 kmalloc(size, GFP_KERNEL)
并返回指向内核内存的指针。
【问题讨论】:
-
为什么需要在内核中做如此高级别的事情?
-
你已经在内核空间了;您应该直接调用 VFS 而不是使用系统调用。
-
我正在使用 readlink("/proc/PID/exe") 来获取当前进程映像文件的完整路径,还有其他方法可以获取吗?我不能使用 d_path(),因为它使用了一个已经被我钩住的系统调用,所以它返回 NULL
-
GFP_USER 表示您可以允许用户访问的内核空间内存(通常用作共享内核/用户页面的标记)。 Readlink 需要一个用户空间虚拟内存区域和该区域中的地址。我建议您采纳 Ignacio 的建议或重新考虑在内核中编写此代码。
标签: c linux memory memory-management kernel