Páginas sobrepostas com o mmap (MAP_FIXED)
Devido a algumas razões obscuras que não são relevantes para esta questão, eu preciso recorrer ao uso de MAP_FIXED para obter uma página perto de onde a seção de texto da libc vive na memória.
Antes de ler o mmap (2) (que eu deveria ter feito em primeiro lugar), eu esperava obter um erro se eu chamei o mmap com MAP_FIXED e um endereço base sobreposto a uma área já mapeada.
No entanto, esse não é o caso. Por exemplo, aqui faz parte de / proc / maps para determinado processo
7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
Que, depois de fazer a seguinte chamada mmap ...
mmap(0x7ffff731b000,
getpagesize(),
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
0,
0);
... torna-se em:
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
O que significa que eu substituí parte do espaço de endereço virtual dedicado à libc com a minha própria página. Claramente não é o que eu quero ...
Na parte MAP_FIXED do manual mmap (2), ele afirma claramente:
Se a região de memória especificada por addr e len sobrepuser as páginas de qualquer mapeamento existente, a parte sobreposta do (s) mapeamento (s) existente (s) será (ão)descartado.
O que explica o que estou vendo, mas tenho algumas perguntas:
Existe uma maneira de detectar se algo já foi mapeado para determinado endereço? sem acesso / proc / maps?Existe uma maneira de forçar o mmap a falhar no caso de encontrar páginas sobrepostas?