Linux kernel 为什么内核关心发出物理上连续的页面?

Linux kernel 为什么内核关心发出物理上连续的页面?,linux-kernel,Linux Kernel,当进程从Linux内核请求物理内存页时,内核会尽力提供一块在内存中物理连续的页。我想知道为什么页面在物理上是连续的很重要;毕竟,内核可以通过提供几乎连续的页面来掩盖这一事实 然而,内核确实尽了最大的努力来提供物理上连续的页面,所以我试图弄清楚为什么物理上的连续性如此重要。我做了一些研究&,跨越一些来源,发现了以下原因: 1) 更好地利用缓存并实现更低的平均内存访问时间(GigaQuantum:我不明白:如何实现?) 2) 为了映射物理上不连续的页面,您必须摆弄内核页面表(GigaQuantum:

当进程从Linux内核请求物理内存页时,内核会尽力提供一块在内存中物理连续的页。我想知道为什么页面在物理上是连续的很重要;毕竟,内核可以通过提供几乎连续的页面来掩盖这一事实

然而,内核确实尽了最大的努力来提供物理上连续的页面,所以我试图弄清楚为什么物理上的连续性如此重要。我做了一些研究&,跨越一些来源,发现了以下原因:

1) 更好地利用缓存并实现更低的平均内存访问时间(GigaQuantum:我不明白:如何实现?)

2) 为了映射物理上不连续的页面,您必须摆弄内核页面表(GigaQuantum:我不明白这一点:每个页面不是单独映射的吗?需要做什么摆弄?)

3) 映射物理上不连续的页面会导致更大的TLB抖动(GigaQuantum:我不明白:怎么做?)

根据我插入的评论,我并不真正理解这三个原因。我的任何研究来源也没有充分解释/证明这三个原因。有人能更详细地解释一下吗


谢谢!将帮助我更好地理解内核…

实际上,您描述的内存分配行为在许多操作系统内核中都很常见,主要原因是内核物理页分配器。通常,内核有一个物理页面分配器,用于为内核空间(包括DMA页面)和用户空间分配页面。在内核空间中,您需要continuos内存,因为每次需要映射页面时(对于内核内代码而言)都很昂贵。例如,在x86_64上,它完全没有价值,因为内核可以看到整个地址空间(在32位系统上,虚拟地址空间有4G限制,因此通常前1G专用于内核,后3G专用于用户空间)

Linux内核使用算法进行页面分配,因此分配较大的块比分配较小的块所需的迭代次数更少(好吧,较小的块是通过分割较大的块获得的)。此外,对内核空间和用户空间使用一个分配器可以使内核减少碎片。假设您在每次迭代中为用户空间分配1个页面。如果用户空间需要N个页面,则进行N次迭代。如果内核需要一些continuos内存怎么办?如果您从每个大区块中偷走1页并将其提供给用户空间,它如何构建足够大的continuos区块

[更新]

实际上,内核为用户空间分配continuos内存块的频率并不像您想象的那么频繁。当然,当它构建文件的ELF映像时,当它在用户进程读取文件时创建readahead时,当它为IPC操作(管道、套接字缓冲区)创建它们时,或者当用户将MAP_POPULATE标志传递给mmap syscall时,它会分配它们。但内核通常使用“惰性”页面加载方案。它为用户空间提供了连续的虚拟内存空间(当用户第一次执行malloc或mmap时),但它不会用物理页面填充空间。它仅在出现页面错误时分配页面。当用户进程执行fork时也是如此。在这种情况下,子进程将具有“只读”地址空间。当child修改某些数据时,会出现页面错误,内核会用一个新的页面替换子地址空间中的页面(这样父级和子级现在就有了不同的页面)。在这些情况下,内核通常只分配一个页面

当然,内存碎片是一个很大的问题。内核空间总是需要连续的内存。如果内核将从“随机”物理位置为用户空间分配页面,那么在一段时间后(例如,在系统正常运行一周后),要在内核中获得大块continuos内存将困难得多。在这种情况下,内存将过于分散

为了解决这个问题,内核使用“readahead”方案。当某个进程的地址空间出现页面错误时,内核会分配和映射多个页面(因为该进程有可能从下一个页面读/写数据)。当然,在这种情况下,它使用物理上连续的内存块(如果可能的话)。只是为了减少潜在的碎片

  • 把我们将要阅读的东西放在一起可以利用空间位置,我们需要的东西更容易被缓存

  • 我不确定这个

  • 我相信这意味着如果页面不连续,TLB必须做更多的工作来找出它们的位置。如果它们是连续的,我们可以将一个进程的所有页面表示为pages\u START+pages\u OFFSET。如果没有,我们需要为给定进程的所有页面存储一个单独的索引。因为TLB的大小有限,我们需要访问更多的数据,这意味着我们将交换更多的数据


  • 我能想到几个:

    • DMA硬件通常根据物理地址访问内存。如果要从硬件传输多页数据,则需要一块连续的物理内存块。一些较旧的DMA控制器甚至要求内存位于较低的物理地址
    • 它允许操作系统利用大型页面。某些内存管理单元允许您在页表条目中使用较大的页大小。这允许您使用更少的页表条目(和TLB插槽)来访问相同数量的虚拟内存。这降低了TLB未命中的可能性。当然,如果你想分配4MB的页面,你需要4MB的连续物理内存来支持它
    • 内存映射I/O。某些设备可以映射到需要跨越多个帧的连续内存范围的I/O范围

    主要的答案其实在于你自己