在我的驱动程序中,我正在尝试将从ioremap返回的地址映射到用户空间地址。
以下是需要回答的问题:
以下是需要回答的问题:
- ioremap返回什么类型的地址?
- 它与
kmalloc
地址有何不同? - 如何映射从ioremap返回的地址?
- 应该插入哪个地址到
remap_pfn_range
中?
kmalloc
地址有何不同?remap_pfn_range
中?remap_pfn_range()
,就不需要使用ioremap()
。 ioremap()
会将物理地址映射到内核虚拟地址。而remap_pfn_range()
直接将物理地址映射到用户空间。只需将你的物理地址(通过PAGE_SHIFT向下转移以生成PFN)直接传递给remap_pfn_range()
即可。以下是你提出的问题及回答:
kmalloc
返回内核虚拟地址,但保证连续的内存。查看问题116343virt_to_phys()
将内核虚拟地址转换为物理地址。但减少一步操作。ioremap()
返回内核空间的虚拟地址。这个地址不能直接从用户空间访问。有一种叫做 mmap() 的机制,可以参考 这里 和 将物理地址映射到虚拟地址 Linux 获取工作示例。