Предположим, у меня есть произвольный виртуальный адрес. Решение просит попробовать написать в «/dev/null» с этим виртуальным адресом в качестве входного буфера. Если адрес не действителен, Errno должен быть установлен на EFAULT. На что я написал небольшой код в качестве теста: < /p>
Код: Выделить всё
#include
#include
#include
#include
#include
int isMemoryMapped(void* addr) {
int dev_null = open("/dev/null", O_WRONLY);
if (dev_null == -1) {
perror("Failed to open /dev/null");
exit(EXIT_FAILURE);
}
errno = 0;
// Attempt to write to /dev/null
ssize_t result = write(dev_null, addr, sizeof(void*)); //
Но, к сожалению, программа Segfaults, пытаясь выполнить операцию записи: < /p>
...
1197 : Address 0x7ffeea336fe8 is accessible, content = 0x6f6d656d5f656661
1198 : Address 0x7ffeea336ff0 is accessible, content = 0x6e6163735f7972
1199 : Address 0x7ffeea336ff8 is accessible, content = (nil)
Segmentation fault (core dumped)
#include
#include
#include
#include
int isMemoryMapped(void* addr) {
// Align address to page boundary
long pageSize = sysconf(_SC_PAGESIZE);
void* pageAlignedAddr = (void*)((uintptr_t)addr & ~(pageSize - 1));
unsigned char vec;
if (mincore(pageAlignedAddr, pageSize, &vec) == 0) {
return 1; // Memory is mapped
}
return 0; // Memory is NOT mapped
}
< /code>
Я использую Ubuntu 22.04.5 LTS x86_64 с ядром 5.15.0-100-Генера. < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ss-addr-us