A causa di alcuni motivi oscuri che non sono rilevanti per questa domanda, ho bisogno di ricorrere a MAP_FIXED per ottenere una pagina vicino a dove la sezione di testo di libc risiede nella memoria.Pagine sovrapposte con mmap (MAP_FIXED)
Prima di leggere mmap (2) (che avrei dovuto fare in primo luogo), mi aspettavo di ottenere un errore se avessi chiamato mmap con MAP_FIXED e un indirizzo di base che si sovrapponesse a un'area già mappata.
Tuttavia, questo non è il caso. Per esempio, qui è parte di/proc/mappe per certo processo
7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
Il che, dopo aver effettuato la seguente chiamata mmap ...
mmap(0x7ffff731b000,
getpagesize(),
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
0,
0);
... si trasforma in:
7ffff7299000-7ffff731b000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
7ffff731b000-7ffff731c000 rwxp 00000000 00:00 0
7ffff731c000-7ffff744c000 r-xp 00083000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
Ciò significa che ho sovrascritto una parte dello spazio degli indirizzi virtuali dedicato alla libc con la mia pagina personale. Chiaramente non quello che voglio ...
Nella parte MAP_FIXED della mmap (2) manuale, afferma chiaramente:
Se la regione di memoria specificata da addr e Len si sovrappone le pagine di qualsiasi mapping esistente (s), quindi la parte sovrapposta delle mappe esistenti sarà scartata.
Il che spiega quello che vedo, ma ho un paio di domande:
- C'è un modo per rilevare se qualcosa è stato già mappato certo indirizzo? senza accedere/proc/maps?
- C'è un modo per forzare mmap a fallire nel caso di trovare pagine sovrapposte?
(+1) Questo può essere di qualche * * aiuto: http://stackoverflow.com/questions/8362747/how-can-i-detect-whether-a-specific-page-is -mapped-in-memory – NPE
Penso che l'uso di "MAP_FIXED" sia una di quelle cose in cui "qui, hai questa pistola, ma fai attenzione a non spararti ai piedi". In altre parole, "è tuo compito assicurarti di usarlo correttamente". Ho esaminato parte del codice mmap in passato, e per quanto ne so, fa quello che chiedi, qualunque cosa tu chieda veramente - purché non stia violando la sicurezza [e la tua applicazione distrugga la sua copia di la libreria C non è una violazione della sicurezza, dal momento che tutto ciò che accadrà è che la TUA applicazione muore ...] –
@MatsPetersson - abbastanza corretto, ma è anche possibile _possibile_ usarlo corretto? Ad esempio, se sei consapevole che 'MAP_FIXED' sovrascrive i mapping esistenti e sei disposto a _check_ per i mapping esistenti, c'è un modo ragionevole per farlo? – BeeOnRope