주 콘텐츠로 건너뛰기

 none
KernelModeとUserMode間のメモリ共有について RRS feed

  • 질문

  • 結果的には、工夫して動かしているのでそれほど困っている問題ではないのですが、KernelModeで確保しているメモリをUserModeの空間へマップする方法についての疑問です。


    このページに書いてある「MmMapLockedPages による方法」についてなのですが、この方法には下記のような制約があります。

    http://support.microsoft.com/kb/191840/ja

    >しかし、バッファをユーザアドレス空間にマップする最後のステップは、呼び出し側プロセスのコンテキスト
    >で動作しているルーチン (一般的にはモノリシックドライバのディスパッチルーチン) の中で行わなければなりません。

    自分の作っているドライバはDeviceIoControlを処理するIRPキュー(CSQ)とその処理スレッドで構成されているので、可能であればこの流れに乗せて処理をしたいのですが、そうすると処理スレッドの中では呼び出し側プロセスのコンテキストではないためマップすることができません。

    仕方ないので工夫して、ディスパッチルーチンと処理スレッドとでイベントで同期を取ることで、UserMode空間へのマップとIRPキューによるIRP処理のシリアライズとを両立しています。しかし、あくまで処理が完了するまでディスパッチルーチンがリターンしないことになるため、アプリ見えにはオーバーラップ処理ができていないことになります。どうしてもであれば、セクションを使う手段もありますが。。

    できれば前者のように自然な処理の流れに乗せたいので、例えばプロセスを特定できればマップできるはずですから、MmMapLockedPages()ルーチンに引数でプロセスID等を指定できるようにすればよいのでは・・?と思うのですが何故そうなっていないのでしょうか。「仕様」として受け取るしかないでしょうか。

    ちなみに、実際にはMmMapLockedPagesSpecifyCache()ルーチンを使っています。

    また、Windows Internals はまだ読んだことがないです。恐縮です


    開発ブログ http://d.hatena.ne.jp/sea-show/searchdiary?word=*[Develop]
    • 이동됨 Mike Wang (MSCS) 2012년 10월 2일 화요일 오후 12:36 (移動元:Windows デバイスドライバー開発)
    2010년 4월 7일 수요일 오후 4:08

답변

  • >できれば前者のように自然な処理の流れに乗せたいので、例えばプロセスを特定できればマップできるはずですから、
    >MmMapLockedPages()ルーチンに引数でプロセスID等を指定できるようにすればよいのでは・・?と思うのですが何故そうなっていないのでしょうか。
    >「仕様」として受け取るしかないでしょうか。

    結局のところ、ユーザプロセス アドレス空間へのメモリ マップは、そのプロセスのコンテキストで行う必要があるから...ということがすべてではないでしょうか?
    たとえ呼び出しプロセスを特定できたとしても、他のプロセスから「自分以外の」プロセスのアドレス空間を勝手に操作することはできないと思います。
    なので、仮に MmMapLockedPages() ルーチンの引数でプロセス ID 等を指定できたとしても、メモリのマップ処理は呼び出し側プロセスのコンテキストに
    戻って行う必要がある...
    で、結局先の制限につながる...と言うことで、私は「仕様」として納得することにしてます。

    • 답변으로 표시됨 sea_show 2010년 4월 8일 목요일 오후 5:56
    2010년 4월 8일 목요일 오전 4:33

모든 응답

  • >できれば前者のように自然な処理の流れに乗せたいので、例えばプロセスを特定できればマップできるはずですから、
    >MmMapLockedPages()ルーチンに引数でプロセスID等を指定できるようにすればよいのでは・・?と思うのですが何故そうなっていないのでしょうか。
    >「仕様」として受け取るしかないでしょうか。

    結局のところ、ユーザプロセス アドレス空間へのメモリ マップは、そのプロセスのコンテキストで行う必要があるから...ということがすべてではないでしょうか?
    たとえ呼び出しプロセスを特定できたとしても、他のプロセスから「自分以外の」プロセスのアドレス空間を勝手に操作することはできないと思います。
    なので、仮に MmMapLockedPages() ルーチンの引数でプロセス ID 等を指定できたとしても、メモリのマップ処理は呼び出し側プロセスのコンテキストに
    戻って行う必要がある...
    で、結局先の制限につながる...と言うことで、私は「仕様」として納得することにしてます。

    • 답변으로 표시됨 sea_show 2010년 4월 8일 목요일 오후 5:56
    2010년 4월 8일 목요일 오전 4:33
  • 使い勝手が悪い事この上ないのですが、どうにか工夫するしかないですよね・・。他プロセスのコンテキストから操作する、というのもセキュリティ上の観点とかでダメなんでしょうかね。

    思えば、「前処理をするIoControl(MDLを作るとか色々)」と、「作ったMDLをMmMapLockecPages()を呼んでマップする"だけ"のIoControl」という風に2つに分けるっていう方法もありますよね。どうにか工夫してやりくりしてね、ということですかね

     

     

     


    開発ブログ http://d.hatena.ne.jp/sea-show/searchdiary?word=*[Develop]
    2010년 4월 8일 목요일 오후 5:55