当我打印在用户空间中初始化的char *时会发生什么?

时间:2012-09-17 03:45:21

标签: linux-kernel system-calls kernel printk

我实施了一个新的系统调用作为介绍练习。它只需要一个缓冲区和printk缓冲区。我后来才知道正确的做法是使用copy_from_user。

这只是一种预防措施来验证地址,还是我的系统调用导致了一些我看不到的错误(页面错误?)?

如果这只是一种预防措施,它有什么保护作用?

谢谢!

1 个答案:

答案 0 :(得分:6)

有几个原因。

  1. 某些体系结构采用分段内存,其中有一个单独的用户内存段。在这种情况下,copy_from_user对于实际获取正确的内存地址至关重要。
  2. 内核可以访问所有内容,包括(几乎按定义)很多特权信息。如果用户传入内核地址,则不使用copy_from_user可能允许信息泄露。更糟糕的是,如果您在没有copy_to_user的情况下写入用户提供的缓冲区,则用户可能会覆盖内核内存。
  3. 您希望通过传入错误的指针来防止用户崩溃内核模块;使用copy_from_user可以防止出现故障,例如系统调用处理程序可以返回EFAULT以响应错误的用户指针。