の相互作用フォークユーザ空間のメモリマップドのカーネル
-
27-09-2019 - |
質問
を考えるLinuxドライバを使用する get_user_pages
( get_page
)プページからの呼び出します。の住所のページは渡されたハードウェア装置です。両方のプロセスとデバイスの読み書きのページで当事者が決めるのです。特に、コミュニケーションのページ以降のシステムコールが電話 get_user_pages
に戻ります。システムコールを有効の設定 共有メモリ帯の間にハードウェアデバイス.
私が懸念されなかった場合はどうなプロセス fork
なりますので注意してください(さらに別のスレッドが起こるのからの使用を許可する通話 get_user_pages
進行以降)です。特に、場合には、親ノートに書きとめ共有メモリをフォークは何か、知ってるとき、背後の物理アドレスと思われる変更によりcopy-on-write)からですか?私は理解していきたい:
- どのカーネルのニーズにいけるマナー違反できてしまい、いを 安全保障 穴!);
何の制限のプロセスに従うように 機能 当社のドライバが正常に動作(の物理メモリにはマップで住所と同一のものは、親プロセス).
- 理想的にしていきたいと思います普通の子プロセスを使用しないドライバーが全くでしょう話
exec
ほとんどすぐ)。 - 理想的には、親プロセスのないものは、特段の割り当て時に記憶しておりますので、既存のコードとスタックに割り当てるバッファのドライバーです。
- 私が認識し
madvise
とMADV_DONTFORK
, でもok、メモリが消えて子プロセススペースで適用されないスタックに割り当てバッファです。 - "なフォークを接続で活躍す当社のドライバー"もんだな、最後の手段として、まるならポイント1を満足しています。
- 理想的にしていきたいと思います普通の子プロセスを使用しないドライバーが全くでしょう話
うさこの文書をソースコード。また特に Linuxデバイスドライバ, だからこの問題対処を行いました。Rtfs領域にも適応に関連する部分のカーネルのソースはビットに圧倒されます。
のカーネルバージョンは完全に固定が最近の一つ(たとえば≥2.6.26).今だけに的を絞ったアームプラットフォーム(シングルプロセッサでもマルチコアには丸いコーナー)の場合。
解決
fork()
はget_user_pages()
に干渉しません:get_user_pages()
はstruct page
を提供します。
アクセスする前に、ジェネラコダイスタグコードを作成する必要があります。このマッピングは、ユーザースペースではなくカーネルスペースで行われます。
編集:kmap()
はページテーブルにアクセスしますが、これについて心配する必要はありません(ページがユーザースペースにマップされていることを確認するだけです)。問題が発生した場合は-EFAULTを返します。
fork()を実行すると、コピーオンライトが実行されるまで、子はそのページを見ることができます。 コピーオンライトが実行されると(子/ドライバー/親がユーザースペースマッピングを介してページに書き込んだため、ドライバーが持っているカーネルkmap()ではないため)、そのページは共有されなくなります。 (ドライバーコード内の)ページでkmap()を保持している場合、親ページを保持しているのか子ページを保持しているのかを知ることはできません。
1)execve()を実行すると、すべてがなくなるため、セキュリティホールではありません。
2)fork()を実行するときは、両方のプロセスを同一にする必要があります(これはフォークです!!)。あなたのデザインは、親と子の両方がドライバーにアクセスできるようにするべきだと思います。 Execve()はすべてをフラッシュします。
ユーザースペースに次のような機能を追加するのはどうですか? ジェネラコディセタグプレ
デバイスでmmap()が呼び出されると、特別なフラグを使用してメモリマッピングをインストールします。 http://os1a.cs.columbia.edu/lxr /source/include/linux/mm.h#071
次のような興味深いものがあります: ジェネラコディセタグプレ
VM_SHAREDは、書き込み時にコピーを無効にします VM_LOCKEDは、そのページでのスワッピングを無効にします VM_DONTCOPYは、フォーク上のvma領域をコピーしないようにカーネルに指示しますが、それは良い考えではないと思います
他のヒント
その答えは madvise(addr, len, MADV_DONTFORK)
任意のバッファを使いただきごドライバーです。これはカーネルのマッピングはコピー親から子供はありません。
の欠点はその子供を継承しないマッピングでその住所、ご希望の場合は子どもがその使用を開始し、ドライバで必要なものをremapる。その良い管理.
更新:バッファのスタックは問題があり、なんなのかいなかったということではないかに安全です。
できないマークで DONTFORK
, なお子さんが走るスタックのページでフォーク、悪いような)いられることもありますが、関数の戻り値は後に付きのスタックページです。いても試されることで、楽しくお客様のスタックDONTFORK、悪を行うときにフォーク).
その他のような牛は共通のマッピングができな地図に表示すスタックを共有です。
すリスク牛の場合forkします。場合においても子ども"ただの"execsでもタッチスタックのページの原因となる牛の親会社が異なるページが表示されます。
の軽微な点にあるコードを使用したスタックバッファのみ安心してコードで分岐する計画です。使用できません、スタックバッファの後、機能が返されます。うにするために必要な監査calleesればなフォークのい安全なものとする困難は、脆弱な場合のコードも変わります。
と思いきたいすべてのメモリに与えられるドライバーからカスタムアロケータに使うこと.べきではないこと。のアロケータで mmap
デバイスに直接、その他の回答が、匿名で利用 mmap
, madvise(DONTFORK)
, しょう mlock()
を避けるスワップです。