小编Own*_*sky的帖子

为什么物理地址对齐 4KiB 时,虚拟地址却不是 4KiB 对齐?

简而言之,我在内核中有一个物理地址0x250000000(9,932,111,872 或),它显然与 4KiB(页面大小)对齐。当我使用内核__va()函数获取内核虚拟地址时,我得到类似0xf570660f(每次启动时不同)的信息,该地址未与 4KiB 对齐

我使用的是 64 位系统,因此没有 HIGHMEM,并且我认为由于线性内存模型,4KiB 对齐的物理地址的虚拟地址也应该是 4KiB 对齐的。我错过了什么?虚拟地址不应该是吗phys_addr + PAGE_OFFSET?或者是sparsemem的影响?但也许它也应该是 4KiB 对齐的?

以下是更多详细信息:

我的工作环境是在 x86 64 位 QEMU VM 上。我正在尝试在模式下使用 PMEMDEV-DAX作为普通内存。我可以得到它的物理起始地址(0x250000000),已经确认是正确的。然后我需要将它转移到内核空间中的虚拟地址,以便我可以根据需要使用它。这是一些代码:

static long nvpc_map_whole_dev(struct dax_device *dax_dev, void **kaddr, pfn_t *pfn)
{
    // get the device
    struct dev_dax_nvpc *dax_nvpc = (struct dev_dax_nvpc *)dax_get_private(dax_dev);
    
    // get the virtual address and the pfn_t
    *kaddr = __va(dax_nvpc->phys_start);
    *pfn = phys_to_pfn_t(dax_nvpc->phys_start, PFN_MAP); …
Run Code Online (Sandbox Code Playgroud)

kernel memory

31
推荐指数
1
解决办法
4677
查看次数

标签 统计

kernel ×1

memory ×1