From d6592f8ea8373309051a8946db86ae6a281f74d2 Mon Sep 17 00:00:00 2001 From: gatieme Date: Wed, 31 Aug 2016 14:56:58 +0800 Subject: [PATCH] ... --- .../01-description/03-zone/README.md | 27 +++++++++--------- .../03-zone/images/legacy-order.jpg | Bin 0 -> 11697 bytes .../03-zone/images/node-order.jpg | Bin 0 -> 17683 bytes .../03-zone/images/zone-order.jpg | Bin 0 -> 17806 bytes 4 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 study/kernel/02-memory/01-description/03-zone/images/legacy-order.jpg create mode 100644 study/kernel/02-memory/01-description/03-zone/images/node-order.jpg create mode 100644 study/kernel/02-memory/01-description/03-zone/images/zone-order.jpg diff --git a/study/kernel/02-memory/01-description/03-zone/README.md b/study/kernel/02-memory/01-description/03-zone/README.md index 96d14dc..d085d33 100644 --- a/study/kernel/02-memory/01-description/03-zone/README.md +++ b/study/kernel/02-memory/01-description/03-zone/README.md @@ -3,7 +3,7 @@ | 日期 | 内核版本 | 架构| 作者 | GitHub| CSDN | | ------- |:-------:|:-------:|:-------:|:-------:|:-------:| -| 2016-06-14 | [Linux-4.7](http://lxr.free-electrons.com/source/?v=4.7) | X86 & arm | [gatieme](http://blog.csdn.net/gatieme) | [LinuxDeviceDrivers](https://github.com/gatieme/LDD-LinuxDeviceDrivers) | [Linux内存管理](http://blog.csdn.net/gatieme/article/category/6225543) | +| 2016-06-14 | [Linux-4.7](http://lxr.free-electrons.com/source/?v=4.7) | X86 & arm | [gatieme](http://blog.csdn.net/gatieme) | [LinuxDeviceDrivers](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/kernel/02-memory/01-description/03-zone) | [Linux内存管理](http://blog.csdn.net/gatieme/article/category/6225543) | @@ -128,7 +128,7 @@ Linux使用enum zone_type来标记内核所支持的所有内存区域 zone_type结构定义在[include/linux/mmzone.h](http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=4.7#L267), 其基本信息如下所示 -```c +```cpp enum zone_type { #ifdef CONFIG_ZONE_DMA @@ -704,7 +704,7 @@ enum zone_stat_item struct zone中实现了一个等待队列, 可用于等待某一页的进程, 内核将进程排成一个列队, 等待某些条件. 在条件变成真时, 内核会通知进程恢复工作. -```c +```cpp struct zone { wait_queue_head_t *wait_table; @@ -730,13 +730,13 @@ struct zone 也可以有一种可能,就是struct zone中只有一个队列,但是这就意味着,当一个page unlock的时候,访问这个zone里内存page的所有休眠的进程将都被唤醒,这样就会出现拥堵(thundering herd)的问题。建立一个哈希表管理多个等待队列,能解决这个问题,zone->wait_table就是这个哈希表。哈希表的方法可能还是会造成一些进程不必要的唤醒。但是这种事情发生的机率不是很频繁的。下面这个图就是进程及等待队列的运行关系: -等待队列的哈希表的分配和建立在free_area_init_core()函数中进行。哈希表的表项的数量在wait_table_size() 函数中计算,并且保持在zone->wait_table_size成员中。最大4096个等待队列。最小是NoPages / PAGES_PER_WAITQUEUE的2次方,NoPages是zone管理的page的数量,PAGES_PER_WAITQUEUE被定义256。(原文:For smaller tables, the size of the table is the minimum power of 2 required to store NoPages / PAGES PER WAITQUEUE number of queues, where NoPages is the number of pages in the zone and PAGE PER WAITQUEUE is defined to be 256.) -下面这个公式可以用于计算这个值: +等待队列的哈希表的分配和建立在`free_area_init_core`函数中进行。哈希表的表项的数量在wait_table_size() 函数中计算,并且保持在zone->wait_table_size成员中。最大4096个等待队列。最小是NoPages / PAGES_PER_WAITQUEUE的2次方,NoPages是zone管理的page的数量,PAGES_PER_WAITQUEUE被定义256 + +`zone->wait_table_bits`用于计算:根据page 地址得到需要使用的等待队列在哈希表中的索引的算法因子. page_waitqueue()函数负责返回zone中page所对应等待队列。它用一个基于struct page虚拟地址的简单的乘法哈希算法来确定等待队列的. -zone->wait_table_bits用于计算:根据page 地址得到需要使用的等待队列在哈希表中的索引的算法因子。page_waitqueue()函数负责返回zone中page所对应等待队列。它用一个基于struct page虚拟地址的简单的乘法哈希算法来确定等待队列的。 page_waitqueue()函数用GOLDEN_RATIO_PRIME的地址和“右移zone→wait_table_bits一个索引值”的一个乘积来确定等待队列在哈希表中的索引的。 -Zone的初始化 -在kernel page table通过paging_init()函数完全建立起z来以后,zone被初始化。下面章节将描述这个。当然不同的体系结构这个过程肯定也是不一样的,但它们的目的却是相同的:确定什么参数需要传递给free_area_init()函数(对于UMA体系结构)或者free_area_init_node()函数(对于NUMA体系结构)。这里省略掉NUMA体系结构的说明。 + +Zone的初始化, 在kernel page table通过paging_init()函数完全建立起z来以后,zone被初始化。下面章节将描述这个。当然不同的体系结构这个过程肯定也是不一样的,但它们的目的却是相同的:确定什么参数需要传递给free_area_init()函数(对于UMA体系结构)或者free_area_init_node()函数(对于NUMA体系结构)。这里省略掉NUMA体系结构的说明。 free_area_init()函数的参数: unsigned long *zones_sizes: 系统中每个zone所管理的page的数量的数组。这个时候,还没能确定zone中那些page是可以分配使用的(free)。这个信息知道boot memory allocator完成之前还无法知道。 来源: http://www.uml.org.cn/embeded/201208071.asp @@ -976,6 +976,7 @@ struct zonelist { 而struct zoneref结构的定义如下[include/linux/mmzone.h?v=4.7, line 583](http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=4.7#L583) +```cpp /* * This struct contains information about a zone in a zonelist. It is stored * here to avoid dereferences into large structures and lookups of tables @@ -984,7 +985,7 @@ struct zoneref { struct zone *zone; /* Pointer to actual zone */ int zone_idx; /* zone_idx(zoneref->zone) */ }; - +``` ##6.3 内存域的排列方式 ------- @@ -996,18 +997,18 @@ NUMA系统中存在多个节点, 每个节点对应一个`struct pglist_data`结 * Legacy方式, 每个节点只排列自己的zone; -![Legacy方式](../images/legacy-order.jpg) +![Legacy方式](./images/legacy-order.jpg) * Node方式, 按节点顺序依次排列,先排列本地节点的所有zone,再排列其它节点的所有zone。 -![Node方式](../images/node-order.jpg) +![Node方式](./images/node-order.jpg) * Zone方式, 按zone类型从高到低依次排列各节点的同相类型zone -![Zone方式](../images/zone-order.jpg) +![Zone方式](./images/zone-order.jpg) @@ -1028,7 +1029,7 @@ NUMA系统中存在多个节点, 每个节点对应一个`struct pglist_data`结 -全局的current_zonelist_order变量标识了系统中的当前使用的内存域排列方式, 默认配置为ZONELIST_ORDER_DEFAULT, 参见[mm/page_alloc.c?v=4.7, line 4564](http://lxr.free-electrons.com/source/mm/page_alloc.c?v=4.7#L4564) +全局的`current_zonelist_order`变量标识了系统中的当前使用的内存域排列方式, 默认配置为`ZONELIST_ORDER_DEFAULT`, 参见[`mm/page_alloc.c?v=4.7, line 4564`](http://lxr.free-electrons.com/source/mm/page_alloc.c?v=4.7#L4564) ```cpp diff --git a/study/kernel/02-memory/01-description/03-zone/images/legacy-order.jpg b/study/kernel/02-memory/01-description/03-zone/images/legacy-order.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52769b11fcbe02dfef6414efd55e90a6dacd3bef GIT binary patch literal 11697 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 literal 0 HcmV?d00001 diff --git a/study/kernel/02-memory/01-description/03-zone/images/zone-order.jpg b/study/kernel/02-memory/01-description/03-zone/images/zone-order.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9afab047b889ba4ae5bc9715b7da3db48d40ef9 GIT binary patch literal 17806 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 Z;b+NZ;j(kv1Sm5TNX+|)z7Y82{{eb!(f|Me literal 0 HcmV?d00001