首页 > 解决方案 > 从内核空间声明一个指向用户空间数组的指针并填充它

问题描述

我正在用 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.

谢谢!

标签: clinuxmemorykernel

解决方案


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


推荐阅读