наблюдать за содержанием физического адреса - PullRequest
0 голосов
/ 08 ноября 2018

Я компилирую и запускаю 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 не может получить к нему право ?!

...