gpt4 book ai didi

c - 在用户空间启用写入组合 IO 访问

转载 作者:IT王子 更新时间:2023-10-29 00:15:10 28 4
gpt4 key购买 nike

我有一个带有用户空间驱动程序的 PCIe 设备。我正在通过 BAR 向设备写入命令,这些命令对延迟敏感并且数据量很小(~64 字节),所以我不想使用 DMA。

如果我使用 ioremap_wc 在内核中重新映射 BAR 的物理地址,然后将 64 字节写入内核中的 BAR ,我可以看到 64 -bytes 通过 PCIe 作为单个 TLP 写入。如果我允许我的用户空间程序 mmap 带有 MAP_SHARED 标志的区域,然后写入 64 字节,我会在 PCIe 总线上看到多个 TPL,而不是单个事务。

根据内核PAT documentation我应该能够将写入组合的页面导出到用户空间:

Drivers wanting to export some pages to userspace do it by using mmap interface and a combination of

1) pgprot_noncached()

2) io_remap_pfn_range() or remap_pfn_range() or vm_insert_pfn()

With PAT support, a new API pgprot_writecombine is being added. So, drivers can continue to use the above sequence, with either pgprot_noncached() or pgprot_writecombine() in step 1, followed by step 2.

根据此文档,我的 mmap 处理程序中的相关内核代码如下所示:

 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);

return io_remap_pfn_range(vma,
vma->vm_start,
info->mem[vma->vm_pgoff].addr >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot);

我的 PCIe 设备出现在 lspci 中,其中 BAR 标记为预期的可预取:

    Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 11
Region 0: Memory at d8000000 (64-bit, prefetchable) [size=32M]
Region 2: Memory at d4000000 (64-bit, prefetchable) [size=64M]

当我从用户空间调用 mmap 时,我看到一条日志消息(已设置 debugpat 内核启动参数):

reserve_memtype added [mem 0xd4000000-0xd7ffffff], track write-combining, req write-combining, ret write-combining

我还可以在 /sys/kernel/debug/x86/pat_memtype_list 中看到 PAT 条目看起来正确并且没有重叠区域:

write-combining @ 0xd4000000-0xd8000000
uncached-minus @ 0xd8000000-0xda000000

我还检查了没有与 PAT 配置冲突的 MTRR 条目。据我所知,一切都已正确设置,以便在用户空间中进行写入组合,但是使用 PCIe 分析器观察 PCIe 总线上的事务,用户空间访问模式与从内核执行的相同写入完全不同在 ioremap_wc 调用之后。

为什么写合并不能像用户空间预期的那样工作?

我可以做些什么来进一步调试?

我目前在单路 6 核 i7-3930K 上运行。

最佳答案

我不知道这是否有帮助,但这就是我在 PCIe 上进行写入组合的方式。当然,它在内核空间中,但这符合 Intel 文档。如果您遇到困难,值得一试。

全局定义:

unsigned int __attribute__ ((aligned(0x20))) srcArr[ARR_SIZE];

在你的函数中:

int *pDestAddr

for (i = 0; i < ARR_SIZE; i++) {
_mm_stream_si32(pDestAddr + i, pSrcAddr[i]);
}

关于c - 在用户空间启用写入组合 IO 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23248444/

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