在Linux内核源代码中的futex.c的futex_wake_op function
中,我试图理解控件是如何达到this点的。这在上述函数{{1}中发生。 }返回-EFAULT,但futex_atomic_op_inuser
是可写的。
但是从uaddr2
的{{3}},我看到它仅在futex_atomic_op_inuser
上返回-EFAULT。
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
依次调用futex_atomic_op_inuser
宏,我在代码中看到-EFAULT,但我告诉EFAULT的路径不涉及调用__futex_atomic_op
控件如何达到上述点(即 if(!fshared)goto retry_private ;)然后?
提前致谢!
答案 0 :(得分:0)
access_ok
仅用于检查地址范围是否对给定访问有效,即使对于它,它也不能总是给出明确的答案。请参阅来源中的评论:
* Returns true (nonzero) if the memory block may be valid, false (zero)
* if it is definitely invalid.
*
* 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.
接下来,即使该块有效,它也可能不存在于内存中(换出)。 futex_atomic_op_inuser
调用pagefault_disable
,这会禁用正常的交换过程,因此您将遇到一个严重错误,从-EFAULT
返回__futex_atomic_op
。
总而言之,所有这些意味着如果出现以下问题,将会达到这一点:
access_ok
或