我已经实现了某种字符设备,我需要有关copy_ from_user函数的帮助。
我有一个结构:
struct my_struct{
int a;
int *b;
};
我在用户空间初始化它,并使用'write'函数将指向my_struct的指针传递给我的char设备。在Kernel的Space字符设备'write'函数中,我将它从* char转换为这种结构。我使用kmalloc为结构分配一些内存并对其进行copy_from_user
。
对于简单的'int a'来说很好,但它只复制b值的指针(地址),而不是b指向的值,所以我现在在Kernel Space中,我正在使用指向a的指针用户空间记忆。这是不正确的,我不应该直接访问用户空间指针,我必须copy_from_user
我的结构中的每个指针,然后使用copy_to_user
函数复制“读取”函数中的每个指针?
答案 0 :(得分:13)
无论你如何获得指针,都必须始终使用copy_from_user
和类似来从内核空间访问用户空间内存。由于b
是指向用户空间内存的指针,因此您必须使用copy_from_user
来访问它。
这些功能执行两项重要的附加任务:
copy_*_user
系列函数有一个特殊的覆盖,告诉PF处理程序一切正常,故障应该正常处理;如果IO无法满足故障(即通常会导致SIGSEGV
或SIGBUS
),则返回错误代码,以便调用者在返回用户空间之前可以进行任何必要的清理与-EFAULT
。答案 1 :(得分:6)
你的猜测是正确的。如果您需要访问值*b
,则需要使用copy_from_user
(以及copy_to_user
在用户流程中将其更新回来。)