2

特定の仮想アドレスがマップされていて逆参照できるかどうかをドライバーが確認できる方法はありますか?

ありがとう。

4

1 に答える 1

2

ユーザー空間のアドレスを予期しているいくつかのシステム コールの実行に問題があると思います。この場合、アドレスが有効かどうかを実際に確認する必要はありません。実際には、反対のことを行う必要があります。つまり、失敗メカニズムが関与しないようにする必要があります。

Alessandro Rubini による Kernel System Callsから

ユーザー提供のポインターを使用してユーザー空間との間でデータを転送する他の関数と同様に、システム コールは、提供されたバッファーが有効なアドレスであるかどうかをチェックします。通常の操作では、ユーザー アドレス範囲 (標準のカーネル構成では 0 ~ 3GB) にあるアドレスは有効と見なされ、カーネル アドレス空間 (3GB ~ 4GB) にあるアドレスは有効ではありません。

マクロget_dsget_fs、および をset_fs一緒に使用して、有効と見なされる最上位の仮想アドレスを定義し、システム コールにカーネル空間アドレスを渡すことができます。

mm_segment_t fs = get_fs();        /* save previous value */

set_fs (get_ds());                 /* use kernel limit */

/* system calls can be invoked */

set_fs(fs);                        /* restore before returning to user space */
  1. まず、get_fsマクロを使用して現在の構成を保存します。
  2. 次に、set_fsマクロを使用して新しい上限を設定します。
    • このget_dsマクロは、カーネルに可能な最大仮想アドレスを提供します。
  3. すべてのカーネル アドレスが有効になりました。
    • この構成は、次の まで続きますset_fs
    • 通常のユーザー空間アドレス チェックで失敗することを恐れずに、必要なだけシステム コールを呼び出します。
  4. 最後に、set_fsマクロを使用して制限を以前の構成に戻します。

重要: 制限を以前の構成 (ユーザー空間のアドレスのみが有効な場合) に戻してください。そうしないと、ユーザー空間から渡された無効なポインターがドライバーに大混乱を引き起こす可能性があります!

于 2013-05-09T14:15:49.820 に答える