我已经实现了某种字符设备,我需要有关 copy_ from_user 函数的帮助。
我有一个结构:
struct my_struct{
int a;
int *b;
};
我在用户空间对其进行初始化,并使用“写入”函数将指向 my_struct 的指针传递到我的字符设备。在内核的空间字符设备“写入”函数中,我将它从 *char 转换为这种结构。我使用 kmalloc 为结构分配了一些内存,并向其中执行了 copy_from_user
操作。
对于简单的 'int a' 没问题,但它只复制 b 值的指针(地址),而不是 b 指向的值,所以我现在在内核空间中,我正在使用指向 a 的指针用户空间内存。这是不正确的吗?我不应该直接访问用户空间指针,我必须 copy_from_user
我结构中的每个指针,然后使用 copy_to_user复制回“读取”函数中的每个指针
函数?
最佳答案
您必须始终使用 copy_from_user
和类似的方法从内核空间访问用户空间内存,无论您如何获得指针。由于 b
是指向用户空间内存的指针,因此您必须使用 copy_from_user
来访问它。
这些函数执行两个重要的附加任务:
- 他们确保指针指向用户空间而不是内核空间。如果没有此检查,用户空间程序可能能够读取或写入内核内存,从而绕过正常的安全措施。
- 他们正确处理页面错误。通常,内核模式中的页面错误会导致 OOPS 或 panic -
copy_*_user
函数族有一个特殊的覆盖,告诉 PF 处理程序一切正常,应该正常处理错误;如果 IO 无法解决故障(即通常会导致SIGSEGV
或SIGBUS
的情况),则返回一个错误代码,以便调用者可以执行任何操作在使用-EFAULT
返回用户空间之前进行必要的清理。
关于Linux 内核 : copy_from_user - struct with pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698396/