摘要: 在内核已经载入内存、而初始化的汇编程序部分已经执行完毕后,内核必须执行哪些特定于系统的步骤?图3-12给出了各个操作的代码流程图。 该图只包括与内存管理相关的那些函数调用。在这里所有其他的都是不重要的,因此省去。 首先调用machine_specific_memory_setup,创建一个列表,包括 阅读全文
posted @ 2022-03-18 00:24 while(true);; 阅读(72) 评论(0) 推荐(0)
摘要: 图3-11给出物理内存最低几兆字节的布局,以及内核映像的各个部分在其中的驻留情况。 该图给出了物理内存的前几兆字节,具体的长度依赖于内核二进制文件的长度。前4 KiB是第一个页帧,一般会忽略,因为通常保留给BIOS使用。接下来的640 KiB原则上是可用的,但也不用于内 核加载。其原因是,该区域之后 阅读全文
posted @ 2022-03-17 21:13 while(true);; 阅读(86) 评论(0) 推荐(0)
摘要: 由于大部分系统都只有一个内存结点,下文只考察此类系统。具体是什么样的情况呢?为确保内存管理代码是可移植的(因此它可以同样用于UMA和NUMA系统),内核在mm/page_alloc.c中定义 了一个pg_data_t实例(称作contig_page_data)管理所有的系统内存。所有平台上都实现了特 阅读全文
posted @ 2022-03-17 21:06 while(true);; 阅读(80) 评论(0) 推荐(0)
摘要: 在计算各种水印之前,内核首先确定需要为关键性分配保留的内存空间的最小值。该值随可用内存的大小而非线性增长,并保存在全局变量min_free_kbytes中。用户层可通过文件/proc/sys/vm/min_free_kbytes来读取和修改该设置。 数据结构中水印值的填充由init_per_zone 阅读全文
posted @ 2022-03-17 17:05 while(true);; 阅读(97) 评论(0) 推荐(0)
摘要: 图3-3给出了下述内存划分的图示(该情形多少简化了一些,在我们详细讲解数据结构时,读者可以看到这一点)。 首先,内存划分为结点。每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t的实例(稍后定义该数据结构)。各个结点又划分为内存域,是内存的进一步细分。还有一个高端内存区域无法直接映射 阅读全文
posted @ 2022-03-16 22:57 while(true);; 阅读(113) 评论(0) 推荐(0)
摘要: 在启动过程期间, 尽管内存管理尚未初始化, 但是内核仍然需要分配内存以创建各种数据结构. 因此在系统启动过程期间, 内核使用了一个额外的简化形式的内存管理模块引导内存分配器(boot memory allocator–bootmem分配器), 用于在启动阶段早期分配内存, 而在系统初始化完成后, 该 阅读全文
posted @ 2022-01-29 21:40 while(true);; 阅读(75) 评论(0) 推荐(0)
摘要: Linux对内存的管理划分成三个层次,分别是Node、Zone、Page。对这三个层次简介如下: 层次 说明Node(存储节点) CPU被划分成多个节点,每个节点都有自己的一块内存,可以参考NUMA架构有关节点的介绍Zone(管理区) 每一个Node(节点)中的内存被划分成多个管理区域(Zone), 阅读全文
posted @ 2022-01-12 21:05 while(true);; 阅读(142) 评论(0) 推荐(0)