
Linux 内存管理
文章平均质量分 86
lcw_202
这个作者很懒,什么都没留下…
展开
-
Linux页框级内存管理处理细节
<br />弄清楚伙伴系统算法的原理以后,我们就可以开开心心地处理页框了。<br />我们可以通过6个稍有差别的函数和宏请求页框。一般情况下,他们都返回第一个所分配页的线性地址,或者分配失败则返回NULL。<br />alloc_pages(gfp_mask, order):用这个函数请求2order 个连续的页框。他返回第一个所分配页框描述符的地址,或者如果失败,则返回NULL。<br /><br />alloc_page(gfp_mask):用于获得一个单独页框的宏,它其实只是alloc_p转载 2010-10-21 09:36:00 · 1072 阅读 · 1 评论 -
kernel阅读手记之vmalloc
<br />vmalloc和kmalloc的在逻辑地址上时连续的,他们的区别在于vmalloc在物理地址上并不时连续的,但是kmalloc在物理地址上页时连续的。Vmalloc分配分为两种模式,一种是没有MMU(memorymanagement unit,内存管理模块)的vmalloc,比如在arm7上,另一种则是在有MMU上的vmalloc。<br /> <br />在没有MMU模块支持的cpu上,vmalloc则是调用的slab中的kmalloc实现的内存分配,其标志为(gfp_mask | __G转载 2010-11-08 00:09:00 · 890 阅读 · 0 评论 -
kernel阅读手记之kmalloc
<br />内核中,分别对于不同的应用层面,对kmalloc有不同的定义,分别位于<br />slab.c<br />Mark Hemment捣鼓的,从从Sun OS引进<br />slob.c<br />针对嵌入式系统,主要是针对内存非常有限的设备<br />slub.c<br />可以说是对slab的重新设计,代码量更下,并且能够更好的适应large NUMA系统,被认为时slab和slob的取代者<br /> <br /> <br />Slob中的kmalloc只有一个语句,return __kmal转载 2010-11-08 00:10:00 · 1702 阅读 · 0 评论 -
kernel阅读手记之页面分配和释放
页面的分配alloc_page()1、 错误处理。当order 2、 返回alloc_pages_current(gfp_mask,order)的返回值struct page *alloc_pages_current(gfp_tgfp, unsigned order)1、 将pol定义为current的内存池2、 当gfp状态为等待,并且不在中断的状态时,调用cpuset_update_task_memory_state()更新当前运行task的内存状态3、 当pol为0或转载 2010-11-08 00:13:00 · 1292 阅读 · 0 评论 -
Linux内核中内存cache的实现
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。<br />msn: yfydz_no1@hotmail.com<br />来源:http://yfydz.cublog.cn<br />1. 前言<br />kmem_cache是Linux内核提供的快速内存缓冲接口,这些内存块要求是大小相同的,因为分配出的内存在接口释放时并不真正释放,而是作为缓存保留,下一次请求分配时就可以直接使用,省去了各种内存块初始化或释转载 2010-11-08 16:32:00 · 755 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(续一)
<br />在cache这个结构里,有两个很重要的结构:struct array_cache *array[NR_CPUS]与struct kmem_list3 lists;详细分析一下<br />struct array_cache {<br /> unsigned int avail; //当前空闲对象的位置 <br /> unsigned int limit; //允许的空闲对象的最大值<br /> unsigned int batch转载 2010-11-11 15:57:00 · 1050 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(续三)
六:kmem_cache_alloc的实现分析:我们在上面可以看到,创建一个cache描述符的时候,并没有这之分配slab数据。现在我们来看一下怎么从cache中申请对象void * kmem_cache_alloc (kmem_cache_t *cachep, int flags){ return __cache_alloc(cachep, flags);}实际上会调用__cache_alloc如下:static inline void * __cache_alloc (kmem_cache_t转载 2010-11-11 16:42:00 · 863 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(续五)
<br />九:几点补充:<br />1: Slab中使用的页面都会加上“PG_slab”标志,以跟一般的页面区别。另外,在释放内存的时候,经常需要用到从页面到slab的对应转换关系。那是怎样标识的呢?<br />关于标志:<br />注意有以下代码:<br />static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid)<br />{<br /> ……<br /> while (i--) {<br />转载 2010-11-11 16:44:00 · 764 阅读 · 0 评论 -
关于slab的讨论和源码解释
<br />Hi tommytang,<br />这是我前些天一个操作系统小组的mailinglist写的文档,不一定正确,希望对你有帮助 :-)<br /><br /><br />关于slab的讨论和源码解释,请指正(lucian_museful@sina.com):<br /><br />说明:<br />1. 参考资料: UNIX高级教程 系统技术内幕 Uresh Vahalia 清华大学出版社<br />2. 源代码 : slab.c 2.4.0 (可能是test 10 , 记不清了)<br /><转载 2010-11-11 17:38:00 · 1301 阅读 · 0 评论 -
内存管理FAQ(freshground )
<br />Q:什么是mm?<br />A:指的是内存管理(memory management)。是内核中的一套软件机制,用于有效管理内存的使用。<br /><br />Q:内存管理的软件实现了什么功能?<br />A:1) 进程的保护,即进程向内存管理请求的物理页,由内存管理系统负责,不会将同一物理页(共享页面除外)映射到不同进程的虚地址空间。 <br />2) 虚存的实现,允许所有进程使用的内存总量大于实际物理内存总量。 <br /><br />Q:MMU与TLB的功能?<br />A:TLB是MMU的转载 2010-11-11 18:25:00 · 1172 阅读 · 0 评论 -
Linux内存管理之slab分配器分析
一:准备知识:前面我们分析过了大内存分配的实现机制,事实上,若为小块内存而请求整个页面,这样对于内存来说是一种极度的浪费。因此linux采用了slab来管理小块内存的分配与释放。Slab最早是由sun的工程师提出。它的提出是基于以下因素考虑的:1:内核函数经常倾向于反复请求相同的数据类型。比如:创建进程时,会请求一块内存来存放mm结构。2:不同的结构使用不同的分配方法可以提高效率。同样,如果进程在撤消的时候,内核不把mm结构释放掉,而是存放到一个缓冲区里,以后若有请求mm存储空间的行为就可以直接从缓冲区中取转载 2010-11-11 15:50:00 · 775 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(续四)
七:kmem_cache_free()的实现kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码:void kmem_cache_free (kmem_cache_t *cachep, void *objp){ unsigned long flags; local_irq_save(flag转载 2010-11-11 18:47:00 · 870 阅读 · 0 评论 -
slab图形化简介
<br />1、数据结构简介(为了简化理解,有些地方采用常量说明,例如一个页面)<br /> <br /> <br /> <br /> <br />2、处理过程简介<br /> <br />转载 2010-11-11 18:02:00 · 752 阅读 · 0 评论 -
zone_watermark_ok
<br />/*<br /> * Return 1 if free pages are above 'mark'. This takes into account the order<br /> * of the allocation.<br /> */<br />int zone_watermark_ok(struct zone *z, int order, unsigned long mark,<br /> int classzone_idx, int allo原创 2010-11-16 20:21:00 · 2015 阅读 · 1 评论 -
expand 伙伴系统中块的碎裂
/*简单来说就是如果小块没空间了,就从大块上分配,然后把大块碎裂为n个小块。 然后把其余的小块放到相应分配阶的free_area中。 参数的含义如下: zone: 管理区 page: 要归还内存的起始内框page index: 在管理区中的序号 low: 欲分配的内框大小 high: 已经分配的内框大小 area: 空闲区*/static inline struct page *expand(struct zone *zone, st原创 2010-11-16 20:46:00 · 667 阅读 · 0 评论 -
cache_estimate
/* Cal the num objs, wastage, and bytes left over for a given slab size. */在页的阶为 gfporder,每个对象大小为size的条件下:本函数负责计算对象的数目,浪费的空间,以及在所给的slab中剩余的空间。计算出来后,外层函数评估此时对象个数,浪费的大小是否能够接受,如果不能接受,则需要调整gfporde转载 2010-11-11 17:37:00 · 1016 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(续二)
五:kmem_cache_create()分析我们以一个例子来跟踪分析一下slab的机制:下面是一个测试模块的代码:#include #include #include MODULE_LICENSE("GPL");MODULE_AUTHOR("ericxiao ");MODULE_DESCRIPTION("slab test module"); sta转载 2010-11-11 16:17:00 · 872 阅读 · 0 评论 -
Kernel阅读手记之slab
Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。例如,如果内存被分配给了一个互斥锁,那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数(转载 2010-11-08 00:01:00 · 739 阅读 · 0 评论 -
TLB与cache的深入分析
<br />已有 615 次阅读2010-5-8 15:23|关键词:cache tlb Cache 内核 lazy 技术 系统 硬件 linux 回写 软件 用户 操作系统<br />一)TLB<br />1)TLB的概述<br />TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存.<br />TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据.<br /> <br />2)tlb的原理<br />当cpu对数据进行读请求时,转载 2010-11-08 00:38:00 · 6898 阅读 · 0 评论 -
我看Buddy(伙伴)算法-到底是怎么计算"伙伴"地址的
<br />文章来源:http://gliethttp.cublog.cn<br /><br />对于order=0,索引0-[0],索引1-[1]是伙伴<br /> 索引2-[2],索引3-[3]是伙伴<br /> ...<br /> 索引2*n-[2*n],索引2*n+1-[2*n+1]是伙伴<br /><br />对于order=原创 2010-11-07 23:37:00 · 2419 阅读 · 0 评论 -
copy_e820_map() 函数
copy_e820_map() 函数函数原型为:static int __init sanitize_e820_map(structe820entry * biosmap, char * pnr_map)其主要操作为:·如果物理内存区间小于2,那肯定出错。因为BIOS至少和RAM属于不同的物理区间。 if(nr_map return -1;·从BIOS构成图中读出一项do { unsignedlong long start = biosmap->转载 2010-10-21 10:22:00 · 785 阅读 · 0 评论 -
setup_memory
<br />建立内存bitmap并在bitmap中标记内存使用状态,标记保留空间,未使用为0,保留为1。 <br />内存bitmap的启始地址为contig_page_data.bdata->node_bootmem_map,实际上就是跟在pg0后面。大小尺寸为(max_low_pfn+7)/8,就是每一bit位代表一个页面是否被占用。 <br />见文件arch/i386/kernel/setup.c <br />#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAG转载 2010-10-21 16:22:00 · 1173 阅读 · 0 评论 -
Linux页框管理
<br /> <br />在前面的博文里,我们讲解了基于80x86体系的Linux内核分段和分页机制,并详细地讨论了Linux的内存布局。有了这些基本概念以后,我们就来详细讨论内核如何动态地管理那些可用的内存空间。<br />对于80386这种32位的处理器结构,Linux采用4KB页框大小作为标准的内存分配单元。内核必须记录每个页框的当前状态,例如,区分哪些页框包含的是属于进程的页,而哪些页框包含的是内核代码或内核数据。内核还必须能够确定动态内存中的页框是否空闲,如果动态内存中的页框不包含有用的数据,转载 2010-10-21 09:29:00 · 740 阅读 · 0 评论 -
系统初始化阶段Linux内存布局
在上一篇博文里,我们已经看到Linux如何有效地利用80x86的分段和分页硬件单元把逻辑地址转换为线性地址,在由线性地址转换到物理地址。那么我们的应用程序如何使用这些逻辑地址,整个内存的地址布局又是怎样的?打一个比方,内存就像一座城市,而居住在这个城市里的市民就像是各个进程,一个市民吃喝拉撒睡,当然就得用于“房子”、“车子”、“票子”等各种各样的资源。有些资源是固定的,如“房子”,我们称之为静态数据;有些资源是动态的,如 “车子”,我们称之为动态数据;有些资源是用来购买(产生)数据的,如“票子”,我们称之为转载 2010-10-21 10:05:00 · 1313 阅读 · 0 评论 -
BIOS E820 等相关中断
<br />Int 15/AX=E820h 是用来获取系统中的内存映地址描述符的,操作系统常用来获取内存大小.<br />PS:内存(Memory)可以是我们平时所说的在主板上的内存条,我们称作Base Memory,也可以是毗边<br />Base Memory 的并作为普通内存扩展的内存.<br />首先来了解一下相关的数据结构:<br />Format of Phoenix BIOS system memory map address range descriptor<br />(BIOS转载 2010-10-21 13:40:00 · 4137 阅读 · 0 评论 -
启用分页机制
当Linux启动时,首先运行在实模式下,随后就要转到保护模式下运行。因为在第二章段机制中,我们已经介绍了Linux对段的设置,在此我们主要讨论与分页机制相关的问题。Linux内核代码的入口点就是/arch/i386/kernel/head.S中的startup_32。 1.页表的初步初始化:/** The page tables are initialized to only 8MB here - the final page* tables are set up later depending on m转载 2010-10-21 14:39:00 · 897 阅读 · 0 评论 -
进程页目录VS全局页目录
内核维持者一组自己使用的页表,驻留在主内核页全局目录(master kernel page global directory)。 系统初始化后,这组页表永远不会被任何进程或任何内核线程直接使用; 更确切地说,主内核页全局目录的最高目录项部分作为参考, 为系统中每个普通进程对应的页全局目录项提供模板。当前进程页目录表地址的获取:pgd_paddr = read_cr3();系统全局页目录表地址的获取:init_mm.pgd转载 2010-10-21 20:32:00 · 4314 阅读 · 0 评论 -
分页的代价--TLB
分页是基于查找表的,而在内存中存储这个1M个项目的页表本身就带来了内存消耗和查找速度问题。于是,页表通常需要硬件的支持,即将页表写在硬件MMU的寄存器中。如果页表比较小,那么页表写在寄存器中可以加快查找速度。但绝大多数当代的计算机页表都非常大。对于这些页表,采用快速寄存器来实现页表就不太合理了。一种办法是使用TLB(translation look-aside buffer)。TLB是关联的寄存器,TLB条目由两部分组成:页号和帧号。TLB只包含页表中的一小部分条目,整个页表还是保存在内存中。当CPU产生逻转载 2010-10-22 10:13:00 · 4385 阅读 · 0 评论 -
页描述符与物理地址(相关主题帖子总结)
主题:page_to_pfn 疑惑,大家指教地址:http://linux.chinaunix.net/bbs/viewthread.php?tid=1172619主题:问个关于页描述符与物理地址的问题地址:http://linux.chinaunix.net/bbs/viewthread.php?tid=1043721&rpid=6810655&ordertype=0&page=1#pid6810655摘要:在最后一级页表中的页表项,里面放的是页描述符(page descriptor)的物理地原创 2010-10-21 09:40:00 · 4874 阅读 · 3 评论 -
非连续内存区
从前面的博文中我们已经知道,把一块存放slab结构的内存区映射到一组连续的物理页是最好的选择,这样会充分利用高速缓存并获得较低的平均访问时间。不过,上面的方式主要是针对那些使用非常频繁的内核数据结构——如task_struct、inode来设计的。如果对内存区的请求不是很频繁,那么,通过连续的线性地址,而不是物理地址来访问非连续的物理页框这样一种分配模式就会很有意义了。这种模式的主要优点是避免了外碎片,而缺点是必须打乱内核页表。此外,非连续内存区的大小必须是4096 的倍数。Linux 在几个方转载 2010-10-21 09:44:00 · 699 阅读 · 0 评论 -
高端内存
注:本文提及的物理地址空间可以理解为就是物理内存,但是在某些情况下,把他们理解为物理内存是不对的。本文讨论的环境是NON-PAE的i386平台,内核版本2.6.31-14一. 什么是高端内存linux中内核使用3G-4G的线性地址空间,也就是说总共只有1G的地址空间可以用来映射物理地址空间。但是,如果内存大于1G的情况下呢?是不是超过1G的内存就无法使用了呢?为此内核引入了一个高端内存的概念,把1G的线性地址空间划分为两部分:小于896M物理地址空间的称之为低端内存,这部分内转载 2010-10-21 10:29:00 · 1226 阅读 · 0 评论 -
pagetable_init
见文件arch/i386/mm/init.c,初始化页面表。 实质上是重新设置swapper_pg_dir关于内核部分以上线性地址的页面表。swapper_pg_dir的物理偏移0xC00到0xFFF,即索引偏移从0x300到0x400的页面表内容。 注意此时为页面表分配内存使用alloc_bootmem_low_pages来进行,最后在分配的页面表中填写个页面描述符,即页面号对应的物理地址和属性。 我们实质上可以知道,从页表中页描述符仍然是类似0x1007、0x2007,直到(max_low_转载 2010-10-21 16:03:00 · 1561 阅读 · 0 评论 -
vmalloc函数实现细节
<br />对于x86体系[luther.gliethttp]<br />#define high_memory (-128UL << 20)等于0xf8000000<br /><br />#define VMALLOC_OFFSET (8 * 1024 * 1024)<br />#define VMALLOC_START ((unsigned long)high_memory + VMALLOC_OFFSET)<br />#define VMALLOC_END (转载 2010-11-07 21:19:00 · 824 阅读 · 0 评论 -
linux的highmem高端内存是如何被使用的
<br /><br /><br />0-3G为用户地址空间<br />3G-4G为内核逻辑地址空间<br />其中3G-3G+896M为内核空间的低端地址空间,超过896M的内存归属为高端地址空间,<br />而高端内存有两种使用方式,一种是给内核使用的,通过vmalloc分配,一种就是给应用程序使用的,由于应用程序使用内存时都需要经过mms,所以内核给用户分配内存时首先使用高端内存。转载 2010-11-07 21:22:00 · 1104 阅读 · 0 评论 -
我看Buddy(伙伴)算法-到底是怎么"找朋友"的
<br /><br /><br />文章来源:http://gliethttp.cublog.cn<br /><br />在《浅析armlinux-paging_init()->free_area_init_core()函数5-4》中我们为size大小的内存页,创建了<br />(size-1)>>(i+4)大小的位图管理空间,比如拿i=0、i=1和i=2,即order=0、order=1和order=2,来具体分析分析转载 2010-11-07 23:36:00 · 1743 阅读 · 1 评论 -
slabtop简单的用途
http://blog.yufeng.info/archives/1960我们知道内核的模块在分配资源的时候,为了提高效率和资源的利用率,都是透过slab来分配的。我们通过slab的信息,再配合源码能粗粗了解系统的运行情况,比如说什么资源有没有不正常的多,或者什么资源有没有泄漏。linux系统透过/proc/slabinfo来向用户暴露slab的使用情况的,我们来看下:转载 2012-03-03 21:39:38 · 5161 阅读 · 0 评论