Raymond
19 ianuarie, 2017
dacă un DLL trebuie mutat din cauza unui conflict de adrese de bază, atunci imaginea va fi mutată, iar întregul DLL mutat este acum susținut de fișierul paginii.
dacă citiți descrierea cu mai multă atenție, veți vedea că nu este exact întregul DLL mutat care este susținut de fișierul paginii. Mai exact, toate paginile care conțin remedieri sunt introduse în fișierul paginii. Dacă aveți noroc și aveți o pagină fără nicio remediere, atunci acea pagină va fi în continuare solicitată din imagine, deoarece nucleul nu i-a aplicat nicio remediere și, prin urmare, nu a suportat o copiere pe scriere pentru acea pagină, deci continuă să fie susținută de imaginea sistemului de fișiere.
unul dintre argumentele pe care le-am văzut pentru provocarea intenționată a unei coliziuni de adrese de bază este astfel încât DLL-ul mutat să fie copiat în fișierul paginii, ceea ce reprezintă o victorie dacă fișierul paginii este pe un mediu mai rapid decât DLL. De exemplu, fișierul paginii poate fi pe un SSD sau (gasp) o unitate RAM.
această logică nu ia în considerare cazul paginilor fără remedieri. Aceste pagini vor continua să apară direct din fișierul original, ceea ce reprezintă o problemă dacă fișierul original se află pe un mediu foarte lent sau pe un mediu care ar putea fi pierdut, cum ar fi o unitate CD-ROM sau o unitate de rețea.
din fericire, nu este nevoie să jucați jocuri amuzante cu conflicte de adrese de bază pentru a încărca întregul DLL în fișierul paginii. În schimb, utilizați / swaprun linker flag care vă permite să specificați în antetul modulului că încărcătorul ar trebui să copieze imaginea în fișierul swap.
Raymond Chen
Urmați