Futex代码演练 - 返回EFAULT

时间:2011-09-15 17:25:32

标签: kernel arm inline-assembly futex

在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 ;)然后?

提前致谢!

1 个答案:

答案 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

总而言之,所有这些意味着如果出现以下问题,将会达到这一点:

  1. 地址无效,但在access_ok
  2. 中滑过检查
  3. 它有效,但目前已被换掉。