特定のプロセスのメモリにアクセスできるカーネルモジュールを作成しています。私はいくつかのユーザースペースメモリで匿名マッピングを行いました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_WRITE
mprotect
領域のマッピングを解除し、正しい保護を使用して再マッピングしようとしましたが、メモリブロックがゼロになり、書き込んだデータがすべて消去されました。設定MAP_UNINITIALIZED
はそれを修正するかもしれませんが、manページから:
MAP_UNINITIALIZED(Linux 2.6.33以降)
匿名ページをクリアしないでください。このフラグは、組み込みデバイスのパフォーマンスを向上させることを目的としています。このフラグは、カーネルがCONFIG_MMAP_ALLOW_UNINITIALIZEDオプションで構成されている場合にのみ適用されます。セキュリティへの影響があるため、このオプションは通常、組み込みデバイス(つまり、ユーザーメモリの内容を完全に制御できるデバイス)でのみ有効になります。
だから、それは私が望むことをするかもしれないが、それはあまり移植性がないだろう。私が提案したことを達成するための標準的な方法はありますか?