我可以将整数作为第二个参数传递给“access_ok()”吗?

Can I pass an integer to `access_ok()` as it's second argument?

LDD3的例子中,access_ok()放在内核模块的ioctl方法的开头,用于检查是否从用户空间传递的指针已验证。当用户空间应用程序调用 ioctl() 系统调用并向其传递一个变量地址时,这是正确的。然而,在某些情况下,ioctl() 系统调用是用一个值而不是指针作为第三个参数调用的,最后是内核模块中 access_ok() 的第二个参数。

我尝试传递一个整数作为 access_ok() 的第二个参数,但效果很好。没有报错。但我不太确定这种用法是否正确?

例如,如果我在用户空间中调用 ioctl(),它的第三个参数为“3”。然后,在 struct file_operationsioctl() 方法中,access_ok() 将接收 3 作为第二个参数。因为 access_ok() 需要一个指针,所以它将 3 转换为用户空间指针。反过来看,是错误的...

用户空间程序可以为您提供任何随机值作为指针,因此 access_ok() 必须能够处理任何随机值。 所以用非指针值调用access_ok()肯定是可以的

但是,除非您真的要尝试访问该内存位置,否则调用 access_ok() 是完全没有意义的。 (就此而言,如果可能的话,您应该避免 access_ok() 并只检查实际的用户空间访问(get_user() 等)是否有错误。)

其实access_ok的检查很粗糙。函数的描述(在源文件中)说:

Note that, depending on architecture, this function probably just checks that the pointer is in the user space range - after calling this function, memory access functions may still return -EFAULT.

例如,根据来源 arch/x86/include/asm/uaccess.h,在 x86 上 access_ok 只是检查给定地址指向 lower 区域(因为内核除了在 upper区域)。因此,它 returns true 的地址等于 3.

copy_from_user/copy_to_user return 关于用户内存可访问性的最终裁决。