Linux内核:copy_from_user - 带指针的struct

时间:2009-11-08 23:49:26

标签: linux device-driver kernel

我已经实现了某种字符设备,我需要有关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函数复制“读取”函数中的每个指针?

2 个答案:

答案 0 :(得分:13)

无论你如何获得指针,都必须始终使用copy_from_user和类似来从内核空间访问用户空间内存。由于b是指向用户空间内存的指针,因此您必须使用copy_from_user来访问它。

这些功能执行两项重要的附加任务:

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

答案 1 :(得分:6)

你的猜测是正确的。如果您需要访问值*b,则需要使用copy_from_user(以及copy_to_user在用户流程中将其更新回来。)