【问题标题】:How can I allocate 16K continuous memory in kernel and get the physical address?如何在内核中分配 16K 连续内存并获取物理地址?
【发布时间】:2014-02-06 05:41:13
【问题描述】:

我的理解是内核页面大小是 4K。我想分配 16K 连续内存作为驱动程序的缓冲区。我使用了 kmalloc(),它返回了一个指针(我假设分配成功)。

这是否意味着 16K 是连续的?

我从 kmalloc() 获得的地址是虚拟地址吗?如果我需要将该地址传递给硬件寄存器,我应该使用虚拟地址还是物理地址?

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    是 - 用 kmalloc 分配的内存是物理连续的,地址是虚拟地址。尝试使用 virt_to_phys() 宏获取物理地址。

    【讨论】:

    • 但是为什么virt_to_phys()的返回值和我输入的一样(我从kmalloc得到的值)?
    • 它对我有用:kmalloc() addr: 0xc3c0a000 和 virt_to_phys() 因为它是:0x3c0a000。我有 XScale-435 处理器。据我所知,在 Intel x86 上它的工作原理相同 - 只需从 kmalloc() addr 中减去 PAGE_OFFSET(我的系统为 0xc0000000)值。
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2021-09-10
    • 2011-09-09
    • 2015-01-26
    相关资源
    最近更新 更多