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