Dela via


Specialpool

Funktionen Specialpool konfigurerar Windows för att begära minnesallokeringar från en reserverad minnespool när minnet allokeras med en angiven pooltagg eller ligger inom ett angivet storleksintervall.

Abbreviation

Spp

Hexadecimalt värde

(Ingen)

Symboliskt namn

(Ingen)

Destination

Systemomfattande registerpost

(Windows Vista och senare) Systemomfattande registerpost, kernelflagga

Välja en pooltagg

När du begär en särskild pool för en viss pooltagg kontrollerar du att drivrutinen eller något annat kernel-lägesprogram använder en unik pooltagg.

När du skapar en pooltagg (till exempel genom att använda ExAllocatePoolWithTag) bör du överväga att ange taggtecken i omvänd ordning. Om taggen till exempel är Fred kan du ange den som derF (0x64657246). Pooltaggar lagras i registret och visas i felsökningsprogrammet och andra verktyg i omvänd ordning (lägre endian). Om du anger dem i omvänd ordning visas de i framåtordning (0x46726564)

Om du misstänker att din drivrutin förbrukar all speciell pool kan du överväga att använda flera pooltaggar i din kod. Du kan sedan testa drivrutinen flera gånger och tilldela en särskild pool till en pooltagg i varje test.

Välj också en pooltagg med ett hexadecimalt värde som är större än systemets sidstorlek. För kernellägeskod, om du anger en pooltagg som har ett värde som är mindre än PAGE_SIZE, begär Gflags en särskild pool för alla allokeringar vars storlek ligger inom motsvarande intervall och begär särskild pool för allokeringar med en motsvarande pooltagg. Om du till exempel väljer en storlek på 30 används en särskild pool för alla allokeringar mellan 17 och 32 byte i storlek och för allokeringar med pooltaggen 0x0030.

Välja en allokeringsstorlek

Använd följande riktlinjer för att välja en allokeringsstorlek för funktionen Specialpool.

På en dator med en x86-processor är PAGE_SIZE 0x1000 och allokeringsstorleksintervallen är 8 byte långa. Om du vill konfigurera specialpoolfunktionen för alla allokeringar med storlekar i det här intervallet anger du ett tal som är lika med det maximala intervallet plus 8. (Det här talet är alltid en multipel av 8.) Följande tabell illustrerar dessa värden:

Storleksintervall Ange det här numret

1 till 8 byte

10 (decimal 16)

9 till 16 byte

18 (decimalt 24)

17 till 24 byte

20 (decimal 32)

...

...

0xFE9 till 0xFF0 byte

FF8 (decimal 4088)

På en dator med en AMD x86-64-processor är PAGE_SIZE 0x1000 och allokeringsstorleksintervallen är 16 byte långa. Om du vill konfigurera specialpoolfunktionen för alla allokeringar med storlekar i det här intervallet anger du ett tal som är lika med det maximala intervallet plus 16. (Det här talet är alltid en multipel av 16.) Följande tabell illustrerar dessa värden:

Storleksintervall Ange det här numret

1 till 16 byte

20 (decimal 32)

17 till 32 byte

30 (decimal 48)

33 till 48 byte

40 (decimal 64)

...

...

0xFD1 till 0xFE0 byte

FF0 (decimal 4080)

På en dator med valfri processor kan du använda en asterisk ( * ) eller 0x2A (decimal 42) för att konfigurera specialpoolfunktionen för alla minnesallokeringar i systemet.

kommentarer

Information om hur du konfigurerar specialpoolfunktionen i dialogrutan Globala flaggor finns i Konfigurera specialpool. Information om hur du konfigurerar funktionen Specialpool på kommandoraden finns i GFlags-kommandon. Ett exempel finns i Exempel 14: Konfigurera specialpool.

Funktionen Specialpool i Gflags instruerar Windows att begära minnesallokeringar från en reserverad minnespool när minnet allokeras med en angiven pooltagg eller ligger inom ett angivet storleksintervall. Begär en särskild pool för alla allokeringar från en specifik drivrutin med hjälp av Drivrutinsverifieraren. Mer information finns i avsnittet "Särskild pool" i avsnittet "Drivrutinsverifierare" i Windows Driver Kit (WDK).

De särskilda poolfunktionerna i Gflags och Drivrutinsverifieraren hjälper dig att identifiera och identifiera felkällan i kernelpoolens användning, till exempel att skriva utanför det allokerade minnesutrymmet eller referera till minne som redan har frigjorts.

Alla särskilda poolbegäranden uppfylls inte. Varje allokering från den särskilda poolen använder en sida icke-växlingsbart fysiskt minne och två sidor virtuellt adressutrymme. Om den särskilda poolen är slut allokeras minnet från standardpoolen tills den särskilda poolen blir tillgänglig igen. När en särskild poolbegäran fylls från standardpoolen returnerar den begärande funktionen en lyckad status. Det returnerar inte något fel eftersom allokeringen har slutförts, även om den inte har fyllts i från en särskild pool.

Storleken på den särskilda poolen ökar med mängden fysiskt minne i systemet. helst bör detta vara minst 1 Gigabyte (GB). På x86-datorer, eftersom virtuellt (utöver fysiskt) utrymme förbrukas, ska du inte använda startalternativet /3GB när du använder en särskild pool. Det är också en bra idé att öka antalet sidfiler med en faktor på två eller tre.

Du kan också konfigurera funktionen SpecialPool för att justera minnesallokeringen för att identifiera referenser till minne före allokeringen ("underkörningar") eller referenser till minne utanför allokeringen ("överskridningar"). Den här funktionen är endast tillgänglig i dialogrutan Globala flaggor i alla versioner av Windows. Mer information finns i Identifiera överskridanden och underkörningar.

I Windows Vista och senare versioner av Windows kan du konfigurera funktionen SpecialPool som en registerinställning som kräver en omstart, men som fortfarande gäller tills du ändrar den, eller som en inställning för kernelflagga som inte kräver en omstart, men som endast gäller tills du startar om eller stänger av Windows. I tidigare versioner av Windows är specialpool endast tillgänglig som en registerinställning.

I Windows Vista och senare versioner av Windows kan du konfigurera funktionen Specialpool antingen med hjälp av dialogrutan Globala flaggor eller på kommandoraden. I tidigare versioner av Windows är den här funktionen endast tillgänglig i dialogrutan Globala flaggor.