Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
De flesta felsökningskommandon använder virtuella adresser, inte fysiska adresser, som indata och utdata. Det finns dock tillfällen då det kan vara användbart att ha den fysiska adressen.
Det finns två sätt att konvertera en virtuell adress till en fysisk adress: med hjälp av tillägget !vtop och med hjälp av !pte-tillägget .
En översikt över virtuella adresser i Windows finns i Virtuella adressutrymmen.
Adresskonvertering med hjälp av !vtop
Anta att du felsöker en måldator där MyApp.exe processen körs och du vill undersöka den virtuella adressen 0x0012F980. Här är den procedur som du använder med tillägget !vtop för att fastställa motsvarande fysiska adress.
Konvertera en virtuell adress till en fysisk adress med hjälp av !vtop
Kontrollera att du arbetar i hexadecimalt. Om det behövs anger du den aktuella basen med kommandot N 16 .
Fastställa byteindexet för adressen. Det här talet är lika med de lägsta 12 bitarna av den virtuella adressen. Därför har den virtuella adressen 0x0012F980 ett byteindex på 0x980.
Fastställa katalogbasen för adressen med hjälp av !processtillägget :
kd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** .... PROCESS ff779190 SessionId: 0 Cid: 04fc Peb: 7ffdf000 ParentCid: 0394 DirBase: 098fd000 ObjectTable: e1646b30 TableSize: 8. Image: MyApp.exeFastställ sidramsnumret för katalogbasen. Det här är helt enkelt katalogbasen utan de tre avslutande hexadecimala nollorna. I det här exemplet är katalogbasen 0x098FD000, så sidramsnumret är 0x098FD.
Använd !vtop-tillägget . Den första parametern i det här tillägget ska vara sidramsnumret. Den andra parametern för !vtop ska vara den virtuella adressen i fråga:
kd> !vtop 98fd 12f980 Pdi 0 Pti 12f 0012f980 09de9000 pfn(09de9)Det andra talet som visas på den sista raden är den fysiska adressen i början av den fysiska sidan.
Lägg till byteindexet i början av sidan: 0x09DE9000 + 0x980 = 0x09DE9980. Det här är den önskade fysiska adressen.
Du kan kontrollera att den här beräkningen har gjorts korrekt genom att visa minnet på varje adress. Filnamnstillägget !d\* visar minne på en angiven fysisk adress:
kd> !dc 9de9980
# 9de9980 6d206e49 726f6d65 00120079 0012f9f4 In memory.......
# 9de9990 0012f9f8 77e57119 77e8e618 ffffffff .....q.w...w....
# 9de99a0 77e727e0 77f6f13e 77f747e0 ffffffff .'.w>..w.G.w....
# 9de99b0 .....
Kommandot d* (Visningsminne) använder en virtuell adress som argument:
kd> dc 12f980
0012f980  6d206e49 726f6d65 00120079 0012f9f4  In memory.......
0012f990  0012f9f8 77e57119 77e8e618 ffffffff  .....q.w...w....
0012f9a0  77e727e0 77f6f13e 77f747e0 ffffffff  .'.w>..w.G.w....
0012f9b0  .....
Eftersom resultatet är detsamma anger detta att den fysiska adressen 0x09DE9980 verkligen motsvarar den virtuella adressen 0x0012F980.
Adresskonvertering med hjälp av !pte
Anta återigen att du undersöker den virtuella adressen 0x0012F980 som tillhör MyApp.exe processen. Här är den procedur som du använder med !pte-tillägget för att fastställa motsvarande fysiska adress:
Konvertera en virtuell adress till en fysisk adress med hjälp av !pte
Kontrollera att du arbetar i hexadecimalt. Om det behövs anger du den aktuella basen med kommandot N 16 .
Fastställa byteindexet för adressen. Det här talet är lika med de lägsta 12 bitarna av den virtuella adressen. Därför har den virtuella adressen 0x0012F980 ett byteindex på 0x980.
Ange processkontexten till önskad process:
kd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** .... PROCESS ff779190 SessionId: 0 Cid: 04fc Peb: 7ffdf000 ParentCid: 0394 DirBase: 098fd000 ObjectTable: e1646b30 TableSize: 8. Image: MyApp.exe kd> .process /p ff779190 Implicit process is now ff779190 .cache forcedecodeuser doneAnvänd !pte-tillägget med den virtuella adressen som argument. Detta visar information i två kolumner. Den vänstra kolumnen beskriver sidkatalogposten (PDE) för den här adressen. den högra kolumnen beskriver dess sidtabellpost (PTE):
kd> !pte 12f980 VA 0012f980 PDE at C0300000 PTE at C00004BC contains 0BA58067 contains 09DE9067 pfn ba58 ---DA--UWV pfn 9de9 ---DA--UWVTitta på den sista raden i den högra kolumnen. Notationen "pfn 9de9" visas. Talet 0x9DE9 är sidramsnumret (PFN) för denna PTE. Multiplicera sidramsnumret med 0x1000 (till exempel flytta det till vänster 12 bitar). Resultatet, 0x09DE9000, är den fysiska adressen i början av sidan.
Lägg till byteindexet i början av sidan: 0x09DE9000 + 0x980 = 0x09DE9980. Det här är den önskade fysiska adressen.
Det här är samma resultat som den tidigare metoden.
Konvertera adresser för hand
Även om filnamnstilläggen !ptov och pte är det snabbaste sättet att konvertera virtuella adresser till fysiska adresser, kan den här konverteringen också göras manuellt. En beskrivning av den här processen belyser några av detaljerna i arkitekturen för virtuellt minne.
Minnesstrukturerna varierar i storlek, beroende på processorn och maskinvarukonfigurationen. Det här exemplet är hämtat från ett x86-system som inte har PAE (Physical Address Extension) aktiverat.
Med 0x0012F980 igen som den virtuella adressen måste du först konvertera den till binär, antingen för hand eller med kommandot .format (Visa talformat ):
kd> .formats 12f980
Evaluate expression:
  Hex:     0012f980
  Decimal: 1243520
  Octal:   00004574600
  Binary:  00000000 00010010 11111001 10000000
  Chars:   ....
  Time:    Thu Jan 15 01:25:20 1970
  Float:   low 1.74254e-039 high 0
  Double:  6.14381e-318
