pa

#include "fcntl.h"
#include "unistd.h"
#define PFN_MASK_SIZE 8
size_t virt2phy(size_t virtaddr)
{
int fd, retval;
size_t page, physaddr;
size_t virt_pfn;
size_t page_size;
off_t offset;


/* standard page size */
page_size = 4096;

fd = open("/proc/self/pagemap", O_RDONLY);
if (fd < 0) {
return -1;
}

virt_pfn = virtaddr / page_size;
offset = sizeof(size_t) * virt_pfn;
if (lseek(fd, offset, SEEK_SET) == (off_t) -1) {
close(fd);
return -2;
}

retval = read(fd, &page, sizeof(size_t));
close(fd);
if (retval < 0 || retval != sizeof(size_t)) {
return -3;
}

/*
* the pfn (page frame number) are bits 0-54 (see
* pagemap.txt in linux Documentation)
*/
physaddr = ((page & 0x7fffffffffffffULL) * page_size)
+ ((unsigned long)virtaddr % page_size);

return physaddr;
}

#include "sys/mman.h"
int main(int argc, char *argv[])
{
void *m1 = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
void *m = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);

uint64_t r = va_to_pa((uint64_t)m);
uint64_t r2 = virt2phy((uint64_t)m);
return 0;
}
posted @   zJanly  阅读(198)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示