Из-за некоторых неясных причин, которые не имеют отношения к этому вопросу, мне нужно прибегнуть к использованию MAP_FIXED, чтобы получить страницу, близкую к тому, где в памяти находится текстовый раздел libc.
Прежде чем читать mmap (2) (что я должен был сделать в первую очередь), я ожидал получить ошибку, если бы я вызвал mmap с MAP_FIXED и базовый адрес, перекрывающий уже отображенную область.
Однако это не так. Например, вот часть /proc/maps для определенного процесса
7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
Что после выполнения следующего вызова mmap...
mmap(0x7ffff731b000,
getpagesize(),
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
0,
0);
... превращается в:
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
Это означает, что я переписал часть виртуального адресного пространства, выделенного для libc, с моей собственной страницей. Ясно, что я не хочу...
В части MAP_FIXED руководства mmap (2) четко указано:
Если область памяти, указанная addr и len, перекрывает страницы любого существующее сопоставление (-ы), то перекрываемая часть существующих сопоставлений будет отброшена.
Это объясняет, что я вижу, но у меня есть несколько вопросов:
- Есть ли способ обнаружить, что что-то уже сопоставлено с определенным адресом? без доступа /proc/maps?
- Есть ли способ заставить mmap потерпеть неудачу в случае нахождения перекрывающихся страниц?