#pragma alloc_text(page)コードはページアリードされていません
-
28-09-2019 - |
質問
WinXP 32ビットのDDK(非常に古いバージョン:3590)の(可能な)問題に直面しています。私のドライバーには、不定化されていないいくつかの静的変数(.bssセクションに割り当てる必要があります)と、ページ可能なコードセクション(#pragma alloc_page(page、func)でマークされた)にいくつかの関数が含まれています。ページ可能なコードは、別のオブジェクトファイルに収集されます。リンカーは、カーネルアドレス空間内の同じページにstaticsとページ可能なコードを割り当てているように見えることを発見しました(つまり、変数は0xeffcb0a0で、関数は0xeffcb600で、Windbgで検証されています)。静的変数は割り込み環境で使用されるため、ページをメモリにロックする必要があります。しかし、同じページに交換可能なコードが含まれている場合、変数が突然消える可能性があるのではないかと心配しています。リンカーのマップは、ページ可能なコードが別のセクション(「ページ」)にあることを正しく報告していますが、オフセット(「RVA+ベース」)は静的を含むページの中央にあります。
リンカー/ローダーにページ可能なコードに個別のページを割り当てるように強制するにはどうすればよいですか?セクションアライメント補助を強制する「#pragma」はありますか?私は何か間違ったことをしていますか?
PS:ドライバーローダーは、ページをページの両方の変数とコードをページングプールから削減するほどスマートであることは確かにスマートですが、ページには変数が含まれているため、書く必要があります。実行可能なコードは読み取り専用ページにあることを望みます。カーネルモードでの間違った配列アクセスはまだデバッグが非常に困難です...
PPS:私の機能の前後に4096 "nop"を追加しました...わかりました、それはうまくいきます...提案することは何もありませんか?
解決
グローバルを独自のデータセグメントに配置します。
#pragma data_seg("NONPAGE")
// declare your globals here
#pragma data_seg()
ソース: data_segのmsdnリンク
デフォルトでは、セクションはページングされたフラグではなく、読み取り/書き込みで作成されます。
追加のセクションオプションを指定できます。
#pragma comment(linker, "/section:NONPAGE,ERW")
ソース: /セクションのmsdnリンク
または、リンカーオプションをに配置できます SOURCES
ファイル:
LINKER_FLAGS = $(LINKER_FLAGS) /SECTION:NONPAGE,ERW
注:ライブラリを構築している場合は、使用してください LIBRARIAN_FLAGS
代わりは