Global kva allocator

2024-01-30 12:18
文章标签 global allocator kva

本文主要是介绍Global kva allocator,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


Global kva allocator 数据结构


/*** Global kva allocator ***/#define VM_LAZY_FREE	0x01
#define VM_LAZY_FREEING	0x02
#define VM_VM_AREA	0x04struct vmap_area {unsigned long va_start;unsigned long va_end;unsigned long flags;    /* 参见上面,如VM_VM_AREA  */struct rb_node rb_node;		/* address sorted rbtree */struct list_head list;		/* address sorted list */struct list_head purge_list;	/* "lazy purge" list */void *private;struct rcu_head rcu_head;
};struct vm_struct {struct vm_struct	*next;void			*addr;unsigned long		size;unsigned long		flags;struct page		**pages;unsigned int		nr_pages;unsigned long		phys_addr;void			*caller;
};

两者关系

static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va,unsigned long flags, void *caller)
{vm->flags = flags;vm->addr = (void *)va->va_start;vm->size = va->va_end - va->va_start;vm->caller = caller;va->private = vm;va->flags |= VM_VM_AREA;
}


vmalloc

/***	vmalloc  -  allocate virtually contiguous memory*	@size:		allocation size*	Allocate enough pages to cover @size from the page level*	allocator and map them into contiguous kernel virtual space.**	For tight control over page level allocator and protection flags*	use __vmalloc() instead.*/
void *vmalloc(unsigned long size)
{return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL,-1, __builtin_return_address(0));
}

__vmalloc_node

/***	__vmalloc_node  -  allocate virtually contiguous memory*	@size:		allocation size*	@align:		desired alignment*	@gfp_mask:	flags for the page level allocator*	@prot:		protection mask for the allocated pages*	@node:		node to use for allocation or -1*	@caller:	caller's return address**	Allocate enough pages to cover @size from the page level*	allocator with @gfp_mask flags.  Map them into contiguous*	kernel virtual space, using a pagetable protection of @prot.*/
static void *__vmalloc_node(unsigned long size, unsigned long align,gfp_t gfp_mask, pgprot_t prot,int node, void *caller)
{struct vm_struct *area;void *addr;unsigned long real_size = size;size = PAGE_ALIGN(size);if (!size || (size >> PAGE_SHIFT) > totalram_pages)return NULL;area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST,VMALLOC_START, VMALLOC_END, node,gfp_mask, caller);if (!area)return NULL;addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller);/** In this function, newly allocated vm_struct is not added* to vmlist at __get_vm_area_node(). so, it is added here.*/insert_vmalloc_vmlist(area);/** A ref_count = 3 is needed because the vm_struct and vmap_area* structures allocated in the __get_vm_area_node() function contain* references to the virtual address of the vmalloc'ed block.*/kmemleak_alloc(addr, real_size, 3, gfp_mask);return addr;
}

__get_vm_area_node

static struct vm_struct *__get_vm_area_node(unsigned long size,unsigned long align, unsigned long flags, unsigned long start,unsigned long end, int node, gfp_t gfp_mask, void *caller)
{static struct vmap_area *va;struct vm_struct *area;BUG_ON(in_interrupt());if (flags & VM_IOREMAP) {int bit = fls(size);if (bit > IOREMAP_MAX_ORDER)bit = IOREMAP_MAX_ORDER;else if (bit < PAGE_SHIFT)bit = PAGE_SHIFT;align = 1ul << bit;}size = PAGE_ALIGN(size);if (unlikely(!size))return NULL;area = kzalloc_node(sizeof(*area), gfp_mask & GFP_RECLAIM_MASK, node);if (unlikely(!area))return NULL;/** We always allocate a guard page.*/size += PAGE_SIZE;/** Allocate a region of KVA of the specified size and alignment, within the* vstart and vend.*//* 用rb树管理vmalloc地址空间,找到一个大小合适的空洞,也就是一个连续的虚拟地址空间 */va = alloc_vmap_area(size, align, start, end, node, gfp_mask);  /* 找到一个大小合适的空洞 */if (IS_ERR(va)) {kfree(area);return NULL;}/** When this function is called from __vmalloc_node,* we do not add vm_struct to vmlist here to avoid* accessing uninitialized members of vm_struct such as* pages and nr_pages fields. They will be set later.* To distinguish it from others, we use a VM_UNLIST flag.*/if (flags & VM_UNLIST)setup_vmalloc_vm(area, va, flags, caller);elseinsert_vmalloc_vm(area, va, flags, caller);return area;
}

__vmalloc_area_node

