1

WinXP 32 ビットの DDK (かなり古いバージョン: 3590) で (可能性のある) 問題に直面しています。私のドライバーには、初期化されていないいくつかの静的変数 (.bss セクションに割り当てられるべきだと思います) と、ページング可能なコード セクション (#pragma alloc_page(PAGE, func) でマークされている) 内のいくつかの関数が含まれています。ページング可能なコードは、別のオブジェクト ファイルに収集されます。リンカがスタティック コードとページング可能なコードをカーネル アドレス空間の同じページに割り当てているように見えることを発見しました (つまり、変数は 0xEFFCB0A0 にあり、関数は 0xEFFCB600 にあります - windbg で検証済み)。静的変数は割り込み環境で使用されるため、それらのページはメモリ内でロックする必要があります。しかし、同じページにスワップ可能なコードが含まれている場合、変数が突然消えるのではないかと心配しています。リンカー」

リンカー/ローダーにページング可能なコードに別のページを割り当てるように強制するにはどうすればよいですか? セクションの配置属性を強制する「#pragma」はありますか? 私は何か間違ったことをしていますか?

PS: ドライバー ローダーは、変数とコードの両方を含むページをページ プールから除外するのに十分スマートですが、ページには変数が含まれているため、書き込み可能である必要があります。実行可能コードが読み取り専用ページにあることを望みます。カーネル モードでの間違った配列アクセスは、デバッグが非常に困難です...

PPS: 関数の前後に 4096 の "nop" を追加しました... OK、動作します... 提案するより良いものはありませんか?

4

1 に答える 1

1

グローバルを独自のデータ セグメントに配置します。

#pragma data_seg("NONPAGE")
// declare your globals here
#pragma data_seg()

ソース: data_seg の MSDN リンク

デフォルトでは、ページフラグではなく、読み取り/書き込みでセクションが作成されます。

追加のセクション オプションを指定できます。

#pragma comment(linker, "/section:NONPAGE,ERW")

ソース: /SECTION の MSDN リンク

または、リンカー オプションをSOURCESファイルに配置することもできます。

LINKER_FLAGS = $(LINKER_FLAGS) /SECTION:NONPAGE,ERW

注: ライブラリを構築している場合は、LIBRARIAN_FLAGS代わりに

于 2013-06-16T07:42:51.267 に答える