我实现了一个新的系统调用作为介绍练习。它所做的只是接收缓冲区并打印该缓冲区。后来我才知道,正确的做法是使用copy_from_user。
这只是验证地址的预防措施,还是我的系统调用导致了一些我看不到的错误(页面错误?
如果它只是一种预防措施,它保护什么?
谢谢!
有几个原因。
- 某些体系结构使用分段内存,其中用户内存有一个单独的分段。在这种情况下,
copy_from_user
对于实际获得正确的内存地址至关重要。 - 内核可以访问所有内容,包括(几乎根据定义)许多特权信息。不使用
copy_from_user
可能会在用户传入内核地址时允许信息泄露。更糟糕的是,如果您在没有copy_to_user
的情况下写入用户提供的缓冲区,则用户可能会覆盖内核内存。 - 您希望仅通过传入错误的指针来防止用户使内核模块崩溃;使用
copy_from_user
可以防止错误,例如系统调用处理程序可以返回EFAULT
以响应错误的用户指针。