【问题标题】:Pages returned by alloc_pages Linux Kernelalloc_pages Linux 内核返回的页面
【发布时间】:2016-10-31 18:07:34
【问题描述】:
  • 是否在内核中使用 alloc_pages 分配页面,如果相关也映射以供用户使用,确保被固定并且不会被换出到磁盘?
  • alloc_pages函数返回的页面地址是dma地址吗?也就是说,硬件设备可以通过 dma 访问的地址类型是否相同?

【问题讨论】:

    标签: linux memory linux-kernel


    【解决方案1】:

    页面是在内核中使用 alloc_pages 分配的,也是为用户映射的 如果这是相关的,请使用,确保被固定并且不会被交换 出磁盘?

    alloc_pages() 为内核和用户空间分配页面,取决于谁在调用它。用户空间使用的页面。如果是匿名(用户堆栈或堆)页面,则可以换出。

    alloc_pages 函数返回的页面地址是 dma 地址?即硬件设备的地址类型是否相同 可以通过 dma 访问吗?

    没有必要。你必须指定一个标志告诉 alloc_pages() 你想要什么样的页面(例如 .__GFP_DMA 或 __GFP_DMA32 用于 dma 地址)。

    【讨论】:

    • 谢谢。关于您的第一个答案:我刚刚在内核空间中分配并通过 mmap 将 vma 映射到此内核页面。因此用户将能够将其用作数组或其他任何东西。这是否意味着在 Kernel 中分配的物理页面可能会被换出?
    • 是的,我可能会被换掉。
    • 即使使用标志 GFP_DMA?如果你的回答是肯定的,那么这个标志到底是干什么用的?据我了解,我肯定是错的,这个标志用于分配内存,以便硬件设备能够通过 DMA 访问它。为了能够实现该页面必须被固定。我错过了什么?
    • 你是对的,DMA页面不能交换,或者设备找不到地方进行数据传输。我说的可能在最后评论中交换,只是参考被映射的页面对于用户空间,这并不能保证页面固定到内存中。
    • 所以只是总结一下,请确保我理解正确。如果我使用带有标志 GFP_DMA 的 alloc_pages 在内核模式下分配页面,然后通过 remap_pfn_range 将它们映射为用户空间使用,那么可以保证这些页面被固定到内存中,因此 dma 设备将始终能够通过物理地址访问内存?跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2020-12-29
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多