我正在尝试编写一个 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/