每次看到这都晕!
本帖最后由 _nosay 于 2016-06-20 14:14 编辑1. page->mapping为NULL时,The page was only in the buffer cache,怎么理解{:qq27:} ?
2. page->buffers不为NULL时,为什么会被page_launder()函数释放掉?即为什么对于page->buffers不也是转移到交换分区,而是释放(转移表示内容还在,释放就没了呀){:qq27:} ?
3. page->buffers指向一个buffer_head结构的循环链表,是指当前page存储着链表里面的每个buffer_head结构吗{:qq27:} ?
Linux 2.4.0 page结构定义:
typedef struct page {
struct list_head list;
struct address_space *mapping;
unsigned long index; // mm/swapfile.c: swap_info->swap_map
struct page *next_hash;
atomic_t count;
unsigned long flags; /* atomic flags, some possibly updated asynchronously */
struct list_head lru;
unsigned long age;
wait_queue_head_t wait;
struct page **pprev_hash;
struct buffer_head * buffers;
void *virtual; /* non-NULL if kmapped */
struct zone_struct *zone;
} mem_map_t; // mem_map[]
// 清洗不活跃脏页面的函数
int page_launder(int gfp_mask, int sync)
{
...
if (page->buffers) {
clearedbuf = try_to_free_buffers(page, wait);
if (!clearedbuf) {
add_page_to_inactive_dirty_list(page);
} else if (!page->mapping) { /* The page was only in the buffer cache. */
atomic_dec(&buffermem_pages);
freed_page = 1;
cleaned_pages++;
} else if (page_count(page) > 2) { /* The page has more users besides the cache and us. */
add_page_to_active_list(page);
} else /* page->mapping && page_count(page) == 2 */ { /* OK, we "created" a freeable page. */
add_page_to_inactive_clean_list(page);
cleaned_pages++;
}
}
...
} 本帖最后由 _nosay 于 2016-06-21 14:01 编辑
回复 1# _nosay
明白了 :em02: 。
http://bbs.chinaunix.net/thread-4241209-1-1.html
如果从映射表时解除的,到这个时候,mapping肯定是有值的,否则就只用于buffer cache了。
buffers是一组buffer_head结构的指向,当前page存的是这些buffer_head对应的数据块,而buffer_head结构本身是游离当前page之外的,所以释放page的时候,buffer_head结构也要随着释放,如果脏了,相应数据块就会写进磁盘(非交换区),再读磁盘这块区域时,重新建缓存(因为即使是交换区换入时,也需要从磁盘重新读)。
页:
[1]