Linux内存管理详解

上传人:206****923 文档编号:41338217 上传时间:2018-05-29 格式:DOCX 页数:21 大小:85.79KB
返回 下载 相关 举报
Linux内存管理详解_第1页
第1页 / 共21页
Linux内存管理详解_第2页
第2页 / 共21页
Linux内存管理详解_第3页
第3页 / 共21页
Linux内存管理详解_第4页
第4页 / 共21页
Linux内存管理详解_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《Linux内存管理详解》由会员分享,可在线阅读,更多相关《Linux内存管理详解(21页珍藏版)》请在金锄头文库上搜索。

1、13. 内存管理内存管理13.1. 引言引言Linux 对物理内存的描述机制有两种:UMA 和 NUMA。Linux 把物理内存划分 为三个层次来管理:存储节点(Node)、管理区(Zone)和页面 (Page)。 UMA 对应一致存储结构,它只需要一个 Node 就可以描述当前系统中的物理内 存,但是 NUMA 的出现打破了这种平静,此时需要多个 Node,它们被统一定 义为一个名为 discontig_node_data 的数组。为了和 UMA 兼容,就将描述 UMA 存储结构的描述符 contig_page_data 放到该数组的第一个元素中。内核配置选 项 CONFIG_NUMA 决定

2、了当前系统是否支持 NUMA 机制。此时无论 UMA 还 是 NUMA,它们都是对应到一个类型为 pg_data_t 的数组中,便于统一管理。图图 71. Node Zone 和和 Page 的关系的关系上图描述 Linux 管理物理内存的三个层次之间的拓扑关系。从图中可以看出一 个存储节点由 pg_data_t 描述,一个 UMA 系统中只有一个 Node,而 在 NUMA 中则可以存在多个 Node。它由 CONFIG_NODES_SHIFT 配置选项决定,它是 CONFIG_NUMA 的子选项,所以只有配置了 CONFIG_NUMA,该选项才起作 用。UMA 情况下,NODES_SHIF

3、T 被定义为 0,MAX_NUMNODES 也即为 1。 include/linux/numa.h#ifdef CONFIG_NODES_SHIFT #define NODES_SHIFT CONFIG_NODES_SHIFT #else #define NODES_SHIFT 0 #endif#define MAX_NUMNODES (1 setup_arch-paging_init-bootmem_init-bootmem_free_node- free_area_init_node-free_area_init_core在理想的计算机体系结构中,一个物理页框就是一个内存存储单元,可用于任

4、 何事情:存放内核数据和用户数据,磁盘缓冲数据等。热河中磊的数据页都可 以存放在 任何页框中,没有什么限制。但是,实际的计算机体系结构有硬件的 制约,这制约页框可以使用的方式。尤其是 Linux 内核必须处理 80x86 体系结 构的两种 硬件约束: ISA 总线的直接内存存取 DMA 访问控制器只能对 RAM 的低 16MB 寻址。在具有大容量 RAM 的现代 32 位计算机中,由于线性地址空间的限制, CPU 不能直接访问所有的物理内存。最后一种限制不仅存在于 80x86,而存在于所有的体系结构中。为了应对这两 种限制,Linux 把每个内存节点的物理内存划分为多个(通常为 3 个)管理区

5、 (zone)。在 80x86 UMA 体系结构中的管理区为: ZONE_DMA,包含低于 16MB 的内存页框。ZONE_NORMAL,包含高于 16MB 且低于 896MB 的内存页框。ZONE_HIGHMEM,包含从 896MB 开始的内存页框。对于 ARM 来说,ZONE_HIGHMEM 被名为 ZONE_MOVABLE 的宏取代,而 ZONE_DMA 也不会仅限于最低的 16MB,而可能对应所有的内存区域,此时只 有内存节点 ZONE_DMA 有效,所以 ZONE_DMA 并不一定名副其实的用来作 为 DMA 访问之用。 ZONE_DMA 和 ZONE_NORMAL 区包含内存的“常

6、规“页框,通过把它们线性的 映射到线性地址的第 4 个 GB(0xc0000000-0xcfffffff),内核就可以直接访问。 相反 ZONE_HIGHMEM 或者 ZONE_MOVABLE 区包含的内存页不 能由内核 直接访问,尽管它们也线性地映射到了线性地址空间的第 4 个 GB。每个内存 管理区都有自己的描述符 struct zone。它用来保存管理区的跟踪信息:内存使 用统计,空闲区,锁定区等。 include/linux/mmzone.h struct zone /* Fields commonly accessed by the page allocator */unsigned

7、 long pages_min, pages_low, pages_high;unsigned long lowmem_reserveMAX_NR_ZONES;struct per_cpu_pageset pagesetNR_CPUS;struct free_area free_areaMAX_ORDER;ZONE_PADDING(_pad1_)/* Fields commonly accessed by the page reclaim scanner */spinlock_t lru_lock;struct struct list_head list;unsigned long nr_sc

