特定の仮想アドレスがマップされていて逆参照できるかどうかをドライバーが確認できる方法はありますか?
ありがとう。
ユーザー空間のアドレスを予期しているいくつかのシステム コールの実行に問題があると思います。この場合、アドレスが有効かどうかを実際に確認する必要はありません。実際には、反対のことを行う必要があります。つまり、失敗メカニズムが関与しないようにする必要があります。
Alessandro Rubini による Kernel System Callsから
ユーザー提供のポインターを使用してユーザー空間との間でデータを転送する他の関数と同様に、システム コールは、提供されたバッファーが有効なアドレスであるかどうかをチェックします。通常の操作では、ユーザー アドレス範囲 (標準のカーネル構成では 0 ~ 3GB) にあるアドレスは有効と見なされ、カーネル アドレス空間 (3GB ~ 4GB) にあるアドレスは有効ではありません。
マクロget_ds
、get_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 */
get_fs
マクロを使用して現在の構成を保存します。set_fs
マクロを使用して新しい上限を設定します。
get_ds
マクロは、カーネルに可能な最大仮想アドレスを提供します。set_fs
。set_fs
マクロを使用して制限を以前の構成に戻します。重要: 制限を以前の構成 (ユーザー空間のアドレスのみが有効な場合) に戻してください。そうしないと、ユーザー空間から渡された無効なポインターがドライバーに大混乱を引き起こす可能性があります!