众所周知,MMIO空间被映射(例如通过/dev/mem,通过调用remap_pfn_range())为单个PTE,因此没有结构页。
当使用ioremap_wc()
时是同样的事情,还是ioremap_wc()
创建了页面和许多pte的结构?
操作系统:Linux x86_64
最佳答案
你的问题表达得有些混乱,但我想我能回答。
首先,要清楚的是,/dev/mem的mmap(使用remap_pfn_range)不能保证只使用一个PTE。如果要映射的区域适合一个页面,它将只使用一个PTE;否则,它将使用所需的所有PTE。(PTE是一个页表条目;因此它只映射一个物理页。页面大小当然取决于体系结构。)
“结构页”用于管理实际内存——即:系统RAM/非MMIO空间。(RAM和MMIO空间都是物理页,因为它们占用物理地址空间并有地址,但结构页仅用于可放置程序和任意数据的通用内存。)
ioremap_wc和所有其他ioremap变体非常类似于通过/dev/mem使用MMIO空间的mmap,这是正确的,只是它们只用于内核。在最低级别,它们最终使用相同的代码创建pte(除了那些pte引用内核虚拟地址空间而不是用户虚拟地址空间)。ioremap调用分配一个“vm_struct”来跟踪虚拟到物理的映射,然后设置PTEs来实际将虚拟地址映射到物理。
主要区别在于如何跟踪/管理它们。内核代码应该干净地释放/释放自己的VM区域和pte。哦,不信任用户进程来执行此操作。因此,MMAP /DEV/MEM建立与进程相关联的VM结构,以便如果进程退出,内核可以找到并释放任何映射等。
关于linux - ioremap_wc()是否创建页面和许多PTE的结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27797560/