windows - Spørgsmål om beskyttelse af hukommelsessiden

Indlæg af Hanne Mølgaard Plasc

Problem



Her er et andet spørgsmål, jeg mødte, da jeg læste < Windows via C/C ++ 5th Edition>. Lad os først se et citat.


LPVOID WINAPI VirtualAlloc(
  \_\_in\_opt  LPVOID lpAddress,
  \_\_in      SIZE\_T dwSize,
  \_\_in      DWORD fdwAllocationType,
  \_\_in      DWORD fdwProtect
);



  Den sidste parameter, fdwProtect,
  angiver beskyttelsesattributten
  der skal tildeles regionen.
   Den beskyttelsesattribut, der er knyttet til regionen, har ingen effekt på
  forpligtet lagerplads kortlagt til
  region.


  
   Når du reserverer en region, tildeler du den beskyttelsesattribut, der skal bruges
  oftest med oplagringen
  til regionen.
For eksempel, hvis du
  har til hensigt at begå fysisk opbevaring med
  en beskyttelsesattribut af
  PAGE\_READWRITE, du bør reservere
  region med PAGE\_READWRITE.
  systemets interne registrering
  opfører sig mere effektivt, når
  regionens beskyttelses attribut attributter
  den forpligtede opbevaring s beskyttelse
  attribut.


  
  (Når du laver opbevaring) ... du normalt
  Pass den samme sidebeskyttelse
  attribut, der blev brugt, når
  VirtualAlloc blev kaldt for at reservere
  region, selvom du kan angive en
  anden beskyttelsesattribut.




Ovennævnte citat forvirrede mig fuldstændig.



  • Hvis beskyttelsesattributten, der er knyttet til regionen, ikke har nogen virkning på det forpligtede lager, hvorfor har vi brug for det?

  • Da det anbefales at bruge den samme beskyttelsesattribut til både at reservere og begå, hvorfor tilbyder Windows os stadig mulighed for at bruge en anden attribut? Er det ikke misforstående og slags paradoks?

  • Hvor præcist er beskyttelsesattributten gemt for reserveret område og forpligtet lager , repektivt?



Mange tak for dine indsigter.

Bedste reference


Det er vigtigt at læse det i sammenhæng.



  Den beskyttede attribut tilhørende
  med regionen har ingen effekt på
  forpligtet lagerplads kortlagt til
  område.



henviste til reservering , ikke begå regioner.


En reserveret side har ingen backing-butik, så det er altid konsekvent PAGE\_NOACCESS, uanset hvad du overfører til VirtualAlloc. Dvs. hvis en tråd forsøger at læse/skrive til en adresse i en reserveret region, hæves en adgangsfejl. [3]


Fra linket artikel:



  Reserverede adresser er altid
  PAGE\_NOACCESS, en standard håndhæves af
  systemet er ligegyldigt hvad værdien er
  passeret til funktionen. Engageret
  sider kan enten være skrivebeskyttet,
  læs-skrive eller ikke-adgang.



Re:



  

      
  • Hvor præcis er beskyttelsen
      attributten gemt for reserveret område
      og forpligtet opbevaring, repektivt?

  •   



Beskyttelsesattributterne for virtuelle adressegrupper gemmes i VAD-træet, pr. Proces. (VAD == Virtual Address Descriptor, se Windows Internals, eller linket artikel)



  Da det anbefales at bruge den samme beskyttelsesattribut til både at reservere og begå, hvorfor tilbyder Windows os stadig mulighed for at bruge anden attribut? Er det ikke misforstående og slags paradoks?



Fordi funktionen altid accepterer en beskyttelsesparameter, men dens adfærd afhænger af fdwAllocationType. Beskyttelse er kun fornuftig for begået opbevaring.


Grunden til, at Richter foreslår at bruge den samme beskyttelsesindstilling, er sandsynligvis fordi færre ændringer i beskyttelsesflaggene i en region betyder færre 'blokke' (se din bog til definition) og dermed et mindre AVL-træ for VAD'erne. Dvs. Hvis alle sider i en region er begået med samme flag, er der kun 1 blok. Ellers kan der være så mange blokke som sider i regionen. Og du har brug for en VAD for hver blok (ikke side).


Blok== sæt af sammenhængende sider med identisk beskyttelse/tilstand.



  Hvis beskyttelsesattributten er tilknyttet
  med regionen har ingen effekt på
  forpligtet opbevaring, hvorfor har vi brug for det?



Som ovenfor.

Andre referencer 1


Nå ... En grund kunne være, så du kunne bruge vagt sider, så du kan begå hukommelse, som du bruger den.


Tænk på trådstakken i Windows; Siden umiddelbart under stakken er indstillet som en beskyttelsesside, typisk med læse- og skriveevne. Når vagtsiden er rørt, kører en undtagelseshåndterer og forpligter vagtsiden og gør den næste side til en vagt.


Se her for en bedre beskrivelse. Også dette link er en del af en serie om, hvordan Windows håndterer lavt niveau ressourcer og er ret god læsning. [5]


En anden grund til at tillade dig at respektere beskyttelsesattributterne kunne være til kopiering på skriveteknikker. Sider er indstillet til at læses, indtil de 'ændres', hvilket kan give anledning til en undtagelse, du kan håndtere osv. Osv. Osv.


På 386-familien af ​​Intel-chips gemmes commit-, read/write/reserve-flagene i sidetabellerne. Se nærmere på en 386-chip reference for flere detaljer.
Rediger: Jeg slog rundt for lidt og kunne ikke finde, hvor MS gemmer PAGE\_GUARD-bit. Nu er jeg nysgerrig, hvor jeg så den. :) For ondt kastede jeg omkring 500 pund gammelt referencemateriale i foråret ... [6]


Håber dette hjælper :)