3

私は、メモリ マップされたデータに対して透過的にデータ変換を行う手法を試してきました。アイデアは、基本的に、目的のファイルをメモリ マップし、読み取り/書き込み保護された 2 番目の匿名領域を作成することです。ユーザーが匿名領域にアクセスすると、結果として生じる segfault がキャッチされ、データが変換され、アクセスを続行できるようにアクセス許可が変更されます。

うまく機能しますが、1 つだけ問題があります。最初にデータに触れずに write() のようなシステム コールにポインターを渡すと、segfault ハンドラーはトリガーされません。代わりに、パーミッションを修正するためにハンドラーが呼び出されないため、単に EFAULT が返されます。問題が発生したときに、システム コールでユーザー空間ハンドラを使用する方法はありますか?

4

1 に答える 1

3

いいえ 、バッファが間違っているときにwrite make a のようなシステムコールを行う方法はありません。SIGSEGVReturnEFAULTは、そのシステムコールのセマンティクスの一部ですwrite(2)

LD_PRELOAD のみに関心がある場合は、物事を行う可能性がありますlibc.soptracesyscalls à la をキャッチするために使用することもできますstrace

あなたの非常によく似た質問に対するこの回答も参照してください。

于 2012-07-27T16:31:47.287 に答える