Den här virtuella adressen är en kombination av tre fält. Bits 0 till 11 är byteindexet. Bits 12 till 21 är sidtabellindexet. Bits 22 till 31 är sidkatalogindexet. Om du separerar fälten har du:
0x0012F980  =  0y  00000000 00   010010 1111   1001 10000000
Detta exponerar de tre delarna av den virtuella adressen:
Sidkatalogindex = 0y0000000000 = 0x0
Sidtabellindex = 0y0100101111 = 0x12F
Byte index = 0y100110000000 = 0x980
Sedan behöver du ytterligare tre informationsdelar för systemet.
Storleken på varje PTE. Det här är 4 byte på icke-PAE x86-system.
Storleken på en sida. Det här är 0x1000 byte.
Den virtuella PTE_BASE-adressen. I ett icke-PAE-system är detta 0xC0000000.
Med hjälp av dessa data kan du beräkna adressen för själva PTE:t:
PTE address   =   PTE_BASE  
                + (page directory index) * PAGE_SIZE
                + (page table index) * sizeof(MMPTE)
              =   0xc0000000
                + 0x0   * 0x1000
                + 0x12F * 4
              =   0xC00004BC
Det här är PTE-adressen. PTE är en 32-bitars DWORD. Granska innehållet:
kd> dd 0xc00004bc L1
c00004bc  09de9067
Denna PTE har värdet 0x09DE9067. Den består av två fält:
De låga 12 bitarna av PTE är statusflaggor. I det här fallet är dessa flaggor lika med 0x067 – eller i binärt, 0y00001100111. På referenssidan !pte finns en förklaring av statusflaggor.
De 20 högsta bitarna av PTE motsvarar PTE:s sidramsnummer (PFN). I det här fallet är PFN 0x09DE9.
Den första fysiska adressen på den fysiska sidan är PFN multipliceras med 0x1000 (skiftat vänster med 12 bitar). Byteindexet är förskjutningen på den här sidan. Den fysiska adress som du letar efter är därför 0x09DE9000 + 0x980 = 0x09DE9980. Detta är samma resultat som erhålls av de tidigare metoderna.