当通过分配内存kmalloc
(即类似 的 slab 缓存分配slab_alloc_node
)时,它会返回一个虚拟内存地址。据推测,当访问这个虚拟地址时,相应的 PTE(将虚拟地址转换为物理地址)已经存在,从而可以进行地址转换,因为内核地址不允许页面错误。谁创建了这个 PTE,它是什么时候创建的?
我使用的是 64 位系统,而不是 32 位系统。我知道在 32 位系统中有一个“低内存”区域(通常在 1GiB 以内),并且这个低内存在启动期间会预先映射到物理内存。
但是,我很好奇这在 64 位系统上是如何工作的。根据此 StackOverflow 帖子 ( https://stackoverflow.com/questions/30541036/will-physical-addresses-of-all-paging-structures-in-linux-be-mapped-in-the-page ),它说在 64 位系统上,
“所有物理地址始终与内核一半的地址空间中的 Supervisor 映射进行映射。”
,这里(vmalloc() 在哪些进程的页表中分配新内存?)说
kmalloc 的页表条目已分配。
我想验证这是否属实。我持怀疑态度的原因如下:假设我的机器有 128GiB 的 DRAM,每个 PTE 为 8 字节。那么,仅页表本身就需要 256MiB(128GiB/4KiB * 8Byte)。但是当我在启动后运行 numastat -m 时,PageTable 的大小似乎没有那么大。所以我想知道到底发生了什么。