对于"从内核空间创建进程没有COW(写时复制)“的理解
2017-08-10 00:00
447 查看
###关于写时复制
父进程创建子进程之后,并不是将自己的数据段、堆和栈完全复制一份给子进程,而是将这些区域的访问权限设置为只读,如果父进程或者子进程的中的任一个试图修改这些区域,则内核将为修改区域的那块内存制作一个副本。在此之前,内核仅为子进程分配虚拟地址,父子进程共享同一段物理地址。
但是在内核空间创建进程时没有写时复制。在mm/memory.c中,
copy_page_tables函数中有这样一段代码:
LOW_MEM是1M,对于位于 1MB 以下的页面,说明 是内核页面,因此不需要对 mem_map[]进行设置。因为 mem_map[]仅用于管理主内存区中的页面使用 情况。因此,对于内核移动到任务 0 中并且调用 fork()创建任务 1 时(用于运行 init()),由于此时复制的页面还在内核区域,所以下面判断中的语句不会执行。这就是在内核空间中创建进程时没有写时复制的原因。
父进程创建子进程之后,并不是将自己的数据段、堆和栈完全复制一份给子进程,而是将这些区域的访问权限设置为只读,如果父进程或者子进程的中的任一个试图修改这些区域,则内核将为修改区域的那块内存制作一个副本。在此之前,内核仅为子进程分配虚拟地址,父子进程共享同一段物理地址。
但是在内核空间创建进程时没有写时复制。在mm/memory.c中,
copy_page_tables函数中有这样一段代码:
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()),由于此时复制的页面还在内核区域,所以下面判断中的语句不会执行。这就是在内核空间中创建进程时没有写时复制的原因。
相关文章推荐
- 从内核空间创建进程将导致没有写时复制
- Linux 0.11 内核在内核空间创建进程时不使用写时复制技术
- 对Linux0.11 "内核空间不使用写时复制机制" 本质理解
- 明确区分内存地址和进程空间地址(对于《windows核心编程》中15章部分内容的理解)
- 对linux 0.11版本内核中进程创建fork()的理解
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
- 编译内核出现:没有规则可以创建kernel.release需要的目标include/config/auto.conf
- uC/OS-ii内核源码理解(五)创建任务函数
- 分析Linux内核创建一个新进程的过程【转】
- 深入理解Linux内核 chap 3 进程
- windows笔记-跨越进程边界共享内核对象【复制对象句柄】
- 作业六:分析Linux内核创建一个新进程的过程
- Clapack安装(没有那个网站的账号,只好复制到自己的空间保存起来)
- 分析Linux内核创建一个新进程的过程(Linux)
- SAP使用VL01N创建发货报错“对于指导所选日期的交货没有到期的计划行”的原因
- 第六周分析Linux内核创建一个新进程的过程
- linux进程创造 - 内核进程初始化及创建
- Linux 内核--fork()函数创建进程