问题标签 [ioremap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2477 浏览

linux-kernel - 对驱动程序已经 ioremap 的物理地址使用 ioremap 有什么影响?

我正在尝试通过内核空间使用 ARM 看门狗。我有一个静态构建并部署在内核中的看门狗驱动程序。驱动程序重新映射的内存在 /proc/iomem 中可见。

驱动程序已将从 0xff567000 开始的地址重新映射到内核中的虚拟地址。
现在我编写了一个模块来 ioremap 相同的地址并写入它。

插入模块后看到的输出是:

此外,我能够成功读取和写入看门狗寄存器。

请告诉我,这个映射对驱动程序的正常工作有影响吗?

感谢您提前提供的所有帮助。

0 投票
2 回答
869 浏览

linux-kernel - 处理映射寄存器后 LINUX 内核驱动程序挂起/冻结

我是 LINUX 内核的全新开发者,我正在开发的新 LINUX 驱动程序遇到一些问题。

在我使用 ioremap()/ioremap_nocache() 映射 NXP PWM 寄存器之后,然后我尝试写入寄存器 mappend 我的系统 hags/freeze。

你能帮我理解发生了什么吗?

我的司机是这样的:

0 投票
0 回答
338 浏览

c - 使用物理地址作为 sk_buff 数据片段

是否可以将物理地址映射为数据片段sk_buff?我正在开发 Zynq Ultrascale+ 平台(FPGA + ARM SOC)。我将内存缓冲区映射到物理地址。目标是通过 UDP 有效地发送该数据。高效我的意思是零拷贝。我要做的是开发 linux 驱动程序,该驱动程序将该物理地址映射到内核内存并将其sk_buff作为片段附加到。我开始:

只要页面是由以下人员创建的:

一切正常。数据包被发送。数据包由两个 DMA 事务(Scatter Gather)发送。为了实现我的目标,我将vmalloced page 替换为:

物理地址是0xb0000000并且被映射到虚拟地址0xffffff800ad30000页面是在0xffffffbf0025e280。在dev_queue_xmit数据包进入网络队列并最终被映射为 DMA 之后。swiotlb_map_page使用0x00ad30000as时会出现问题phys_addr,这与 original 不同0xb0000000virt_to_phys用于swiotlb_map_page计算物理地址,它基本上采用低 32 位作为物理地址。是否有不同的方法来映射内存区域以便将其用作sk_buff片段?

作为临时修复,我创建了这样的假页面:

并修补了以太网驱动程序以使用页面私有数据作为映射地址:

有了这样的黑客,一切都奏效了。数据由 的内容填充0xb0000000。虽然它工作正常,但我真的怀疑这是正确的方法。尽管如此,它表明没有硬件限制来做到这一点。有谁知道如何正确映射该内存?

swiotlb_map_pagePS我还尝试以可以计算正确地址的方式将物理地址映射到固定虚拟地址(并且virt_to_phys确实如此),但它以“无法在虚拟地址处理内核分页请求”错误结束。

也许我正在寻找错误地址的页面,或者它不存在。谁能指出我正确的方向。有没有办法在没有这种讨厌的黑客攻击的情况下实现目标?

0 投票
1 回答
1009 浏览

memory-management - PCIe 端点设备内存如何映射到系统内存映射 (MMIO)?

Linux 内核BIOS如何将PCIe 端点设备内存映射到系统MMIO空间?有什么API可以实现吗?假设在为 PCIe 端点设备编写 Linux 设备驱动程序时,我们如何将PCIe设备内存映射到 MMIO 空间?或者在枚举期间设备是否已经被 BIOS 映射到 MMIO 中,我需要做的只是使用ioremap () 将设备MMIO重新映射到内核虚拟地址空间?

平台:x86 上的 Linux

0 投票
0 回答
84 浏览

amazon-ec2 - ioremap 返回异常的虚拟地址

我使用 ioremap 映射了一个寄存器的物理地址 0xf4000000,而它返回了一个非常奇怪且很小的虚拟地址 0x0f690dd5,这在我接下来执行 ioread32(virtual address) 时引起了内核恐慌。ioremap 可以执行,但是为什么会返回这么奇怪的虚拟地址呢?

实验在 aws ec2、bare mental、aarch64 上运行。我想知道为什么会发生这种情况,我怎样才能读取这个寄存器?

0 投票
0 回答
19 浏览

linux-kernel - 为什么在ioremap中经常使用PAGE_SIZE?

我经常发现 ioremap 只是使用 PAGE_SIZE 作为它的大小,如:

是因为它应该至少映射 PAGE_SIZE,即使它的总长度小于 PAGE_SIZE?