【问题标题】:copy_from_user gives null pointercopy_from_user 给出空指针
【发布时间】:2014-07-20 07:14:09
【问题描述】:

我正在尝试编写一个 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。知道我做错了什么吗?

【问题讨论】:

    标签: c linux-kernel open-source


    【解决方案1】:

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

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

    【讨论】:

    • 不应该data 包含&common_mem.msg - IE 地址?我在这里有点困惑......
    • 把一个问题的链接放在这个主题上,以防其他人看到这个并感到困惑:stackoverflow.com/questions/2528318/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2014-09-06
    • 2014-07-19
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多