gpt4 book ai didi

c - Linux 驱动程序 : mmap() kernel buffer to userspace without using nopage

转载 作者:太空狗 更新时间:2023-10-29 11:09:20 26 4
gpt4 key购买 nike

<分区>

我正在为数据采集设备实现一个 Linux 设备驱动程序,它不断地将数据流式传输到我在内核中分配的循环缓冲区(使用 __get_free_pages())。循环缓冲区(由 PCIe 硬件写入)驻留在 RAM 中,我希望用户空间能够 mmap() 该 RAM 区域,以便用户空间可以读取其内容。

根据 LDD3:

An interesting limitation of remap_pfn_range is that it gives access only to reserved pages and physical addresses above the top of physical memory. ... Therefore, remap_pfn_range won’t allow you to remap conventional addresses, which include the ones you obtain by calling get_free_page. ... The way to map real RAM to user space is to use vm_ops->nopage to deal with page faults one at a time.

在我的例子中,我确切地知道在调用 mmap() 时整个缓冲区需要将哪些地址映射到给定的 VMA 位置,所以为什么我必须使用 nopage() 方法在访问页面时一次出错?

为什么我不能只设置我的 VMA,以便立即将我的整个环形缓冲区映射到用户的地址空间?有办法做到这一点吗?

我还希望用户空间程序按顺序访问我的缓冲区,从而在每次越过页面边界时调用我的 nopage() 函数时导致性能下降。 这会在实践中造成相当大的性能损失吗?(我的缓冲区很大,比如 16 MB。)

(值得注意的是,我在我以前的一个设备驱动程序中对从 __get_free_pages() 返回的内存使用了 remap_pfn_range() 并且从来没有任何问题,但我可能刚刚在那个系统上很幸运。)

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