|
1、堆内存的初始化
在RT-Thread中,rtthread_startup(void)函数调用了rt_system_heap_init(void *begin_addr, void* end_addr),此函数的作用就是初始化系统堆内存。
堆内存按“页”单位来管理,每页大小由宏定义RT_MM_PAGE_SIZE指定。
在函数rt_system_heap_init()中,调用rt_page_init((void*)heap_start, npages)函数对这些“页”进行初始化,主要工作就是给这些“页”配备了一个管理机构,叫做rt_page_list,它在系统初始化初期,只是指向整个堆区(此时堆区还未被分配使用),并且记录有整个堆区的“页”数。当然,这里实际的工作是由函数rt_page_free(void *addr, rt_size_t npages)完成的。rt_page_free()的作用就是释放指定数目的“页”到由rt_page_list指向的“页”链表中去。不过此时(系统初始化初期),函数rt_page_free()只是执行了它体内的如下几条语句:
n = (struct rt_page_head *)addr;
prev = &rt_page_list;
(b = *prev) != RT_NULL;
n->page = npages;
n->next = b;
*prev = n;
2、“页”的分配
“页”的分配由rt_page_alloc(rt_size_t npages)实现。从由rt_page_list所指向的空闲“页块”链表中找出一个合适的“页块”,进行分配。此处应该是一旦找到合适的(即大于或等于指定的分配页数)“页块”,就进行分配,属于“first fit”.同时对rt_page_list进行调整。
3、“页”的释放
由函数rt_page_free(void *addr, rt_size_t npages)实现。根据即将释放“页块”的首地址和页数,在由rt_page_list所指向的空闲“页块”链表中找出一个合适的“页块”,这个“页块”应该是这样的,它和即将释放“页块”是伙伴关系(邻居关系),不是在即将释放“页块”的前面就是在其后面。找到这样的“页块”后,将它们合并成一个整“页块”。
ffxz在帖子“分析函数rt_page_free时,弄不懂其中的加法运算,请作者FFXZ帮忙释疑”http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4326133&bbs_page_no=1&bbs_id=3066 中的释疑使我有了以上的理解,还请大家多多指正。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|