linux 内存区

    GFP_DMA 和 GFP_HIGHMEM 都有一个平台相关的角色, 尽管对所有平台它们的使用都 有效.

Linux 内核知道最少 3 个内存区: DMA-能够 内存, 普通内存, 和高端内存. 尽管通常地 分配都发生于普通区, 设置这些刚刚提及的位的任一个请求从不同的区来分配内存. 这个 想法是, 每个必须知道特殊内存范围(不是认为所有的 RAM 等同)的计算机平台将落入这 个抽象中.

DMA-能够 的内存是位于一个优先的地址范围, 外设可以在这里进行 DMA 存取. 在大部分 的健全的平台, 所有的内存都在这个区. 在 x86, DMA 区用在 RAM 的前 16 MB, 这里传 统的 ISA 设备可以进行 DMA; PCI 设备没有这个限制.

高端内存是一个机制用来允许在 32-位 平台存取(相对地)大量内存. 如果没有首先设置 一个特殊的映射这个内存无法直接从内核存取并且通常更难使用. 如果你的驱动使用大量 内存, 但是, 如果它能够使用高端内存它将在大系统中工作的更好. 高端内存如何工作以 及如何使用它的详情见第 1 章的"高端和低端内存"一节.

无论何时分配一个新页来满足一个内存分配请求, 内核都建立一个能够在搜索中使用的内 存区的列表. 如果 GFP_DMA 指定了, 只有 DMA 区被搜索: 如果在低端没有内存可用, 分配失败. 如果没有特别的标志存取, 普通和 DMA 内存都被搜索; 如果 GFP_HIGHMEM 设置了, 所有的 3 个区都用来搜索一个空闲的页. (注意, 但是, kmalloc 不能分配高端 内存.)

情况在非统一内存存取(NUMA)系统上更加复杂. 作为一个通用的规则, 分配器试图定位进 行分配的处理器的本地的内存, 尽管有几个方法来改变这个行为.

内存区后面的机制在 mm/page_alloc.c 中实现, 而内存区的初始化在平台特定的文件中, 常常在 arch 目录树的 mm/init.c. 我们将在第 15 章再次讨论这些主题.

原文地址:https://www.cnblogs.com/fanweisheng/p/11142067.html