首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

内存分配算法 伙伴系统

伙伴系统是常用的内存分配算法,linux内核的底层页分配算法就是伙伴系统,伙伴系统的优点就是分配和回收速度快,减少外部碎片。...然后又看了一下linux4.8的buddy system实现,linux的buddy system主要进行page分配也是linux最底层的分配,其他的分配算法都是以这个分配为基础,在x86架构下一个page...linux对内存进行了分区包括低端内存区,高端内存区,dma区,而且还对numa架构做了很多处理,对页面也进行了分类,这些不是讨论的重点,现在主要是提取linux的buddy算法,只提取核心部分,可以在控制台下运行...最大的是10,也就是1024个基本单位,所以linux在x86下一次最多可分配4MB内存。  ...PAGE_NUMS]; free_area_t free_area[MAX_ORDER]; #define PAGE_TO_PFN(page) ((unsigned int)(page - mem_map

1.5K10
您找到你想要的搜索结果了吗?
是的
没有找到

物理地址和虚拟地址的分布

物理地址空间布局 Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...由于 ZONE_NORMAL 和内核线性空间存在直接映射关系,所以内核会将频繁使用的数据如 Kernel 代码、GDT、IDT、PGD、mem_map 数组等放在 ZONE_NORMAL 里。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

2K111

物理地址和虚拟地址的分布

物理地址空间布局 Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...由于 ZONE_NORMAL 和内核线性空间存在直接映射关系,所以内核会将频繁使用的数据如 Kernel 代码、GDT、IDT、PGD、mem_map 数组等放在 ZONE_NORMAL 里。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

2K31

操作系统内存换入-请求调页---14

若共享操作不成功,那么只能从相应文件中读入所缺的数据页面到指定线性地址处 //在linux/mm/memory.c中 //错误码和对应产生错误的虚拟地址 void do_no_page(unsigned...; } ---- put_page put_page用来完成物理页面与一个线性地址页面的挂接,从而将一个线性地址空间内的页面落实到物理地址空间内, page为物理地址,address为线性地址 //在linux...=1是检查这个page地址对应的物理内存页面 // 是不是已经注册过的页面(用get_free_page函数申请,申请时会再mem_map中 // 注册这个页面,也就是把这个页面对应的mem_map项加...=1就要警告) if (mem_map[(page-LOW_MEM)>>12] !...---- 参考 Linux内存管理之copy_page_tables源码理解

57320

Linux内存描述之内存节点node--Linux内存管理(二)

因此linux内核需要用一种体系结构无关的方式来表示内存....并不是所有的node都有3个zone的,比如一个CPU簇就可能没有ZONE_DMA区域 node_mem_map node中的第一个page,它可以指向mem_map中的任何一个page,指向page实例数组的指针...,用于描述该节点所拥有的的物理内存页,它包含了该页面所有的内存页,被放置在全局mem_map数组中 bdata 这个仅用于引导程序boot 的内存分配,内存在启动时,也需要使用内存,在这里内存使用了自举内存分配器...*/ /* /*起始页面帧号,指出该节点在全局mem_map中的偏移 系统中所有的页帧是依次编号的,每个页帧的号码都是全局唯一的(不只是结点内唯一) */ unsigned...; #define NODE_DATA(nid) (&contig_page_data) #define NODE_MEM_MAP(nid) mem_map else /*

7.6K20

Linux内存描述之概述--Linux内存管理(一)

2 (N)UMA模型中linux内存的机构 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来表示内存....; #define NODE_DATA(nid) (&contig_page_data) #define NODE_MEM_MAP(nid) mem_map else /*...尤其是, Linux内核必须处理80x86体系结构的两种硬件约束....页的数据结构对象都保存在mem_map全局数组中,该数组通常被存放在ZONE_NORMAL的首部,或者就在小内存系统中为装入内核映像而预留的区域之后。...2.6 高端内存 由于能够被Linux内核直接访问的ZONE_NORMAL区域的内存空间也是有限的,所以LINUX提出了高端内存(High memory)的概念,并且允许对高端内存的访问

6.8K30

操作系统段页结合的实际内存管理--13

一个程序要运行,那肯定对应要有一个进程,因此首先是创建进程,分配完各种资源后,才能运行,而创建进程的流程之前已经分析过了,简化下就是这几步: fork()—>sys_fork—>copy_process 在linux...可以看出linux 0.11中代码段和数据段是不进行区分的,因此这两者是共享一块虚拟内存的 ---- 进程0、进程1、进程2的虚拟地址 每个进程的代码段、数据段都是一个段 每个进程占64M虚拟地址空间...,互不重叠 因为每个进程的段空间不重叠,意味着各个进程的虚拟空间中的虚拟地址不会重叠,那么对应各个进程的虚拟地址解析得到的虚拟页号不会重叠,因此在linux 0.11中多个进程可以共享一套页表。...其中old_data_base是父进程局部描述符表LDT中数据段的基地址(虚拟地址空间) new_data_base为即将创建的子进程在虚拟地址空间中的基地址 linux 0.11中整个4G大小的虚拟内存是等分的...= this_page; //将源页表项存进目的页表项 if (this_page > LOW_MEM) { //如果是主内存区,1MB以内不参与用户分页管理,1MB以上mem_map

73520
领券