众所周知,MMIO空间被映射(例如,通过/dev/mem,通过调用remap_pfn_range()作为单个PTE来映射,这样就没有struct页面了。
在使用ioremap_wc()时也是这样吗,还是ioremap_wc()创建了一个由页面和许多PTE组成的结构?
操作系统: Linux x86_64
发布于 2015-01-06 15:48:02
你的问题表达得有点令人困惑,但我想我可以回答。
首先,要明确的是,mmap /dev/mem (使用remap_pfn_range)并不保证只使用一个PTE。如果要映射的区域位于单个页面内,则只使用一个页面;否则,它将使用所需的多个页面。( PTE是一个页面表条目,因此它精确地映射了一个物理页面。当然,页面大小(或大小)与体系结构有关。
"struct页“用于管理实际内存--即:系统RAM /非MMIO空间。( RAM和MMIO空间都是物理页,因为它们占用物理地址空间并具有地址,但struct页仅用于通用内存,程序和任意数据可以放在其中。)
正确的是,ioremap_wc和所有其他ioremap变体很像mmap通过/dev/mem对MMIO空间的映射,只是它们只供内核使用。在最低级别,他们最终使用相同的代码来创建PTE(除了那些PTE引用内核虚拟地址空间而不是用户虚拟地址空间)。ioremap调用分配一个"vm_struct“来跟踪虚拟到物理映射,然后设置PTE将虚拟地址实际映射到物理。
因此,主要区别在于它们是如何被跟踪/管理的。内核代码被期望干净地释放/释放它自己的VM区域和PTE。OTOH,不信任用户进程执行此操作。因此,/dev/mem的mmap设置了与进程相关联的VM结构,以便如果进程退出,内核可以找到并释放任何映射,等等。
https://stackoverflow.com/questions/27797560
复制相似问题