gpt4 book ai didi

linux - vmalloc_to_pfn 在 Linux 32 系统上返回 32 位地址。为什么它会砍掉 PAE 物理地址的高位?

转载 作者:IT王子 更新时间:2023-10-29 00:45:49 26 4
gpt4 key购买 nike

我正在使用 vmalloc_to_pfn() 获取 32 位 PAE Linux 系统上的物理地址。看起来 vmalloc_to_pfn() 返回“unsigned long”,这意味着它在 32 位系统上是 32 位,在 64 位系统上是 64 位。在 64 位 Linux 上,unsigned long 是 64 位的,我没有遇到任何问题。

问题:使用此函数将虚拟转换为物理:

弗吉尼亚州:0xf8ab87fcPA 使用 vmalloc_to_pfn:0x36f7f7fc。但我实际上期待:0x136f7f7fc

物理地址介于 4 到 5 GB 之间。但是我无法得到确切的物理地址,我只能得到截断的 32 位地址。还有另一种方法可以获取真实的物理地址吗?

最佳答案

我自己正在研究这个,并且在 32 位上 - 所以这不完全是一个答案。但是挖掘同样的东西,我可以看到 vmalloc_to_pfn 的来源说:

/*
* Map a vmalloc()-space virtual address to the physical page frame number.
*/
unsigned long vmalloc_to_pfn(const void *vmalloc_addr)
{
return page_to_pfn(vmalloc_to_page(vmalloc_addr));
}
EXPORT_SYMBOL(vmalloc_to_pfn);

所以,它实际上不应该返回一个地址——它应该返回一个“页框号”(PFN)。与此相关:

http://www.tldp.org/LDP/tlk/mm/memory.html

Using the above example again, process Y's virtual page frame number 1 is mapped to physical page frame number 4 which starts at 0x8000 (4 x 0x2000). Adding in the 0x194 byte offset gives us a final physical address of 0x8194.

显然,应该将 PFN 乘以 PAGE_SIZE 以获得实际地址 - 这让事情变得很奇怪,你怎么会在 Linux 上“返回 32 位地址” 32 系统”完全可以工作(但话又说回来,我不是专家 - 也许 PFN 相当于 32 位地址?)。问题 OP 中模块的最小工作示例,以及两个平台上的输出以进行比较,可能是有序的。

无论如何,我只是注意到您所拥有的 - 物理地址扩展 (PAE) 可能会对分页产生影响;显然,作为 PFN 存储在页面全局目录 (PGD) 中的值是特定于体系结构的,并且根据它有不同的定义:

typedef unsigned long   pgdval_t; // arch/x86/include/asm/pgtable-2level_types.h
typedef u64 pgdval_t; // arch/x86/include/asm/pgtable-3level_types.h
typedef unsigned long pgdval_t; // arch/x86/include/asm/pgtable_64_types.h

总而言之 - 仅使用 vmalloc_to_pfn() 可能不是获取物理地址的全部过程。

关于linux - vmalloc_to_pfn 在 Linux 32 系统上返回 32 位地址。为什么它会砍掉 PAE 物理地址的高位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442773/

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