Linux kernel 当我打印在用户空间中初始化的char*时会发生什么?
作为介绍练习,我实现了一个新的系统调用。它所做的只是接收一个缓冲区并打印该缓冲区。后来我了解到正确的做法是使用copy_from_user 这只是验证地址的预防措施,还是我的系统调用导致了一些我看不见的错误(页面错误?) 如果这只是一种预防措施,那么它能防止什么呢Linux kernel 当我打印在用户空间中初始化的char*时会发生什么?,linux-kernel,system-calls,kernel,printk,Linux Kernel,System Calls,Kernel,Printk,作为介绍练习,我实现了一个新的系统调用。它所做的只是接收一个缓冲区并打印该缓冲区。后来我了解到正确的做法是使用copy_from_user 这只是验证地址的预防措施,还是我的系统调用导致了一些我看不见的错误(页面错误?) 如果这只是一种预防措施,那么它能防止什么呢 谢谢 有几个原因 有些体系结构使用分段内存,其中用户内存有一个单独的段。在这种情况下,copy\u from\u user对于实际获取正确的内存地址至关重要 内核可以访问所有内容,包括(几乎按定义)大量特权信息。如果用户传入内核地址,
谢谢 有几个原因
copy\u from\u user
对于实际获取正确的内存地址至关重要copy\u from\u user
可能会导致信息泄露。更糟糕的是,如果您在没有copy\u to\u user
的情况下写入用户提供的缓冲区,用户可能会覆盖内核内存copy\u from\u user
可以防止出现故障,例如,系统调用处理程序可以返回EFAULT
,以响应错误的用户指针