在 Linux 上,MMIO 空间被映射(例如通过/dev/mem,通过调用 remap_pfn_range()
)作为单个 PTE,因此没有结构页。
为什么Linux不创建大量带有struct page的PTE?
最佳答案
我会尽力回答这个问题。当你问时,我不清楚你到底在问什么,Why Linux does not create a lot of PTE with struct page?
。但是,我认为您的主要问题是,“为什么 MMIO 不使用 struct page
?”但你也提到,as a single PTE so there is no struct page
。一些澄清:
- 如果 MMIO 区域小于或等于页面大小,则只会有一个 PTE。如果 MMIO 区域大于一个页面,就会有多个 PTE。
- 有一个
struct page
,当MMIO发生时它只是“不使用”。
根据我的理解,答案是:
只有一个struct page
对于物理内存中的每个页面。 struct page
映射到内存中的页面永远不会改变(尽管内存中的底层数据可能会改变)。 struct page
存储有关内存中物理页的使用信息。另请注意,单个 struct page
内存中每个物理页都存在。一般来说,引用这些struct page
保存在众所周知的位置,通常是 mem_map
.
此外,请记住,Linux 页表条目 (PTE) 还存储有关页面的使用信息。 Linux PTE 大致与给定页面的任何硬件内存管理单元的“PTE”保持同步。
如果物理内存地址映射到设备(即MMIO),则没有struct page
s 为设备的内存。 struct page
这些物理地址处的物理内存的 s 仍然存在,但它们没有像平常那样使用,因为该物理内存现在未使用(但物理地址用于指向不再在物理内存中,而是在设备内存中)。
记住,存在一个struct page
对于物理内存中已知位置的每个页面:一个名为 mem_map
的预分配数组.
因此,PTE 足以跟踪设备内存的状态。 struct page
结构体是专门针对系统物理内存中的内存的。但页表条目可用于跟踪任何内存的状态,而不仅仅是物理内存。
关于linux - 为什么MMIO空间作为单个PTE映射到/dev/mem所以没有struct page?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27633439/