从内核空间声明一个指向用户空间数组的指针并填充它

时间:2019-07-05 12:19:32

标签: c linux memory kernel

我正在用C编写内核模块。我需要在用户空间中声明一个指向字符数组的指针,并用数据填充它。我使用char * __user声明了指针,并用调用copy_to_user函数的数据填充了它。然后,我调用copy_from_user函数来检查数据是否正确写入。我只读取零,而不是读取我期望的数据。

我想念什么?从内核空间向用户空间写入数据的正确方法是什么?

代码如下:

u16 address = 0xf0f0;
char __user *buf = address;
copy_to_user(buf, data_to_write, 20);

copy_from_user(data_to_read, buf, 20);
//printing data_to_read I read only zeroes.

谢谢!

1 个答案:

答案 0 :(得分:0)

您不能只是组成一个(虚拟)地址并尝试复制到该地址。您必须在进程的地址空间中注册它。这是mmap()函数从用户空间执行的操作。您需要从内核内部执行等效操作。一旦创建了可写的匿名内存块,就应该可以自由地从内核中复制数据了。