Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Bizonyos kernelmódú illesztőprogramoknak, például a soros és párhuzamos illesztőprogramoknak nem kell memória-rezidensnek lenniük, kivéve, ha az általuk kezelt eszközök nyitva vannak. Mindaddig azonban, amíg aktív kapcsolat vagy port van, a portot kezelő illesztőprogram-kód egy részének rezidensnek kell lennie az eszköz szervizeléséhez. Ha nem használja a portot vagy a kapcsolatot, az illesztőprogram kódja nem szükséges. Ezzel szemben a rendszerkódot, alkalmazáskódot vagy lapozófájlt tartalmazó lemez illesztőprogramjának mindig memória-rezidensnek kell lennie, mivel az illesztőprogram folyamatosan adatokat továbbít az eszköz és a rendszer között.
A szórványosan használt eszközök (például modemek) illesztőprogramjai szabadíthatják fel a rendszerteret, ha a felügyelt eszköz nem aktív. Ha egyetlen szakaszban helyezi el az aktív eszköz szervizeléséhez szükséges kódot, és ha az illesztőprogram az eszköz használata közben zárolja a kódot a memóriában, ezt a szakaszt kijelölheti lapozhatóként. Az illesztőprogram eszközének megnyitásakor az operációs rendszer a lapozható szakaszt a memóriába helyezi, és az illesztőprogram addig zárolja, amíg már nincs rá szükség.
A rendszer CD-hangillesztő kódja ezt a technikát használja. Az illesztőprogram kódja a CD-eszköz gyártójának megfelelően lapozható szakaszokba van csoportosítva. Előfordulhat, hogy bizonyos márkák soha nem lesznek jelen egy adott rendszeren. Emellett, még ha egy CD-ROM is létezik egy rendszeren, előfordulhat, hogy ritkán érhető el, ezért a kód CD-típus szerinti lapozható szakaszokba való csoportosítása gondoskodik arról, hogy az adott számítógépen nem létező eszközök kódja soha ne legyen betöltve. Az eszköz elérésekor azonban a rendszer betölti a megfelelő CD-eszköz kódját. Then the driver calls the MmLockPagableCodeSection routine, as described later in this article, to lock its code into memory while its device is being used.
Ha el szeretné különíteni a lapozható kódot egy elnevezett szakaszba, jelölje meg a következő fordító irányelvvel:
#pragma alloc_text(PAGE*Xxx***, *RoutineName***)
The name of a pageable code section must start with the four letters "PAGE" and can be followed by up to four characters (represented here as Xxx) to uniquely identify the section. A szakasznév első négy betűjének (azaz "OLDAL") nagybetűsnek kell lennie. The RoutineName identifies an entry point to be included in the pageable section.
Az illesztőfájl lapozható kódszakaszának legrövidebb érvényes neve egyszerűen PAGE. Az alábbi kód példában szereplő pragma direktíva például egy PAGE nevű lapozható kódszakasz belépési pontjaként azonosítja a RdrCreateConnection.
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RdrCreateConnection)
#endif
MmLockPagableCodeSection locks in the whole contents of the section that contains the routine referenced in the call. In other words, this call makes every routine associated with the same PAGEXxx identifier resident and locked in memory. In other words, this call makes every routine associated with the same PAGEXxx identifier resident and locked in memory.
MmLockPagableCodeSection returns a handle to be used when unlocking the section (by calling the MmUnlockPagableImageSection routine) or when the driver must lock the section from additional locations in its code.
Az illesztőprogramok a ritkán használt adatokat lapozhatóként is kezelhetik, így azok is lapozhatók, amíg a támogatott eszköz aktív nem lesz. A rendszerkeverő illesztőprogramja például lapozható adatokat használ. A keverőeszközhöz nincs aszinkron I/O társítva, így az illesztőprogram lapozhatóvá teheti az adatait.
A lapozható adatszakasz nevének a "PAGE" négy betűvel kell kezdődnie, és legfeljebb négy karakterből állhat a szakasz egyedi azonosításához. A szakasznév első négy betűjének (azaz "OLDAL") nagybetűsnek kell lennie.
Kerülje az azonos nevek hozzárendelését a kód- és adatszakaszokhoz. A forráskód olvashatóbbá tétele érdekében az illesztőprogram-fejlesztők általában a PAGE nevet rendelik a lapozható kódszakaszhoz, mivel ez a név rövid, és számos alloc_text pragma-irányelvben megjelenhet. Ezután a rendszer hosszabb neveket rendel hozzá minden olyan lapozható adatszakaszhoz (például a PAGEDATA data_seg, a PAGEBSS for bss_seg stb.), amelyekre az illesztőprogramnak szüksége lehet.
Az alábbi példakód első két pragma-irányelve például két lapozható adatszakaszt határoz meg, a PAGEDATA-t és a PAGEBSS-t. A PAGEDATA a data_seg pragma-irányelvvel deklarálva van, és inicializált adatokat tartalmaz. A PAGEBSS deklarálása a bss_seg pragma direktívával történik, és nem inicializált adatokat tartalmaz.
#pragma data_seg("PAGEDATA")
#pragma bss_seg("PAGEBSS")
INT Variable1 = 1;
INT Variable2;
CHAR Array1[64*1024] = { 0 };
CHAR Array2[64*1024];
#pragma data_seg()
#pragma bss_seg()
Ebben a kód példában a Variable1 és a Array1 explicit módon inicializálódik, ezért a PAGEDATA szakaszba kerül.
Variable2 és Array2 automatikusan nullával vannak inicializálva, és a PAGEBSS szakaszban találhatók.
A globális változók implicit módon nullára történő inicializálása csökkenti a lemezen található végrehajtható fájl méretét, és előnyben részesítik az explicit nullára inicializálással szemben. Az explicit nulla inicializálást kerülni kell, kivéve azokat az eseteket, amikor egy változó egy adott adatszakaszban való elhelyezéséhez szükséges.
To make a data section memory-resident and lock it in memory, a driver calls MmLockPagableDataSection, passing a data item that appears in the pageable data section. MmLockPagableDataSection returns a handle to be used in subsequent locking or unlocking requests.
To restore a locked section's pageable status, call MmUnlockPagableImageSection, passing the handle value returned by MmLockPagableCodeSection or MmLockPagableDataSection, as appropriate. A driver's Unload routine must call MmUnlockPagableImageSection to release each handle it obtains for lockable code and data sections.
A szakaszok zárolása költséges művelet, mert a memóriakezelőnek a betöltött modullistájában kell keresnie, mielőtt a lapokat a memóriába zárolja. If a driver locks a section from many locations in its code, it should use the more efficient MmLockPagableSectionByHandle after its initial call to MmLockPagableXxxSection.
The handle passed to MmLockPagableSectionByHandle is the handle returned by the earlier call to MmLockPagableCodeSection or MmLockPagableDataSection.
The memory manager maintains a count for each section handle and increments this count every time that a driver calls MmLockPagableXxx for that section. A call to MmUnlockPagableImageSection decrements the count. Amíg bármely szakaszfogantyú számlálója nem nulla, az adott szakasz zárolva marad a memóriában.
Egy szakasz fogópontja mindaddig érvényes marad, amíg az illesztőprogram be van töltve. Therefore, a driver should call MmLockPagableXxxSection only one time. If the driver requires more locking calls, it should use MmLockPagableSectionByHandle.
Ha a szakasz a zárolási rutin meghívásakor ki van lapozva, a memóriakezelő visszalapozza a szakaszt, és a hivatkozásszámát egyre állítja. If the section is paged out when the lock routine is called, the memory manager pages in the section and sets its reference count to one.
Ezzel a technikával minimalizálható az illesztőprogram hatása a rendszererőforrásokra. Amikor az illesztőprogram fut, a memóriába zárolhatja a kódot és az adatokat, amelyeknek rezidensnek kell lenniük. Ha nincs függőben lévő I/O-kérés az eszközre vonatkozóan (vagyis amikor az eszköz bezárva van, vagy ha az eszközt soha nem nyitották meg), az illesztőprogram feloldhatja ugyanazt a kódot vagy adatot, így elérhetővé válik a lapozáshoz.
Azonban, miután egy illesztőprogram csatlakoztatja a megszakításokat, a megszakításfeldolgozás során meghívható illesztőprogram-kódnak mindig memória-rezidensnek kell lennie. Bár egyes eszközillesztők igény szerint lapozhatóvá vagy memóriába zárolhatóvá tehetők, az ilyen illesztőprogramok kódjának és adatainak bizonyos alapvető készletének véglegesen a rendszertérben kell lennie.
A kód- vagy adatszakaszok zárolásához tekintse meg az alábbi megvalósítási irányelveket.
The primary use of the Mm(Un)LockXxx routines is to enable normally nonpaged code or data to be made pageable and brought in as nonpaged code or data. Az olyan illesztőprogramok, mint a soros illesztőprogram és a párhuzamos illesztőprogram, jó példák: ha nincsenek nyitott fogópontok egy olyan eszközhöz, amelyet egy ilyen illesztőprogram kezel, akkor a kód egyes részeire nincs szükség, és továbbra is lapozhatók maradnak. Az átirányító és a kiszolgáló szintén jó példa az illesztőprogramokra, amelyek ezt a technikát használhatják. Ha nincsenek aktív kapcsolatok, mindkét összetevő kilapozható.
A teljes lapozható szakasz a memóriába van zárolva.
Az illesztőprogramonként egy szakasz a kódnak és egy szakasz az adatoknak hatékony. Sok elnevezett, lapozható szakasz általában nem hatékony.
Tartsa külön a tisztán lapozható szakaszokat és a lapozott, de igény szerinti zárolt szakaszokat.
Ezek a rutinok nagy I/O-aktivitást okozhatnak, amikor a memóriakezelő betölti a szakaszt. If a driver must lock a section from several locations in its code, it should use MmLockPagableSectionByHandle. If a driver must lock a section from several locations in its code, it should use MmLockPagableSectionByHandle.