8、an; lruNR_LRU_LISTS;unsigned long recent_rotated2;unsigned long recent_scanned2;unsigned long pages_scanned; /* since last reclaim */unsigned long flags; /* zone flags, see below */* Zone statistics */atomic_long_t vm_statNR_VM_ZONE_STAT_ITEMS; ;pages_min,记录管理区中空闲页的数目。pages_low,回收页框使用的下届,同时也被管理区分配器作

9、为阈值使用。pages_high,回收页框使用的上届,同时也被管理区分配器作为阈值使用。lowmem_reserve,指明在处理内存不足的临界情况下每个管理区必须保 留的页框数目。pageset,单一页框的特殊告诉缓存。在申请内存时,会遇到两种情况:如果有足够的空闲页可用,请求就会被立刻 满足;否则,必须回收一些内存,并且将发出请求的内核控制路径阻塞,直到有 内存被 释放。不过有些内存请求不能被阻塞。这种情况发生在处理中断或在执 行临界区内的代码时。在这些情况下,一条内核控制路径应使用原子内存分配 请求 (GFP_ATOMIC)。原子请求从不被阻塞;如果没有足够的空闲页,则仅仅 是分配失败而已

10、。内核为了尽可能保证一个原子内存分配请求成功,它为原子内存分配请求保留 了一个页框池,只有在内存不足时才使用。保留内存的数量存放在 min_free_kbytes 变量中,单位为 KB。 mm/page_alloc.cint min_free_kbytes = 1024; ./* min_free_kbytes = sqrt(lowmem_kbytes * 16); */ lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE 10); min_free_kbytes = int_sqrt(lowmem_kbytes * 16);min_free

11、_kbytes 由当前直接映射区的物理内存数量决定。也即 ZONE_DMA 和 ZONE_NORMAL 内存管理区的可用页框数决定,这可以 通过 nr_free_buffer_pages 获取。尽管可以通过/proc/sys/vm/min_free_kbytes 来修改该 它的大小,但是 min_free_kbytes 的初始值范围必须是128K, 64M。管理区描 述符中的 pages_min 成员存储了管理区内保留页框的数目。这个字段与 pages_low 和 pages_high 字段一起被用在内 存分配和回收算法中。pages_low 字 段总是被设为 pages_min 的值的 5/

12、4,而 pages_high 则总是被设为 pages_min 的 值的 3 /2。这些值在模块快初始化 module_init 调用的 init_per_zone_pages_min 中被设置。 表表 27. 页面分配控制页面分配控制名称名称大小大小 pages_min min_free_kbytes (PAGE_SHIFT - 10) pages_low pages_min * 5 / 4 pages_high pages_min * 3 / 2free_area_init_core 中对管理区初始化的代码部分如下,后续章节将对该函数进 一步分析。 zone-spanned_pages =

13、 size; zone-present_pages = realsize;zone-name = zone_namesj; spin_lock_init( spin_lock_init( zone_seqlock_init(zone); zone-zone_pgdat = pgdat;zone-prev_priority = DEF_PRIORITY;zone_pcp_init(zone); for_each_lru(l) INIT_LIST_HEAD( zone-lrul.nr_scan = 0; zone-recent_rotated0 = 0;zone-recent_rotated1 =

14、 0; zone-recent_scanned0 = 0; zone-recent_scanned1 = 0; zap_zone_vm_stats(zone); zone-flags = 0;13.2. page 管理项管理项struct page unsigned long flags;/* Atomic flags, some possibly* updated asynchronously */ atomic_t _count;/* Usage count, see below. */ union atomic_t _mapcount;/* Count of ptes mapped in

15、 mms,* to show when page is mapped* u16 objects; ; ; 每一个物理页框都需要一个对应的 page 结构来进行管理:记录分配状态,分配 和回收,互斥以及同步操作。对该结构成员的解释如下: flag 域存放当前页框的页标志,它存储了体系结构无关的状态,专门供 Linux 内核自身使用。该标志可能的值定义在 include/linux/page-flags.h 中。原子计数成员_count 则指明了当前页框的引用计数,当该值为 0 时,就 说明它没有被使用,此时在新分配内存时它就可以被使用。内核代码应 该通过 page_count 来访问它,而非直接访问。原子计数成员_mapcount 表示在页表中有多少页指向该页框。在 SLUB 中它被 inuse 和 objects 代替。include/linux/page-flags.h enum pageflags PG_locked, /* Page is locked. Dont touch. */PG_error,PG_referenced,PG_uptodate,PG_dirty,PG_lru,PG_active,._NR_PAGEFLAGS,. 以上是页标志位的可能取值,通常不应该直接使用这些标志位,而应该内核预 定义好的宏

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号