我正在尝试将数据从特定保留的物理内存传输到我的 NVME、IIUC,有 3 个步骤:
在内核驱动程序中,保留内存(dts 中指定的物理地址和大小)通过 file_operation 的 mmap 暴露给用户空间。具体驱动实现可以使用memremap将pa映射到va,然后使用remap_pfn_range或者nopage构建页表(有调优的空间,因为两种方案各有优缺点,但IMO不会有太大影响,因为io这里不涉及)
然后用户空间应用程序使用设备fd上的mmap(2)来获取映射的缓冲区A
将上面的缓冲区A写入文件。这一步有多种方法,mmap、write、io_uring、aio、libaio等。有些可以支持直接io,有些则不能(例如mmap)。
问题:
- 步骤 1、2、3 都正确吗?
- 对于步骤1和2,除了mmap还有其他解决方案吗?
- 我不太确定是否可以使用 io_uring 从缓冲区 A(来自 mmap)写入磁盘文件,如果您知道,请告诉我。