Я компилирую и запускаю pagemap_dump.c отсюда:
/ proc / [pid] / pagemaps и / proc / [pid] / maps | Linux
и другое приложение присоединяют существующую разделяемую память, и каждый раз, когда я запускаю pagemap_dump, физический адрес разделяемой памяти действительно один и тот же (адрес виртуальной памяти меняется каждый раз, когда я наблюдаю):
./pagemap_dump.exe 2135 <== 2135 is pid
./pagemap_dump.exe 5864 <== 5864 is pid
./pagemap_dump.exe 5110 <== 5110 is pid
вывод:
7fabb37e1000 54edde 0 1 0 1 /dev/shm/memtest.shared
7f0040fa1000 54edde 0 1 0 1 /dev/shm/memtest.shared
7ffbd2869000 54edde 0 1 0 1 /dev/shm/memtest.shared
эти 3 приложения присоединяются к memtest.shared, и их физический адрес в моем linux равен 0x54edde,
тогда я пытаюсь получить доступ к содержимому из / dev / mem в этом
физический адрес:
Как получить доступ к физическим адресам из пространства пользователя в Linux?
int main(int argc, char** argv)
{
if (argc < 3) {
printf("Usage: %s <phys_addr> <offset>\n", argv[0]);
return 0;
}
off_t offset = strtoul(argv[1], NULL, 0);
size_t len = strtoul(argv[2], NULL, 0);
// Truncate offset to a multiple of the page size, or mmap will fail.
size_t pagesize = sysconf(_SC_PAGE_SIZE);
off_t page_base = (offset / pagesize) * pagesize;
off_t page_offset = offset - page_base;
int fd = open("/dev/mem", O_RDONLY|O_SYNC);
unsigned char *mem = (unsigned char *) mmap(NULL, page_offset + len, PROT_READ , MAP_SHARED, fd, page_base);
if (mem == MAP_FAILED) {
perror("Can't map memory");
return -1;
}
size_t i;
for (i = 0; i < len; ++i)
printf("%02x ", (int)mem[page_offset + i]);
return 0;
} // main
chown root testz1.exe
chmod 4775 testz1.exe
./testz1.exe 5565918 16 <=== 0x54edde = 5565918
Я не могу отобразить память: операция не разрешена
./testz1.exe 54edde 16
У меня есть кое-что не похожее на "привет мир", к которому я обращаюсь
/dev/shm/memtest.shared, когда я его создаю.
Поскольку мне кажется, что я получаю физический адрес /dev/shm/memtest.shared, как я могу получить правильный способ получить содержимое из / dev / mem этого физического адреса?!
Редактировать:
После загрузки devmem2.c и запуска:
./devmem2.exe 0x54edde w
получить следующее сообщение:
/ dev / mem открыт.
Ошибка в строке 75, файл devmem2.c (1) [Операция не разрешена]
Похоже, 0x54edde это не физический адрес, как я ожидаю, но почему это произошло ?!
pagemap_dump.c действительно показывает физический адрес /dev/shm/memtest.shared
для всех процессов, которые присваивают ему значение 0x54edde, то почему
devmem2.c не может получить к нему право ?!