Linux内核中的内存映射-使用vamlloc()和kmalloc()

问题描述 投票:0回答:1

考虑具有4 GB RAM内存的32bit x86 Linux系统,因此,如书籍以及许多论坛中所述,内存映射将如下所示:

  1. 内核逻辑地址-最多896 MB-一对一映射,可以使用kmalloc()进行分配。
  2. 内核虚拟地址-128MB(高于896MB-内核逻辑地址)-使用vmalloc()分配,并虚拟分配虚拟但连续(分散在RAM中的)非连续的内存页面。

我无法完全理解并需要澄清的几点。

  1. 我的理解是,当使用kmalloc()来分配内存时,它总是从0到896MB,不超过RAM。

  2. 当我们使用vmalloc()分配内存时,该内存是否在RAM中分配了从896MB到4GB范围的任何位置?还是仅在RAM内从896MB到1GB范围内分配?

  3. 当我们说内核只有1GB的虚拟地址空间时,这是否意味着内核无法访问超过1GB的RAM?如果可以的话该怎么做? 128MB的内核虚拟地址空间是否用于此目的?

请帮助。

c memory-management linux-kernel kmalloc vmalloc
1个回答
0
投票

理论上,有3种不同的“内存管理器”。一种管理物理RAM(主要跟踪可用物理RAM的页面),一种管理虚拟空间(映射到每个虚拟地址空间中的虚拟空间,在虚拟地址空间中以固定大小的片段-页面大小工作),第三种管理“堆”(允许将较大的虚拟地址空间区域分成任意大小的片段。]

最初; Linux内核试图使用其内核“堆”来管理所有这三种截然不同的事物。通过将“所有RAM”线性映射到内核空间,它们绕过了管理内核虚拟内存的需求,最终在内核空间中的虚拟地址和物理地址(例如“ physical = virtual-base”)之间建立了简单的关系,并通过分配您还会分配“堆”物理内存。

最初是很好的,因为当时计算机很少具有超过128 MiB的RAM(Linus并不期望内核存在很长时间,因为GNU计划很快转用Hurd)和内核空间比“所有RAM”大得多。随着RAM数量的增加,这成为一个问题-“所有RAM”变得大于内核空间,因此“使用堆来管理3个非常不同的事物”无法正常工作。

当然,一旦成为问题,许多内核代码就依赖于“ kmalloc来分配物理内存”,这使得解决该问题变得非常困难。相反,他们将物理内存划分为2个区域-一个区域由“ kmalloc”管理,另一个区域由“ vmalloc”管理;然后更改内核部分以使用“ vmalloc”而不是“ kmalloc”,在这些地方很容易进行更改。

  1. 我的理解是,使用kmalloc()分配内存时,它总是从0到896MB,不超过RAM。

是;这是物理内存的第一个区域,适合“ kmalloc”使用的内核空间映射。

  1. 当我们使用vmalloc()分配内存时,该内存是否在RAM中分配了从896MB到4GB范围的任何位置?还是仅在RAM内从896MB到1GB范围分配?

它将从不在第一个区域(“ 896MB或更高”范围内的任何地方)的任何RAM中分配。

  1. [当我们说内核只有1GB的虚拟地址空间时,这是否意味着内核无法访问超过1GB的RAM?如果可以的话该怎么做? 128MB的内核虚拟地址空间是否用于此目的?

内核的1 GiB虚拟空间;一些(896MB)将是物理地址空间的线性映射,一些将是内存映射(PCI)设备,而另一些将被保留为可以进行动态映射的区域。对于“ vmalloc”,内核将分配RAM的物理页,然后将它们映射到“动态映射区域”(并返回一个指向与物理地址无关的映射位置的指针,并中断“ physical = virtual-基本”关系)。

注1:确切的大小/限制是可变的-例如内核可以编译为“ 2 GiB / 2 GiB split”,其中内核空间为2 GiB(而不是“ 3 GiB / 1 GiB split”);并且“ kmalloc区域”的大小可能取决于各种因素(PCI设备需要多少空间,有多少RAM等),并且可能不是896MB。

注2:由于引入了“ vmalloc”来解决原始问题;计算机切换到64位(“所有内存”可以/又可以放入内核空间),而“ vmalloc”就变得不必要了(很可能落入“ kmalloc”)。但是,发生了许多其他变化(引入NUMA,加密的RAM,非易失性RAM等),以及比任何人都无法跟踪的更多的安全漏洞),因此原始的设计缺陷已达到暂时的“坏主意,但是,如果我们继续为安全漏洞添加解决方案,则从技术上讲它还是没有损坏的(直到RAM和非易失性RAM的大小不可避免地增加,并且将来某个时候(可能在大约30年后)再次需要“ vmalloc”。] >

© www.soinside.com 2019 - 2024. All rights reserved.