美文网首页
Linux0.11写时复制机制详解

Linux0.11写时复制机制详解

作者: 看雪学院 | 来源:发表于2019-01-16 18:14 被阅读46次

当执行fork时,子进程除了通过get_free_page申请到一个页面用来存放内核栈和任务数据结构,子进程复制父进程的页表指向父进程空间,父进程空间被设置写保护,当父进程或子进程发生写的操作时,产生一个写保护中断,这时系统会再次申请一个空闲的页面,将原来的页面复制过来并重新映射到进程空间。

fork的核心是copy_mem,其作用是设置子进程的LDT并对父进程空间进行复制。

kernel/fork.c 可执行文件结构

如果data_limit小于data_limit或者code_base不等于data_base则报错死机。在linux0.11中代码段基地址和数据段基地址必须是相等的,并且必须满足条件data_limit = code_limit+数据段长度,这一点理解起来有点奇怪。

设置子进程代码段和数据段基地址为进程基地址(64MB对齐)。

接下来就是最重要的步骤复制页表copy_page_tables。这里仅仅是复制父进程的页表,并没有整个复制父进程的进程空间,父子进程共享原来父进程的空间,只有当其中一个进程发生写页面操作的时候才会对要写的页面复制出一个副本对这个副本进行写操作,这样以来可以极大地节约内存空间和减少创建进程时的开销。

mm/memory.c

copy_page_tables接收三个参数,from源地址,也就是我们父进程的基地址;to目的地址,也就是子进程的基地址 = nr × 64MB;size表示要复制多少。

mm/memory.c

copy_page_tables首先检查源地址是否64MB对齐,如果不是则报错死机。根据源地址和目的地址分别计算出对应的页目录项(取线性地址高10位×4),计算要复制多少个页表(一个页表指向4MB空间)。

mm/memory.c

接下来有两个循环,最外面的for循环复制页表,里面嵌套的for复制页表项。如果子进程的页目录项有效(P=1)意味着要覆盖一个有效的页目录,报错死机。当这个循环结束后子进程就会得到一个和父进程一模一样的页目录和页表,也就是父子进程共享了原来父进程的空间,共享空间的页面引用数+1。

注意第177~178行将父子进程中页表项都设置为只读,这样共享空间就被保护起来,当父进程或子进程尝试对其进行写操作就会进入写保护异常处理函数,进而发生写时复制(COW)。

mm/memory.c

最后刷新cpu页缓冲器保存以上的修改。

对共享空间写会导致写保护异常,cpu就会执行写保护异常处理函数do_wp_page。

 mm/memory.c

do_wp_page虽然有两个参数,但是有用的只有address,就是发生异常的地址,当执行完异常处理函数还要回到发生异常的语句处重新执行。do_wp_page实际上里面只有一个un_wp_page函数,他的参数是发生写保护异常的页目录项。

mm/memory.c

un_wp_page作用是解除写保护,他分两种情况处理。第一种情况是未共享页面,也就是页面引用数为1的页面,直接修改页表项属性;第二种是对共享页面处理,方法是申请一个空闲页面设置为可读可写,并把这个新页面映射到原来的线性地址,把共享页面内容复制过来,然后接下来对这个副本进行操作。注意,第二种情况中还要把页面引用数-1,当页面引用数为1时就直接修改页表项不用再复制页面了,算是一个以逸待劳的方法!

所以真正的写时复制是发生在un_wp_page中。

原文作者:极目楚天舒

原文链接:https://bbs.pediy.com/thread-248950.htm

转载请注明:转自看雪学院

更多技术文章:

[原创]在 VS2017 使用所有旧版本的平台工具集

[原创]支持Windows7 x64的kdusb3

[原创]手写fuzzer实现anti-debugging趣味实验 XD

[虚拟机保护] [原创] 手动分析VMP加密的x64驱动导入表

相关文章

  • Linux0.11缓冲区机制详解

    相关阅读(点击即可阅读哦~):Linux0.11写时复制机制详解LINUX0.11信号机制Linux0.11共享内...

  • Linux0.11写时复制机制详解

    当执行fork时,子进程除了通过get_free_page申请到一个页面用来存放内核栈和任务数据结构,子进程复制父...

  • linux系统编程-day10-进程管理(2)

    vfork( ): 上节学习了fork( )时的写时复制机制,实际上在早期并没有实现写时复制,在实现COW之前,U...

  • 写时复制技术(详解版)

    我们知道了一个进程如何采用请求调页,仅调入包括第一条指令的页面,从而能够很 快开始执行。然而,通过系统调用 for...

  • SAP ABAP 的两种内存对象类型

    要研究 SAP ABAP 内表的写时复制(copy on write)机制,ABAP Memory Inspect...

  • php7的写时复制机制

    1. 什么是写时复制 在《php7引用计数》的文章中,我们知道,对于复制类型的变量,在赋值时,我们并没有重新复制一...

  • 写时复制

    简介 写入时复制是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上...

  • 写时复制

    现在有一个父进程P1,这是一个主体,那么它是有灵魂也就身体的。现在在其虚拟地址空间(有相应的数据结构表示)上有:正...

  • 写时复制

    写时复制 在swift中,像Array、Dictionary、Set等集合类型都是通过写时复制(copy-on-w...

  • Android 编译时注解 —— 语法详解

    java Type 详解 java 反射机制详解 注解使用入门(一) Android 自定义编译时注解1 - 简单...

网友评论

      本文标题:Linux0.11写时复制机制详解

      本文链接:https://www.haomeiwen.com/subject/azzmdqtx.html