Прохождение кода Futex - возвращение EFAULT - PullRequest
0 голосов
/ 15 сентября 2011

В futex_wake_op function файла futex.c в исходном коде ядра Linux я пытался понять, как элемент управления достигает этой точки. Это происходит, когда в вышеупомянутой функции возвращается futex_atomic_op_inuser-EFAULT, и все же uaddr2 доступен для записи.

Но из источника из futex_atomic_op_inuser я вижу, что он возвращает -EFAULT только на if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))).

futex_atomic_op_inuser в свою очередь вызывает макрос __futex_atomic_op, где я вижу -EFAULT в коде, но мне говорят, что путь к EFAULT не включает в себя вызов __futex_atomic_op

Как управление достигаетвышеупомянутый пункт (то есть если (! fshared) goto retry_private ;) тогда?

Заранее спасибо!

1 Ответ

0 голосов
/ 19 октября 2012

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. , он действителен, но в настоящее время заменен.
...