根据1中初始化的mem_section,如果这个mem_section有SECTION_MARKED_PRESENT flag(present),则为这个mem_section进行虚拟地址到物理地址的页表映射,虚拟地址的起始地址为vmemmap(它为struct page *类型指针),物理地址为存放struct page的内存区域,这个内存区域由sparse_buffer_init()来分配,它所分配的内存的物理地址会大...
struct mem_section_usage { DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION); /* See declaration of similar field in struct zone */ unsigned long pageblock_flags[0]; }; struct page; struct page_ext; struct mem_section { @@ -1183,8 +1201,7 @@ struct mem_section { */ unsigned...
struct mem_section_usage { DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION); /* See declaration of similar field in struct zone */ unsigned long pageblock_flags[0]; }; struct page; struct page_ext; struct mem_section { @@ -1183,8 +1201,7 @@ struct mem_section { */ unsigned...
#define __pfn_to_page(pfn) ({ unsigned long __pfn = (pfn); struct mem_section *__sec = __pfn_to_section(__pfn); __section_mem_map_addr(__sec) + __pfn; }) 就是先找到pfn对应的section,然后在section中保存的地址上翻译出对应pfn的page struct。 既然讲到了这里,我们就要对sparsemem中...
每个section对应的page struct是属于本地NUMA的 怎么样,是不是觉得很完美。这一部分具体的实现可以可以看函数sparse_init()函数。 有了这个基础知识,我们再来看这种情况下_pfn_to_page的定义: #define __pfn_to_page(pfn) ({ unsigned long __pfn = (pfn); struct mem_section *__sec = __pfn_to_secti...
为了支持内存空洞和内存热插拔,稀疏内存模型将物理内存按section管理(对应struct mem_section结构体),section可以灵活的插入和删除。一个section里可容纳2^PFN_SECTION_SHIFT个struct page。在arm64上,PFN_SECTION_SHIFT一般是18,一个struct page对应4KB的页,所以一个section可以管理的物理内存空间是:2^18 * 4KB = ...
如果是开启可非vmemmap的sparse内存模式,则需要增加section字段表示page所处于的mem_section: 当然上述形式如果开启了last_cpupid,则划分如下: 除了上述四种形式,sparse还支持没有node id形式来支持非NUMA系统: 上述几种形式字段的大小以及偏移每个架构都有不同,内核种对每个字段都提供了PGOFF宏,方便统一计算,宏定义位于...
#ifdefCONFIG_CPUSETS/* Protected by ->alloc_lock: */nodemask_t mems_allowed;/* Seqence number to catch updates: */seqcount_t mems_allowed_seq;int cpuset_mem_spread_rotor;int cpuset_slab_spread_rotor;#endif #ifdefCONFIG_CGROUPS/* Control Group info protected by css_set_lock: */struct cs...
InputMemBufferCreate(const string path) OutputMemBufferCreate MemBufferDestroy MemBufferExportFile 模型描述类 GetName GetModelBuffer SetModelBuffer GetFrequency GetFramework GetModelType GetDeviceType GetModelNetSize SetInputDims GetInputDims SetDynamicShapeConfig GetDynamicShapeConf...
如果是开启可非vmemmap的sparse内存模式,则需要增加section字段表示page所处于的mem_section: 当然上述形式如果开启了last_cpupid,则划分如下: 除了上述四种形式,sparse还支持没有node id形式来支持非NUMA系统: 上述几种形式字段的大小以及偏移每个架构都有不同,内核种对每个字段都提供了PGOFF宏,方便统一计算,宏定义位于...