linux的内存管理一直是让我最困惑的,2.6版本内核里面各种复杂的机制搞得我云里雾里,甚至搞不明白内存管理最基本的原理是什么,于是翻阅早期版本的内核0.11,最底层的内存分段和分页我都已经在我的plinux上实践过了,读到malloc的时候发现了linus用了一种很好玩的指针迭代方法,至少我以前没见过,见识短浅,大家莫笑。
linus把一页内存分成一个个具有相同大小的内存块,然后又将这些个内存块组成一个链表,而这些内存块都是将来要分配出来的空闲内存,它们内部并不包含有任何对象,要组成链表就必然要求有指针,linus把每块内存的前4个字节拿出来作为指针,指向下一块内存的首地址:
char *cp; /* 在这里获取一页空闲内存 */ (void*)cp = get_free_page(); for(i = PAGE_SIZE/bdir->size; i > 1; i --){ /* 我觉得这里很有意思,把一个字符指针强制转换成指向字符指针的指针, 然后再对其解引用赋值,相当于把cp开始的前4个字节作为一个指针并对它进行定向 */ *((char**)cp) = cp + bdir->size; cp += bdir->size; }
然后在指针迭代的时候用了下面这种方法,不复杂,只是觉得挺有意思的:
void *retval = (void*)freeptr; freeptr = *((void**)retval);
这样freeptr就指向了下一块空闲内存。
...

