- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Arch=x86_64
我正在按照这个问题中概述的流程完成 DMA 解决方案, Direct Memory Access in Linux
我对 ioremap
的调用成功返回了地址 pt。
在调用 remap_pfn_range
时,我使用 virt_to_phys(pt) >> PAGE_SHIFT
指定 ioremap
生成的区域的 pfn > 打电话。
当使用mmap
的用户空间应用程序执行并调用remap_pfn_range
时,机器会崩溃。我假设映射已关闭并且我强制系统使用已经分配的内存(退出前的屏幕故障),但是我不清楚不匹配发生的位置。系统有 4 Gigs 的 Ram,我通过使用内核引导选项 mem=2048M
保留了 2Gigs。
我使用 BUFFER_SIZE=1024u*1024u*1024u
和 BUFFER_OFFSET=2u*1024u*1024u*1024u
。
将这些放入 pt=ioremap(BUFFER_SIZE,BUFFER_OFFSET)
我相信 pt 应该等于位于 2GB 边界到 3GB 边界的物理内存的虚拟地址。这个假设准确吗?
当我执行我的内核模块时,我更改了我的 remap_pfn_range
以使用 vma->vm_pgoff>>PAGE_SHIFT
作为目标 pfn,代码执行时没有错误,我可以读写内存。然而,这并没有使用我想要的保留物理内存。
因为在使用 vma->vm_pgoff>>PAGE_SHIFT
时一切正常,我相信我的罪魁祸首是在我的 ioremap
和 remap_pfn_range
之间
感谢您的任何建议!
使用此内核模块背后的动机是 PCI 设备的 DMA 需要大的连续缓冲区。在此应用程序中,重新编译内核不是一个选项,因此我尝试使用模块 + 硬件来完成它。
最佳答案
My call to ioremap successfully returns with an address, pt.
In my call to remap_pfn_range I use, virt_to_phys(pt) >> PAGE_SHIFT, to specify the pfn of the area generated by the ioremap call.
这是非法的,因为ioremap 在vmalloc 区域中保留了虚拟区域。 virt_to_phys() 仅适用于内存的线性映射部分。
putting these into pt=ioremap(BUFFER_SIZE,BUFFER_OFFSET) I believe pt should equal a virtual address to the physical memory located at the 2GB boundary up to the 3GB boundary. Is this assumption accurate?
这不完全正确,例如在我的机器上 cat/proc/iomem
...
00001000-0009ebff : System RAM
...
00100000-1fffffff : System RAM
...
可能有多个内存条,非强制内存会从物理地址空间的地址0x0开始。
这可能对您有用 Dynamic DMA mapping Guide
关于c - 通过 remap_pfn_range 将保留的高端内存映射到用户空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42154124/
Arch=x86_64 我正在按照这个问题中概述的流程完成 DMA 解决方案, Direct Memory Access in Linux 我对 ioremap 的调用成功返回了地址 pt。 在调用
我正在使用 ARM 上的内核 3.18。我正在从正在为其编写驱动程序的相机读取数据。我使用以下设置内存: cpu_handle = dma_alloc_coherent(NULL, dma_size,
我想使用 ioremap_wc() 将设备内存 (NIC) 映射到内核空间内存区域。然后我想将内存区域从内核空间重新映射到用户空间,为此我可以使用 2 个函数:vm_insert_page() 和 r
目前,我正在使用 example driver从中学习,并从中建立了自己的自定义驱动程序。 mmap 代码几乎完全相同,除了我允许用户管理他们自己请求的大小并以此为基础进行内存分配,以及我在/dev
我准备了一个在 ARM Intel Cyclone V SoC 上运行的应用程序。我需要将 DMA 相干内存缓冲区映射到用户空间。缓冲区在设备驱动程序中分配: buf_addr = dmam_allo
我是一名优秀的程序员,十分优秀!