質問

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 代わりは

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top