gpt4 book ai didi

c - 从/proc//pagemap 转储 pfn 未提供预期的内容

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:46 25 4
gpt4 key购买 nike

我正在使用此代码 http://fivelinesofcode.blogspot.com/2014/03/how-to-translate-virtual-to-physical.html转储与取自/proc/"pid"/maps 的给定虚拟地址相关的 pfn。

获得 PFN 后,我将其与特定的内核模块一起转储。这是代码片段:

static int write_pfn(phys_addr_t pfn)
{
struct page *p;
void *v;
int s =0,ret =0;

p = pfn_to_page((pfn) >> PAGE_SHIFT);
v = kmap(p);

DBG("Writing page %d(mapped addr=0x%lx) - pfn: 0x%lx", p,v,pfn);

s = write_vaddr(v, PAGE_SIZE);

if (s != PAGE_SIZE) {
DBG("Error sending page %d(addr=0x%lx)", s,v);
return (int) s;
ret-=1;
}
kunmap(p);

return ret;
}

但是,我注意到,如果我将内核模块转储的 PFN 与进程内部相应虚拟地址的真实内容进行比较,则内容完全不同。请注意,我使用 (gdb) 中的命令“x”转储了进程虚拟地址的内容。

有什么想法吗?这是我的内核版本:

Linux 3.14.7-rt5 #1 SMP Mon Jun 23 14:55:19 CEST 2014 x86_64 GNU/Linux

最佳答案

从逻辑上讲,您的解决方案是正确的,但我不确定页面 map 阅读器代码的正确性。无论如何,有一种方法可以检查它。当您在内核中时(在目标应用程序的上下文中),您可以使用此内核 API 获取与指定 VA 对应的页面:

1. mm = current->mm
2. struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
3. static inline struct page *follow_page(struct vm_area_struct *vma,
unsigned long address, unsigned int foll_flags)
4. page_to_pfn

你可以实现这个并与你的结果进行比较,希望这会有所帮助。

关于c - 从/proc/<pid>/pagemap 转储 pfn 未提供预期的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com