- 论坛徽章:
- 2
|
代码版本:linux-0.11
void un_wp_page(unsigned long * table_entry)
{
unsigned long old_page,new_page;
old_page = 0xfffff000 & *table_entry; /*取二级页表表项的高20位,也就是物理内存的内存页首地址*/
/*这里 MAP_NR(old_page) 是计算物理内存在高于1M的内存的内存页数(那1M是给内核使用的)
mem_map[]记录的是高于1M(1M是256个内存页)的内存页的使用情况
*/
if (old_page >= LOW_MEM && mem_map[MAP_NR(old_page)]==1) { /*页面只被引用1次,也就是没有被共享*/
*table_entry |= 2; /*设置该页属性为可读写,即去写保护*/
invalidate(); /*刷新也变化高速缓存*/
return;
}
if (!(new_page=get_free_page()))
oom();
if (old_page >= LOW_MEM)
mem_map[MAP_NR(old_page)]--;
*table_entry = new_page | 7; /*将新申请的物理页面的页起始地址填写到当前任务页表项中,并设置属性*/
invalidate(); /*刷新也变化高速缓存*/
copy_page(old_page,new_page); /*拷贝旧页内存中的数据到新页内存中*/
}
对红色字体中为什么那么做不明白。
old_page指向的内存页面的引用次数为1时,为什么要去写保护???这个页面引用计数如果要是是其他任务引用了该物理页面而计的数,此时这里把写保护属性去掉,是不是就又问题??? 求指导! |
|