对于"从内核空间建立进程没有COW(写时复制)“的理解

###关于写时复制 父进程建立子进程以后,并非将本身的数据段、堆和栈彻底复制一份给子进程,而是将这些区域的访问权限设置为只读,若是父进程或者子进程的中的任一个试图修改这些区域,则内核将为修改区域的那块内存制做一个副本。在此以前,内核仅为子进程分配虚拟地址,父子进程共享同一段物理地址。函数

可是在内核空间建立进程时没有写时复制。在mm/memory.c中,
copy_page_tables函数中有这样一段代码:this

if (this_page > LOW_MEM) {
 *from_page_table = this_page;
 this_page -= LOW_MEM;
 this_page >>= 12;
 mem_map[this_page]++;
}

LOW_MEM是1M,对于位于 1MB 如下的页面,说明 是内核页面,所以不须要对 mem_map[]进行设置。由于 mem_map[]仅用于管理主内存区中的页面使用 状况。所以,对于内核移动到任务 0 中而且调用 fork()建立任务 1 时(用于运行 init()),因为此时复制的页面还在内核区域,因此下面判断中的语句不会执行。这就是在内核空间中建立进程时没有写时复制的缘由。code

相关文章
相关标签/搜索