Linux kernel 我可以将一个整数传递给'access_ok()'吗;第二个论点是什么?

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(),其第三个参

在LDD3的示例中,
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

例如,根据source
arch/x86/include/asm/uaccess.h
,在x86
access\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。