0

我实现了一个新的系统调用作为介绍练习。它所做的只是接收一个缓冲区并打印该缓冲区。后来我了解到正确的做法是使用 copy_from_user。

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

如果这只是一种预防措施,那么它可以防止什么?

谢谢!

4

1 回答 1

7

有几个原因。

  1. 一些架构采用分段内存,其中有一个单独的段用于用户内存。在这种情况下,copy_from_user对于实际获得正确的内存地址至关重要。
  2. 内核可以访问所有内容,包括(几乎按照定义)许多特权信息。copy_from_user如果用户传入内核地址,则不使用可能会导致信息泄露。更糟糕的是,如果您在没有 的情况下写入用户提供的缓冲区copy_to_user,则用户可能会覆盖内核内存。
  3. 你想防止用户仅仅通过传入一个错误的指针来使内核模块崩溃;usingcopy_from_user可以防止错误,例如系统调用处理程序可以返回EFAULT以响应错误的用户指针。
于 2012-09-17T03:58:04.513 回答