linux - 为什么MMIO空间作为单个PTE映射到/dev/mem所以没有struct page?

标签 linux memory-management linux-kernel linux-device-driver mmap

在 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/

相关文章:

c# - 分配内存时线程争用

java - 将 Apache Velocity 与 StringBuilders/CharSequences 结合使用

linux - 测量内核空间中的上下文切换时间

memory-management - 烧录到闪存的​​特定扇区

linux-kernel - ARM 机器/主板 ID

linux - 零扩展寄存器的一部分

linux - 通过系统 PID 获取内部 docker PID

c++ - 将 C/C++ 代码从 Linux 移植到 Windows 的最佳环境

linux - 我应该使用什么 IDE 进行 Linux 模块开发?

c# - 是否必须为 ProcessStartInfo 分配空间?