从内核分配用户空间内存

Mak*_*akc 3 c linux memory kernel memory-management

我正试着打电话

sys_readlink(const char __user *path, char __user *buf, int bufsiz)
Run Code Online (Sandbox Code Playgroud)

直接,但获取EFAULT错误代码.出现此错误是因为buf指向内核空间的内存.

那么,是否有可能从内核分配用户空间内存?

kmalloc(size, GFP_USER)类似于kmalloc(size, GFP_KERNEL) 并返回指向内核内存的指针.

Has*_*kun 7

您可以使用临时禁用内存地址有效性检查 set_fs

mm_segment_t old_fs;

old_fs = get_fs();
set_fs(KERNEL_DS);
/* Your syscall here */
set_fs(old_fs);
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我有类似的问题。就我而言,我想要进行的系统调用是预读的。所以我直接调用了vfs_read。我验证了这个 set_fs(KERNEL_DS) 正在完成这项工作。但是,稍后当我使用 O_DIRECT 标志打开文件并执行 vfs_read 时,我再次收到 -EFAULT。您能解释一下 O_DIRECT 问题吗? (2认同)