繁体   English   中英

为什么vmalloc返回的地址无法转换为物理地址

[英]Why the addresses returned by vmalloc cannot be translated to physical address

我正在尝试了解Linux中的内存管理。 如果是vmalloc我发现了这个

返回的地址不能转换为物理地址或总线地址,因为您不能断言该内存在物理上是连续的。

当我调用virt_to_phys()时,我得到一个地址。

您是否表示virt_to_phys的返回值不正确

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/vmalloc.h>
#include <linux/moduleparam.h>

MODULE_LICENSE("GPL");

static char *ptr;
int alloc_size = 4096*1234;


static int test_hello_init(void)
{
    ptr = vmalloc(alloc_size);
    if(!ptr) {
        /* handle error */
        pr_err("memory allocation failed\n");
        return -ENOMEM;
    } else {
        int i;
        for (i = 0; i < 1234; i++) {
            pr_info("Page Index:%d\tPhysical address:%px\t Virtual Address:%llx\n", 
                    i, ptr+(4096*i), virt_to_phys(ptr+(4096*i)));
        }
    }

    return 0;
}

static void test_hello_exit(void)
{
    vfree(ptr);
    pr_info("Memory freed\n");

}

module_init(test_hello_init);
module_exit(test_hello_exit);

dmesg的:

[26472.440426] Page Index:1217  Physical address:ffffa1f544336000    Virtual Address:12ce44336000
[26472.440427] Page Index:1218  Physical address:ffffa1f544337000    Virtual Address:12ce44337000
[26472.440427] Page Index:1219  Physical address:ffffa1f544338000    Virtual Address:12ce44338000
[26472.440428] Page Index:1220  Physical address:ffffa1f544339000    Virtual Address:12ce44339000
[26472.440428] Page Index:1221  Physical address:ffffa1f54433a000    Virtual Address:12ce4433a000
[26472.440428] Page Index:1222  Physical address:ffffa1f54433b000    Virtual Address:12ce4433b000
[26472.440429] Page Index:1223  Physical address:ffffa1f54433c000    Virtual Address:12ce4433c000
[26472.440429] Page Index:1224  Physical address:ffffa1f54433d000    Virtual Address:12ce4433d000
[26472.440429] Page Index:1225  Physical address:ffffa1f54433e000    Virtual Address:12ce4433e000
[26472.440430] Page Index:1226  Physical address:ffffa1f54433f000    Virtual Address:12ce4433f000
[26472.440430] Page Index:1227  Physical address:ffffa1f544340000    Virtual Address:12ce44340000
[26472.440430] Page Index:1228  Physical address:ffffa1f544341000    Virtual Address:12ce44341000
[26472.440431] Page Index:1229  Physical address:ffffa1f544342000    Virtual Address:12ce44342000
[26472.440431] Page Index:1230  Physical address:ffffa1f544343000    Virtual Address:12ce44343000
[26472.440431] Page Index:1231  Physical address:ffffa1f544344000    Virtual Address:12ce44344000
[26472.440432] Page Index:1232  Physical address:ffffa1f544345000    Virtual Address:12ce44345000
[26472.440432] Page Index:1233  Physical address:ffffa1f544346000    Virtual Address:12ce44346000

物理内存被分为许多页面,其中每个页面可能是4 KiB区域。 并将物理页面映射到虚拟内存,无论内核感觉如何。

对于vmalloc() ; 内核分配“随机”(非连续)物理页面并将其映射到连续的虚拟地址。 您可以将vmalloc()返回的地址转换为物理地址,但它只会是第一页中的物理地址,而与下一页或其他任何页面的物理地址无关。

您可以将每个单独页面的虚拟地址转换为物理地址。 例如,如果您使用vmalloc()分配1234页; 然后(使用“ for(virtual_address = start; virtual_addresss < end; virtual_address += PAGE_SIZE) {类的循环for(virtual_address = start; virtual_addresss < end; virtual_address += PAGE_SIZE) { },您可以找到1234个完全不相关的物理地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM