Linux内核:copy_from_user - 带指针的struct

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它来访问它.

这些函数执行两项重要的附加任务:

  1. 它们确保指针指向用户空间而不是内核空间.如果没有此检查,用户空间程序可能会读取或写入内核内存,从而绕过正常的安全性.
  2. 他们正确处理页面错误.通常,内核模式下的页面错误会导致OOPS或恐慌 - copy_*_user函数族具有一个特殊的覆盖,告诉PF处理程序一切正常,故障应该正常处理; 如果IO无法满足故障(即通常会导致a SIGSEGV或者什么SIGBUS),则返回错误代码,以便调用者在返回用户空间之前可以进行任何必要的清理-EFAULT.


caf*_*caf 6

你的猜测是正确的.如果需要访问该值*b,则需要使用copy_from_user(并copy_to_user在用户进程中更新它).

  • 我还要指出,我无法想到任何带有指针结构的系统调用或ioctl.即使那些有字符串的字符串也会在结构中包含一组字符.编写代码为每个指针成员执行此操作非常烦人的事实可能与此有关.:-) (2认同)