前情提要:
终于到了物理内存的释放. 内存页面如生命一般. 有生有死.
接下来我们就要为物理页面抬棺收尸了.
1.要点: 如何为兄弟抬棺回收?
分配时跟谁分开的, 回收时要跟他一起才能被释放 双生小鬼
2.代码分析
- 函数调用关系:
- __free_pages_ok函数流程图
不是很清楚, 可私信要清楚的版本.
如果我还存了的话
- 代码
static void __free_pages_ok (struct page *page, unsigned int order)
{
unsigned long index, page_idx, mask, flags;
free_area_t *area;
struct page *base;
zone_t *zone;
if (PageLRU(page)) /*
检测该page是否在page lists中
如果在, 就删除
*/
lru_cache_del(page);
if (page->buffers) // 如果page被用作磁盘块缓存时
BUG();
if (page->mapping) //如果page有指向的inode
BUG();
/*
检测 ((page - mem_map) < max_mapnr) 是否超过page管理单元总数
page 是否在有效的 [mem_map,mem_mep+max_mapnr]范围内
*/
if (!VALID_PAGE(page))
BUG();
if (PageSwapCache(page))
BUG();
if (PageLocked(page))
BUG();
if (PageLRU