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

dou*_*ard 0 kernel system-calls linux-kernel printk

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

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

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

谢谢!

nne*_*neo 7

有几个原因.

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