用/proc/pid/pagemap将虚拟地址转换为物理地址

kernel 在2.6.25的时候加入了这样一个功能/proc/self/pagemap 也就是在每个进程的/proc里面都有一个pagemap通过读取里面的内容就可以算出当前虚拟地址对应的物理页,然后加入page_offset就可以知道当前虚拟地址对应的物理地址。

 

/proc/pagemap需要你的应用有root权限才能使用。

转载于:https://www.cnblogs.com/fourstupidguns/p/11073660.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C++代码示例,用于将/proc/pid/pagemap映射到内存中并获取一个地址以判断其是否为物理地址虚拟地址: ```c++ #include <iostream> #include <fstream> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> using namespace std; int main() { // 获取进程ID pid_t pid = getpid(); // 构建/proc/pid/pagemap文件的路径 char path[100]; sprintf(path, "/proc/%d/pagemap", pid); // 打开/proc/pid/pagemap文件 int fd = open(path, O_RDONLY); if (fd == -1) { cout << "无法打开/proc/pid/pagemap文件" << endl; return -1; } // 获取一个地址,这里以0地址为例 void *addr = (void*)0; // 计算地址在pagemap中的索引 off_t offset = (off_t)addr / getpagesize() * sizeof(uint64_t); // 将pagemap映射到内存中 uint64_t *pagemap = (uint64_t*)mmap(NULL, sizeof(uint64_t), PROT_READ, MAP_PRIVATE, fd, offset); if (pagemap == MAP_FAILED) { cout << "无法映射/proc/pid/pagemap文件" << endl; return -1; } // 判断是否为物理地址 if (*pagemap & (1ULL<<63)) { cout << "物理地址" << endl; } else { cout << "虚拟地址" << endl; } // 解除pagemap的映射 munmap(pagemap, sizeof(uint64_t)); // 关闭/proc/pid/pagemap文件 close(fd); return 0; } ``` 在上面的代码中,我们首先获取当前进程的ID,然后构建/proc/pid/pagemap文件的路径。接着打开该文件,并获取一个地址(这里以0地址为例)。然后我们计算该地址在pagemap中的索引,并将pagemap映射到内存中。我们可以通过判断pagemap中的第63位来确定该地址是物理地址还是虚拟地址。最后我们需要解除pagemap的映射并关闭/proc/pid/pagemap文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值