5

特定のプロセスのメモリにアクセスできるカーネルモジュールを作成しています。私はいくつかのユーザースペースメモリで匿名マッピングを行いましたdo_mmap()

#define MAP_FLAGS   (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS)

prot = PROT_WRITE;
retval = do_mmap(NULL, vaddr, vsize, prot, MAP_FLAGS, 0);

vaddrおよびvsizeが先に設定され、呼び出しが成功します。カーネルモジュールから(を介して)そのメモリブロックに書き込んだ後、 (通常のユーザースペースで行うように)そのメモリブロックのアクセス許可copy_to_userを削除したいと思います。これを可能にする関数が見つからないようです。PROT_WRITEmprotect

領域のマッピングを解除し、正しい保護を使用して再マッピングしようとしましたが、メモリブロックがゼロになり、書き込んだデータがすべて消去されました。設定MAP_UNINITIALIZEDはそれを修正するかもしれませんが、manページから:

MAP_UNINITIALIZED(Linux 2.6.33以降)

匿名ページをクリアしないでください。このフラグは、組み込みデバイスのパフォーマンスを向上させることを目的としています。このフラグは、カーネルがCONFIG_MMAP_ALLOW_UNINITIALIZEDオプションで構成されている場合にのみ適用されます。セキュリティへの影響があるため、このオプションは通常、組み込みデバイス(つまり、ユーザーメモリの内容を完全に制御できるデバイス)でのみ有効になります。

だから、それは私が望むことをするかもしれないが、それはあまり移植性がないだろう。私が提案したことを達成するための標準的な方法はありますか?

4

2 に答える 2

0

ユーザー空間には、mprotect既存のマッピングの保護フラグを変更できるシステム コールがあります。おそらく、そのシステム コールの実装に従うか、単にコードから直接呼び出す必要があります。を参照してくださいmm/protect.c

于 2012-08-17T04:47:52.957 に答える