我从这里编译并运行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无法访问对吗?