linux 内存管理
文章平均质量分 78
satanwxd
在读研究生
展开
-
linux 内存管理之基础篇
一.Linux内存管理的一些基本概念内存空间: 绝大多数的嵌入式系统的系统内存和I/O地址空间是统一编址的,内存和I/O地址空间共享0x00000000~0xFFFFFFFF共4GB地址空间范围,这4GB的地址空间范围包括以下几种存储空间:设备空间、内部高速SRAM空间、内部mini cache空间、低端中断向量空间、高端中断向量空间、RAM内存空间(系统的内存空间)原创 2010-02-09 10:06:00 · 5026 阅读 · 0 评论 -
进程分配用户空间或是文件或者设备文件空间映射函数分析(二)
我们在前面文章中大概分析了do_mmap2()函数的大概内容,在这里我把里面涉及到的某些函数进行更具体的分析,我们在确定线性地址申请之前要进行一系列的判断,最重要的判断就要数 find_vma_prepare()这个函数了,我们来看看它在do_mmap_pgoff()函数中的位置吧。munmap_back: vma = find_vma_prepare(mm, addr, &prev, &r原创 2010-03-24 11:44:00 · 2076 阅读 · 0 评论 -
申请连续高端线性而物理内存非连续函数分析之vmalloc()
这个函数的大致过程我在这里讲述一下,首先,他要在VMALLOC_START~VMALLOC_END之间的高端线性地址空间中申请要求大小的按页对齐的地址空间,什么事高端线性地址空间?这个你到我前面的文章中看看--“linux内存管理之基础篇”里面有提到什么是高端线性地址空间的。然后,我们调用伙伴系统机制中的1页内存分配函数alloc_page()在高端物理内存中逐页为申请到的高端线性地址空间中的每原创 2010-03-21 12:05:00 · 2613 阅读 · 1 评论 -
Linux中的内存分配和释放之slab分配器分析(完)
我们在上篇文章分析cache_grow()函数的时候涉及两个函数,我们没有细说。一个就是kmem_getpages()和kmem_freepages()函数,这两个函数有3个参数。kmem_cahce_t:主要是把申请到的对象加到这个高速缓存内 flags:表示你申请时候的一些控制标志。nodeid:主要是要求在那个内存节点号申请内存。我们先来说下kmem_getpages(原创 2010-03-19 10:22:00 · 4178 阅读 · 0 评论 -
Linux中的内存分配和释放之kmem_cache_alloc()函数分析
记得上篇文章中我们提到了这个函数,在kmem_cache_create()函数调用它的语句是cachep = (kmem_cache_t *) kmem_cache_alloc(&cache_cache, SLAB_KERNEL);这里的cachep是我们要申请的高速缓存内存的描述结构体(kmem_cache_t),但是我们也需要高速缓存内存来存放这个结构体。就是cache_cache所描原创 2010-03-17 09:04:00 · 20667 阅读 · 2 评论 -
Linux中的内存分配和释放之kmem_cache_create()函数分析
在上篇文章中我们大概分析了一下kmem_cache_init()这个函数,里面涉及的kmem_cache_create()函数是本片文章分析的主要函数。现在我们来好好看看它的具体代码! kmem_cache_t *kmem_cache_create (const char *name, size_t size, size_t align,原创 2010-03-16 11:42:00 · 14922 阅读 · 0 评论 -
Linux中的内存分配和释放之__alloc_pages()函数分析
在上篇文章的结尾,我们说会在接下来的文章分析分配函数的具体代码,结合我上篇文章说的伙伴机制和冷热区的概念,更好得去理解这个分配过程。好了,我们不再多说了,我们现在开始分析代码吧。 struct page * fastcall __alloc_pages(unsigned int gfp_mask, unsigned int order,struct zonelist *zonelist)原创 2010-03-08 20:13:00 · 10049 阅读 · 0 评论 -
Linux中的内存分配和释放之slab分割器
slab分配器形象地说就是先由伙伴机制申请空闲内存空间,然后slab分配器再把这个内存空间进行分割,按同样大小来进行分割,最后再用一些数据结构来进行管理。上面只是形象地说法。我们平时把由slab进行分割后的内存我们称之为高速缓存内存。这样看来就知道所谓的高速就是说不是每次分配和释放内存都要找伙伴机制,可以先访问这些高速内存的,和我们前面文章中提到的冷热区是一个作用的。我们会发现我们原来说的冷热原创 2010-03-11 12:43:00 · 2581 阅读 · 0 评论 -
Linux中的内存分配和释放之mem_init()函数分析
void __init mem_init(void){ unsigned int codepages, datapages, initpages; int i, node; codepages = &_etext - &_text;//内核代码段的大小。 datapages = &_end - &__data_start;//内核数据段的大小。 initpages = &_原创 2010-03-05 09:53:00 · 9193 阅读 · 0 评论 -
Linux中的内存分配和释放之__free_pages()函数分析
记得我们在上篇文章mem_init()分析中提到__free_page()函数吗?我们现在来完善它。它的调用过程是这样的:mem_init()->free_all_bootmem_node():我们知道这个函数是统计一共释放了多少空闲页。->free_all_bootmem_core()就是在这个函数里面先后多次调用__free_pages()函数。目的就是为了释放每个内存node里面无用的内原创 2010-03-07 12:16:00 · 9305 阅读 · 0 评论 -
Linux中的内存分配和释放之free_area_init_node()函数分析
在对free_area_init_node()函数分析之前,我们也要看看它的源头,这个函数的调用过程如下start_kernel()->paging_init()->free_area_init_node(),我们来看看在调用这个函数之前,在paging_init()前面的语句做了些什么。 /* * initialise the zones within each node */原创 2010-03-04 09:45:00 · 5811 阅读 · 0 评论 -
Linux中的内存分配和释放之free_bootmem()函数分析
free_bootmem()这个函数是系统启动初期内存释放的核心函数,我们来看看它的代码。 void __init free_bootmem (unsigned long addr, unsigned long size)//addr是要释放的物理起始地址,size是要释放空间的大小。 { free_bootmem_core(NODE_DATA(0)->bdata, addr, s原创 2010-03-03 12:46:00 · 2285 阅读 · 0 评论 -
Linux中的内存分配和释放之__alloc_boot函数分析
对于这个函数,其实是很多宏定义调用的函数,其中alloc_bootmem_low_pages(x)是其中一个调用它的宏,大家可以认为这些宏只是把这个__alloc_bootmem实质性的函数进行了封装。#define alloc_bootmem_low_pages(x)相当于__alloc_bootmem((x), PAGE_SIZE, 0),就是从0地址开始的低端内存分配按页大小对齐的内存。好原创 2010-03-01 21:04:00 · 4394 阅读 · 1 评论 -
Linux中的内存分配和释放之build_all_zonelists()函数分析
void __init build_all_zonelists(void){ int i; for(i = 0 ; i build_zonelists(NODE_DATA(i));//NODE_DATA(i)宏定义可以找到i号内存node对应的discontig_node_data[i] printk("Built %i zonelists/n",原创 2010-03-04 15:18:00 · 5613 阅读 · 0 评论 -
Linux中的内存页表创建之memtable_init()函数分析
本函数的分析很难具体,因为涉及了很多arm的处理器型号和每个型号对应的cache和write buffer的工作方式,这片文章只是做简单的记录,方便以后了解更深后回来再来完善这个函数。 这个函数的调用过程如:start_kernel()->setup_arch()->paging_init()->memtable_init().传递的struct meminfo mi是一个全局原创 2010-03-03 08:59:00 · 5101 阅读 · 0 评论 -
Linux中的内存分配和释放之bootmam_init()函数分析
了解了Linux内存管理的基本知识后,我们来研究一下Linux内存的分配和释放。我们会分两个部分来研究的。我们向来探讨系统启动初期内存的分配和释放。这个阶段可以申请到大片的物理内存,但是要注意到以下两点! 1)其实系统启动初期是指在init_mem()之前的阶段,在这个阶段由于只需要少量的内存(内核编译需要的内存,页帧位码表,页表,initrd),所以可以申请到大片的物理内存,但是我们还原创 2010-02-25 09:33:00 · 3944 阅读 · 0 评论 -
进程分配用户空间或是文件或者设备文件空间映射函数分析(三)
我们在上篇文章中说了缺页中断处理函数handle_pte_fault()函数,里面涉及到了几个比较重要的函数我这里先讲述的是do_no_page(),在调用这个函数的时候,我们发现时判断了二级页表项entry,发现pte_none(entry=1时,我们就可以认为该页没有被进程访问过且没有映射磁盘文件。我们先来看下它的具体代码吧。static intdo_no_page(struct mm_s原创 2010-03-25 09:18:00 · 3135 阅读 · 0 评论