gpt4 book ai didi

c - 如何使用 memcpy_toio/fromio?

转载 作者:行者123 更新时间:2023-12-05 07:56:35 26 4
gpt4 key购买 nike

我正在使用 C 语言开发内核模块以与 PCIe 卡通信,我使用 pci_iomap 分配了一些 io 内存,并使用 ioread/write32 在那里写入/读取。

这可行,但性能很差,我读到我可以通过 memcpy_toio/fromio 使用 block 传输,而不是一次只执行 32b。

要写入,我正在使用 iowrite32(buffer[i], privdata->registers + i);

要阅读,我会执行 buffer[i] = ioread32(&privdata->registers[i]);

我试图将其中的 for 循环替换为:

memcpy_toio(privdata->registers, buffer, 2048);
memcpy_fromio(buffer, privdata->registers, 2048);

如果我只用 memcpy_toio 替换写循环并使用 ioread32 进行读取,程序不会崩溃,但指令似乎没有做任何事情(寄存器没有改变);

另外,当我用 memcpy_fromio 指令替换读取循环时,它崩溃了。

我在想这可能是因为读取尝试访问仍在写入的内存位置。有没有办法在 iowrite32 或 memcpy_toio 之后刷新写入队列?

我在这里做错了什么?

最佳答案

memcpy_from/toio()仅当 I/O 内存的行为类似于内存时才能使用,即,如果值可以推测性读取,并且可以多次写入或乱序写入。

标记为不可预取的 I/O 范围不支持这一点。

关于c - 如何使用 memcpy_toio/fromio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28518336/

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