我正在尝试编写一个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。知道我做错了吗?
答案 0 :(得分:3)
data
是缓冲区的地址,因此通过读取该地址,您将复制缓冲区的内容。
请注意,用户空间中的内存可以移动或换出,因此该地址仅在系统调用期间有效;您不得存储该地址以供日后使用。
最好在驱动程序中分配一些内存,并允许应用程序使用mmap
访问它。