static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,pgprot_t prot, int node, void *caller)
{struct page **pages;unsigned int nr_pages, array_size, i;nr_pages = (area->size - PAGE_SIZE) >> PAGE_SHIFT;  /* 有一页空闲,作为gap */array_size = (nr_pages * sizeof(struct page *));    /* 分配一个page数组*/area->nr_pages = nr_pages;/* Please note that the recursion is strictly bounded. */if (array_size > PAGE_SIZE) {   /* 数组太大,用vmalloc分配,注意递归 */pages = __vmalloc_node(array_size, 1, gfp_mask | __GFP_ZERO,PAGE_KERNEL, node, caller);area->flags |= VM_VPAGES;} else {pages = kmalloc_node(array_size,    /* 数组小于1page, 用kmalloc分配 */(gfp_mask & GFP_RECLAIM_MASK) | __GFP_ZERO,node);}area->pages = pages;area->caller = caller;if (!area->pages) {remove_vm_area(area->addr);kfree(area);return NULL;}for (i = 0; i < area->nr_pages; i++) {struct page *page;if (node < 0)   /* 一页一页分配物理内存,注意,完全不保证物理内存连续性 */page = alloc_page(gfp_mask);    /* 记住,标志中有__GFP_HIGHMEM */elsepage = alloc_pages_node(node, gfp_mask, 0);if (unlikely(!page)) {/* Successfully allocated i pages, free them in __vunmap() */area->nr_pages = i;goto fail;}area->pages[i] = page;}if (map_vm_area(area, prot, &pages))    /* 一页一页分配,但是映射到一个连续的kva范围上去 */goto fail;return area->addr;fail:vfree(area->addr);return NULL;
}


这篇关于Global kva allocator的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660211

相关文章

关于OceanBase MySQL 模式中全局索引 global index 的常见问题

在OceanBase的问答区和开源社区钉钉群聊中,时常会有关于全局索引 global index的诸多提问,因此,借这篇博客,针对其中一些普遍出现的问题进行简要的解答。 什么是 global index ? 由于 MySQL 不具备 global index 的概念,因此这一问题会经常被社区版用户提及。就在前几天,就要人询问下面这个语法的意义。 create table part_tes

$GLOBALS与global区别 变量销毁机制

代码一: <?php$var1 = 1;function test1(){global $var1; #等价于 $var1 = &$GLOBALS['var1']; 这里的$var1跟外面的$var1是不同的指针,但指向同样的数据unset($var1); #当你unset一个引用,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了.echo $var1; #P

【matlab】global的用法

>> help globalglobal - Declare global variables 声明全局变量This MATLAB function defines X, Y, and Z as global in scope. %此函数定义X,Y,Z为全局global X Y Zglobal 的参考页另请参阅 clear, isglobal, who名为 global 的其他函数mbc/Gl

NLP-2015:Luong NMT模型【Attention类型:Global Attention、Local Attention(实践中很少用)】

《原始论文:Effective Approaches to Attention-based Neural Machine Translation》 在实际应用中,全局注意力机制比局部注意力机制有着更广泛的应用,因为局部注意力机制需要预测一个位置向量 p t p_t pt​,而这个位置向量的预测并不是非常准确的,会影响对齐向量的准确率。同时,在处理不是很长的源端句子时,相比于全局注意力并没有减少

5-global_data介绍

[uboot] (番外篇)global_data介绍 2016年11月02日 22:05:49 阅读数:2266 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程(BL0-BL2) [uboot] (第一章)uboot流程

DECLARE_GLOBAL_DATA_PTR、gd_t、bd_t及uboot中 start_armboot 代码分析

一、Uboot中DECLARE_GLOBAL_DATA_PTR 只是一个定义的宏,这个宏定义了一个gd_t全局数据结构的指针,这个指针存放在指定的寄存器中(386体系结构没有放到指定寄存器中)。这个宏定义在\include\asm-arm\globe_data.h文件中 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *g

Global.asaxnbsp;文件是什么

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法。你可以使用这个文件实现应用程序安全性以及其它一些任务。下面让我们详细看一下如何在应用程序开发工作中使用这个文件。 概述    Global.asax 位于应用程序根目录下。虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目

朴世龙院士团队《Global Change Biology 》精确量化全球植被生产力对极端温度的响应阈值!

本文首发于“生态学者”微信公众号! 随着全球气候变暖的加剧,极端温度事件对陆地生态系统的影响日益显著。植被作为生态系统的重要组成部分,其生产力对温度变化的响应尤为敏感。然而,关于极端温度如何以及在何种程度上影响植被生产力的具体机制,科学界尚未形成统一认识。这一问题不仅关系到生态系统的健康和稳定,也直接影响到全球生物多样性和人类社会的可持续发展。 本研究通过分析2001年至2018年的生

全局上下文视觉转换器(Global Context Vision Transformers)

摘要 https://arxiv.org/pdf/2206.09959 我们提出了全局上下文视觉转换器(GC ViT),这是一种新颖的架构,旨在提高计算机视觉中的参数和计算利用率。我们的方法利用全局上下文自注意力模块与标准的局部自注意力相结合,以有效且高效的方式对长程和短程空间交互进行建模,而无需执行昂贵的操作,如计算注意力掩码或移动局部窗口。此外,我们还解决了ViT中归纳偏差缺失的问题,并提出