gpt4 book ai didi

c - 通过 remap_pfn_range 将保留的高端内存映射到用户空间

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:42 28 4
gpt4 key购买 nike

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*1024uBUFFER_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 时一切正常,我相信我的罪魁祸首是在我的 ioremapremap_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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com