【发布时间】:2014-08-24 16:16:29
【问题描述】:
我正在编写一个内核模块,它将触发和外部 PCIe 设备从我的内部存储器中读取数据块。为此,我需要向 PCIe 设备发送一个指向我要发送的数据的物理内存地址的指针。最终,这些数据将通过write() 函数(用户空间)和copy_from_user()(内核空间)从用户空间写入内核。据我了解,我的内核模块将看到的地址仍然是虚拟内存地址。我需要一种方法来获取它的物理地址,以便 PCIe 设备可以找到它。
1) 我可以只使用来自用户空间的mmap() 并将我的数据放在DDR 内存中的已知位置,而不是使用copy_from_user() 吗?不过,我不想意外覆盖内存中的另一个进程数据。
2) 我的内核模块在初始化时使用ioremap_nocache() 保留了PCIe 数据空间,我可以从我的内核模块中做同样的事情还是把这个内存当作io 内存是个坏主意?如果可以,如果我尝试保留的内存已在使用中会怎样?我不想硬编码一个静态内存位置,然后发现它正在使用中。
提前感谢您的帮助。
【问题讨论】:
标签: memory-management linux-kernel kernel-module device-driver