copy_from_user 给出空指针

标签 c linux-kernel open-source

我正在尝试编写一个 Open RG 内核模块,它在给定的时间间隔内向用户空间发送一条消息。为此,我需要内核在将存储此消息的用户空间中保存一个指向静态缓冲区的指针。我在将指针发送到内核时遇到问题。

用户空间函数调用是这样的(很明显是简化的):

typedef struct {
 char msg[MAX_BOOT_MSG];
} msg_t;
static msg_t common_mem;

void user_space_func() {
    openrg_module_ctrl(KOS_CDT_TEST, TEST_IOCTL_SET_COMMON_MEM, &common_mem.msg);
}

内核空间使用情况是这样的:

static void* msg_write;
static int do_ioctl(kos_chardev_t *context, unsigned int cmd, 
unsigned long data) {

switch (cmd)
     {
case TEST_IOCTL_SET_COMMON_MEM:
        received_ioctl = 1;
        int ret = copy_from_user(&msg_write, (void *)data, sizeof(char*));
        printk("setting common mem to %p, received %d\n", msg_write, ret);
        return 0;
}
    default:
    return -1;
}

输出是 setting common mem to 0000000000000000, received 0。我看到 common_mem.msg 不是 NULL。知道我做错了什么吗?

最佳答案

data 是缓冲区的地址,因此通过从该地址读取,您正在复制缓冲区的内容

请注意,用户空间中的内存可以移动或换出,因此该地址仅在系统调用期间有效;您不得存储地址供以后使用。 最好在驱动程序中分配一些内存,并允许应用程序使用 mmap 访问它。

关于copy_from_user 给出空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24848253/

相关文章:

javascript - 开源 Node.js(和 Express)项目

c++ - 在 OSX 上从源构建 GIMP 2.10 在 "gimp-debug-tool-2.0"上失败

c++ - 有没有用 C++ 编写的流行的开源项目?

c - 尝试编写函数以求和数组元素时出现段错误

c - 自动售货机 - 只接受硬币

linux-kernel - 为什么要从 O(1) 调度程序转移到 O(log N) 的 CFS?

c - Linux 设备驱动程序 : Symbol "memcpy" not found

核心基础,CF PRIVATE 定义在哪里

c - zmq - 当进程终止时拉队列会发生什么?

c - 如何为数据采集硬件实现 Linux 设备驱动程序?