Linux kernel 我可以将一个整数传递给'access_ok()'吗;第二个论点是什么?
在LDD3的示例中,Linux kernel 我可以将一个整数传递给'access_ok()'吗;第二个论点是什么?,linux-kernel,linux-device-driver,userspace,Linux Kernel,Linux Device Driver,Userspace,在LDD3的示例中,access\u ok()放在内核模块的ioctl方法的开头,以检查从用户空间传递的指针是否有效。当用户空间应用程序调用ioctl()系统调用并向其传递变量地址时,这是正确的。但是,在某些情况下,ioctl()系统调用使用值而不是指针作为内核模块中的第三个参数,最后是access\u ok()的第二个参数 我尝试将一个整数作为access\u ok()的第二个参数传递,效果很好。未报告任何错误。但我不确定这个用法是否正确 例如,如果我在用户空间中调用ioctl(),其第三个参
access\u ok()
放在内核模块的ioctl
方法的开头,以检查从用户空间传递的指针是否有效。当用户空间应用程序调用ioctl()
系统调用并向其传递变量地址时,这是正确的。但是,在某些情况下,ioctl()
系统调用使用值而不是指针作为内核模块中的第三个参数,最后是access\u ok()
的第二个参数
我尝试将一个整数作为access\u ok()
的第二个参数传递,效果很好。未报告任何错误。但我不确定这个用法是否正确
例如,如果我在用户空间中调用
ioctl()
,其第三个参数为“3”。然后,在结构文件操作的ioctl()
方法中,access\u ok()
将接收3
作为第二个参数。因为access\u ok()
需要一个指针,所以它将3
转换为用户空间指针。相反,这是错误的…用户空间程序可以将任意随机值作为指针提供给您,因此access\u ok()
必须能够处理任意随机值。
因此,使用非指针值调用access\u OK()
绝对可以
但是,除非您确实要访问该内存位置,否则调用access\u ok()
是毫无意义的。
(就此而言,如果可能的话,您应该避免access_ok()
,只需检查实际的用户空间访问(get_user()
等)是否有错误。)实际上,access_ok
的检查很粗糙。函数说明(在源文件中)如:
注意,根据架构的不同,此函数可能只是
检查指针是否在用户空间范围内-调用后
此函数中,内存访问函数仍可能返回-EFAULT
例如,根据sourcearch/x86/include/asm/uaccess.h
,在x86access\u ok
上,只检查给定的地址是否指向较低的区域(因为内核位于较高的区域)。因此,对于等于3
的地址,它返回true
是copy\u from\u user
/copy\u to\u user
返回关于用户内存可访问性的最终结论。那么,如果我传递一个非常大的值,可以转换为内核地址,会发生什么?在这种情况下,access\u ok()
是否返回false?或者,甚至是内核恐慌?此外,在某些体系结构上,access\u ok()
只返回1,不做更多操作。但是在X86上,除了简单地返回1之外,还需要做什么呢?如果将内核地址传递给access\u ok
,它将返回false。