观察物理地址内容

时间:2018-11-08 05:00:43

标签: linux memory mmap

我从这里编译并运行pagemap_dump.c:

/proc/[pid]/pagemaps and /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访问内容 实际地址:

How to access physical addresses from user space in 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

我有些东西不像“ hello world” 创建时/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无法访问对吗?

0 个答案:

没有答案