FreeBSD-7 内核malloc 源代码分析

2009-05-13 11:55:27来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


华为数通硬件四部李昂
li_ang82@msn.com
http://lllaaa.cublog.cn
看FreeBSD-7 的
[url=javascript:;]内核[/url]
代码有一段时间了,但是一直没有能够总结一下。由于没有写文档,
很多地方都是一带而过,并没有深入分析。为了逼自己能够分析完整个
[url=javascript:;]malloc[/url]
过程的代码,我
决定一边分析一边记录自己的分析笔记。
一提到
[url=javascript:;]内存[/url]
分配,自然会想到malloc 和
[url=javascript:;]free[/url]
这对双胞胎。在
[url=javascript:;]FreeBSD[/url]
内核里,也有
malloc 和free 这两个函数。它们的参数与C 语言标准库里面的略有不同,但是作用基本相同。
下面就从malloc 入手分析内存分配的过程。malloc 的源代码并不是很复杂,但为了分析方便,
我删除了一些调试、统计及诊断用的代码,只列出具体的实现代码。不过需要注意到是,单独看
malloc 的代码,有些数据结构的用途是无法分析清楚的,所以有些分析结果是我分析了free 的
代码得出的。如果你遇到对数据结构的功能不清楚的情况可以去看看free 的代码。在此我就不再
单独分析free 的代码了。
00297
[url=javascript:;]void[/url]
*
00298 malloc(unsigned long size, struct malloc_type *mtp, int flags)
00299 {
00300 int indx;
00301 caddr_t va;
00302 uma_zone_t zone;
00303 uma_keg_t keg;
00334 if (flags & M_WAITOK)
00335 KASSERT(curthread->td_intr_nesting_level == 0,
00336 ("malloc(M_WAITOK) in interrupt context"));
00337
00346
00347 if (size > KMEM_ZSHIFT];
00351 zone = kmemzones[indx].kz_zone;
00352 keg = zone->uz_keg;
00356 va = uma_zalloc(zone, flags);
00357 if (va != NULL)
00358 size = keg->uk_size;
00359 malloc_type_zone_allocated(mtp, va == NULL ? 0 : size, indx);
00360 } else{
00361 size = roundup(size, PAGE_SIZE);
00362 zone = NULL;
00363 keg = NULL;
00364 va = uma_large_malloc(size, flags);
00365 malloc_type_allocated(mtp, va == NULL ? 0 : size);
00366 }
00367 if(flags & M_WAITOK)
00368 KASSERT(va != NULL, ("malloc(M_WAITOK) returned NULL"));
00369 elseif (va == NULL)
00370 t_malloc_fail = time_uptime;
00380 return
((void *) va);
00381 }
334~336 行主要保证不能在中断里使用M_WAITOK 参数来调用malloc。M_WAITOK 的目的
是可以一直等待到能够分配成功为止,也就是说如果遇到内存不够的时候,M_WAITOK 会让
malloc 函数阻塞,直到底层的分配器能够分配到内存再往下执行,因此我们不能在中断里这么玩。
但是要特别注意的是,不能因为使用了M_WAITOK 参数就认为只要函数返回就一定申请成功了。
实际上,申请成功了是一回事,而返回合法
[url=javascript:;]指针[/url]
是另一回事。后面你会看到,申请到内存后还会
有个构造函数初始化内存空间的操作,如果那个操作失败了,还是会释放掉申请到的内存并返回
NULL。
347~366 行可以看到两个内存分配的分支。针对不同的内存申请量,malloc 函数里以
KMEM_MAX 为界限,提供了两种分配策略,347~359 是小内存的分配方案,360~366 是大内存

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BSD ROOTKIT 设计--内核黑客指引书(第7章)

下一篇:掀起硬盘主引导扇区的神秘面纱