/*
* up_wp_page()函数用于解除物理页的共享状态,同时给发生写时复制的进程提供一页新的
* 物理页,新物理页是之前共享页的数据相同的拷贝。
* table_entry是共享物理页的地址的指针,即页表实际地址+表内偏移地址
*/
void un_wp_page(unsigned long * table_entry)
{
unsigned long old_page,new_page;
old_page = 0xfffff000 & *table_entry; //取得共享物理页实际地址
if (old_page >= LOW_MEM && mem_map[MAP_NR(old_page)]==1) {
*table_entry |= 2; //如果该页位于主内存区,且不是共享页,设为可写
invalidate(); //刷新页变换高速缓存
return; //直接退出
}
if (!(new_page=get_free_page())) //如果是共享页,申请一页新物理页
oom(); //如果0 = get_free_page(),内存溢出,die
if (old_page >= LOW_MEM) //如果共享页在主内存区
mem_map[MAP_NR(old_page)]--; //共享次数-1
*table_entry = new_page | 7; //将新页挂载到写时复制进程的页表中
invalidate(); //刷新页变换高速缓存
copy_page(old_page,new_page); //页拷贝:old_page内容到new_page
}
1 /******************