我想调用
sys_readlink(const char __user *path, char __user *buf, int bufsiz)
直接使用指向内核空间的内存,会返回EFAULT错误代码。这个错误出现是因为buf指向来自内核空间的内存。
那么,是否有可能从内核分配用户空间内存呢?
kmalloc(size, GFP_USER)
类似于kmalloc(size, GFP_KERNEL)
,并返回指向内核内存的指针。
我想调用
sys_readlink(const char __user *path, char __user *buf, int bufsiz)
直接使用指向内核空间的内存,会返回EFAULT错误代码。这个错误出现是因为buf指向来自内核空间的内存。
那么,是否有可能从内核分配用户空间内存呢?
kmalloc(size, GFP_USER)
类似于kmalloc(size, GFP_KERNEL)
,并返回指向内核内存的指针。
您可以使用set_fs
临时禁用内存地址有效性检查
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
/* Your syscall here */
set_fs(old_fs);
O_DIRECT
带有一些严格的对齐要求(实际要求因文件系统和内核版本而异),这可能是你问题的原因。 - Hasturkunset_fs
对于新的 Linux 内核已经不再相关了。它已经被移除了 :( - Eytan Naim