0

Linux カーネル ソースのfutex.c で、制御がこのfutex_wake_op functionポイントに到達する方法を理解しようとしていました。これは、上記の関数で-EFAULT が返され、書き込み可能である場合に発生します。futex_atomic_op_inuseruaddr2

しかし、 のソースから、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

コントロールはどのようにして前述のポイントに到達しますか (つまり、if (!fshared)goto retry_private ;)then?

前もって感謝します!

4

1 に答える 1

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. 有効ですが、現在スワップアウトされています。
于 2012-10-19T18:23:42.390 に答える