Auslagerung von Treibern
Standardmäßig weist der Linker den Code- und Datenabschnitten einer Treiberimagedatei Namen wie ".text" und ".data" zu. Wenn der Treiber geladen wird, werden diese Abschnitte vom E/A-Manager nicht ausgelagert. Ein nicht ausseitiger Abschnitt ist immer speicherresident.
Ein Treiberentwickler hat die Möglichkeit, bestimmte Teile eines Treibers auslagern zu lassen, damit Windows diese Teile in die Auslagerungsdatei verschieben kann, wenn sie nicht verwendet werden. Damit ein Code- oder Datenabschnitt ausgelagert werden kann, weist der Treiberentwickler dem Abschnitt einen Namen zu, der mit "PAGE" beginnt. Der E/A-Manager überprüft die Namen der Abschnitte, wenn er einen Treiber lädt. Wenn ein Abschnittsname mit "PAGE" beginnt, macht der E/A-Manager den Abschnitt auslagerungsfähig.
Code, der unter IRQL >= DISPATCH_LEVEL ausgeführt wird, muss speicherresident sein. Das heißt, dieser Code muss sich entweder in einem nicht ausgelagerten Segment oder in einem auslagerungsfähigen Segment befinden, das im Arbeitsspeicher gesperrt ist. Wenn Code, der unter IRQL >= DISPATCH_LEVEL ausgeführt wird, einen Seitenfehler verursacht, wird eine Fehlerüberprüfung durchgeführt. Treiber können das makro PAGED_CODE verwenden, um zu überprüfen, ob ausgelagerte Funktionen nur bei entsprechenden IRQLs aufgerufen werden.
Wenn ein Code- oder Datenabschnitt ausgelagert werden kann, kann der Treiber den Abschnitt im Arbeitsspeicher sperren, indem er die Routine MmLockPagableCodeSection oder MmLockPagableDataSection aufruft. Der Abschnitt bleibt gesperrt, bis der Treiber die MmUnlockPagableImageSection-Routine aufruft , um sie zu entsperren. Während der auslagerungsfähige Abschnitt gesperrt ist, verhält er sich genauso wie ein nicht ausgelagerter Abschnitt.
Informationen zum Zuweisen von Namen zu Code- und Datenabschnitten finden Sie unter MmLockPagableCodeSection und MmLockPagableDataSection.
Dieser Abschnitt schließt folgende Themen ein: