c # - Ændring af basispegeren for en proces

Indlæg af Hanne Mølgaard Plasc

Problem





Jeg har et mere teoretisk spørgsmål med peger og hukommelseallokering.

Lad os sige, at jeg for eksempel har en proces, der kører, og den har tildelt 2 byte fra 0x01 til 0x03.

Hvis jeg vil læse fra den hukommelse, vil jeg nok bruge ReadProcessMemory.

Men hvilken pointer skal jeg specifikt give?
Er det en relativ eller en absolut pointer?

Lad os sige, at denne peger er relativ, så jeg kalder ReadProcessMemory med en peger til 0x00.

Men hvordan ved Windows, hvor proceshukommelsen begynder, og hvor den slutter?

Er det ikke Windows, der skal gemme adressen til det punkt, hvor hukommelsen tilhører (eller blev allokeret af) en proces?
Men hvor gemmer Windows disse oplysninger, og hvordan kan den vide, hvor den gemte oplysningerne?
Jeg har hørt om noget, der hedder en 'base pointer'. Jeg formoder, at det er det, jeg leder efter.
Det sted hvor hukommelsen tilhører en proces.

OK, men nu siger jeg, at jeg vil kopiere hukommelsen til en proces et eller andet sted (HDD måske?) For at rydde min hukommelse lidt i. Så vil jeg lægge hukommelsen tilbage, hvor den var før, men jeg kan ikke fortælle windows 'alloker 2048 byte fra 0x00c til 0x80c'.
Jeg må sige 'allokere 2048 bytes somewhere' og derefter fortæller Windows, hvor det 'et sted' er.

Men hvis jeg genstarter min app igen, ville jeg nødt til at fortælle det 'hej proces, hele din hukommelse er ikke på 0x01 længere, den er nu på 0x0c'.
Er der nogen måde at klare dette på? Måske c # eller c + + eller bare en mening (igen er det et teoretisk spørgsmål. Ikke om det er godt eller dårligt, er det bare muligt?).

Bedste reference



  OK, men nu siger jeg, at jeg vil kopiere hukommelsen til en proces et eller andet sted (HDD måske?) For at rydde min hukommelse lidt i. Så vil jeg lægge hukommelsen tilbage, hvor den var før, men jeg kan ikke fortælle windows 'alloker 2048 byte fra 0x00c til 0x80c'.



Du skal blot tildele hukommelse selv. Windows er et virtuelt hukommelsessystem. Hvis det ikke kan passe tingene i den fysiske hukommelse, så vil den simpelthen sende hukommelsen tilbage til disken. Der er ikke brug for noget arbejde fra din side for at få det til at ske.


EDIT: I mere svar på kommentaren, hvis du faktisk fordeler hukommelsen, der bruges af den anden proces, er du helt uheldig. Der er ingen måde for dig at pålideligt bestemme, hvordan målprocessen bruger den hukommelse, og du vil sandsynligvis medføre øjeblikkelig opsigelse af målprocessen på grund af adgangsbrud.


Desuden går al hukommelseallokering på Windows NT og derivater ned til VirtualAlloc-funktionerne, som kun kan bruges inden for rammerne af opkaldsprocessen - du kan ikke tvinge den anden proces til at gøre det for dig.


Jeg formoder, at du kunne skrive dig selv en kernel-driver, som ville skrive tilfældigt affald i hukommelsesadministratoren, der ville få det til at gøre, hvad du vil, men på det rene minimum ville du medføre fejl i målprocessen og sandsynligvis fejl i hele systemet.


Men igen, dit spørgsmål er ikke fundamentalt fornuftigt, fordi Windows allerede træffer beslutninger som denne med hensyn til flytningsproces 'hukommelse ud til disk. Windows er et virtuelt hukommelsessystem, og en bestemt hukommelsesplacering giver kun mening i forbindelse med en eksisterende proces. [1]

Andre referencer 1


Nice spørgsmål. Her er nogle ting, der kan være interessante for dig ...


Til at begynde med kan du ikke fjerne nogen anden proces s hukommelse eller skrive den ud på disken. Dybest set kan du ikke se vores touch eller gøre noget med en anden proces s hukommelse. Men lad os sige, at du gjorde det på en eller anden måde, og nu vil du genoprette det ... du er bekymret for, at du ikke kan omfordele det på samme sted som før, så hvordan kan du finde ud af, hvor du kan allokere det og Hvordan fortæller du processen, hvor den er nu. Svaret er, at du ikke behøver at - du kan allokere det, hvor du vil, selvom en anden proces allerede bruger den adresse. (I betragtning af at dette er alt hypotetisk, fordi du ikke engang kan begynde at gøre det, du ønsker.)


Hver proces har adgang til hele hukommelsesområdet, lad os sige fra nul til 4GB. (Vi er ikke interesserede i detaljer her.) Proces A kan allokere hukommelse ved 0x0, og det kan også Process B. Hver proces synes det ' s har hukommelse klokken 0x0, men de har det ikke rigtig.


En proces ser ikke fysiske hukommelsesadresser. Den ser et 'virtuelt hukommelsesadresserum'. Operativsystemet understøttes af hardwaren, der opretholder et bord, der kortlægger fysiske hukommelsesadresser til virtuelle adresser. Der er et sådant bord til hver proces. Når proces A tildeler sin første byte, kan operativsystemet allokere den byte ved 0x1000 i fysisk hukommelse og derefter skrive en post i procesens sidebord for at sige 'virtuelt 0x0000=fysisk 0x1000'. Fra og med nu, når Process A refererer til adressen 0x0000, ser hardware (ikke operativsystemet) op 0x0000 i tabellen og finder ud af, at det virkelig betyder 0x1000 og læser/skriver på 0x1000. Når proces B tildeler sin første byte, kan operativsystemet tildele det til fysisk adresse 0x2000, men virtuel adresse 0x0000 i B s sidetabell. Sådan kan to processer bruge samme adresse samtidigt.


(Selvfølgelig har jeg udeladt mange detaljer, herunder brugermodushukommelsesadministratorer.)


Og så til dit spørgsmål. Hvis du på en eller anden måde havde allokeret alle B 's hukommelse og nu ønskede at genoprette det, kunne du genoprette det til præcis, hvor det var før (i B' s virtuelle adresserum.) Det ville nok være et andet sted i fysisk hukommelse, men du ville ikke Du behøver ikke at vide eller bekymre dig om det, og du behøver ikke fortælle proces B om det.