• 笔记 4 :linux 0.11 中继续分析 0 号进程创建一号进程的 fork () 函数


    (27)本条目开始, 开始分析 copy_process () 函数,其又会调用别的函数,故先分析别的函数。 get_free_page () ;

    先 介绍汇编指令 scasb :

    以及 指令 sstosd :

    在这里插入图片描述

    以及 get_free_page 的源码注释:

    在这里插入图片描述

    (28) 接着介绍全局变量,指向当前进程的 task_struct 的指针 current :

    在这里插入图片描述

    (29) 接着介绍另一个全局变量 jiffies , 记录开机到现在的滴答数,每 10 ms :

    在这里插入图片描述

    (30) 接着介绍另一个函数 sched . h / get_limit ( 段选择子 ) , 返回选择子指定的段的段长度:

    在这里插入图片描述

    (31)再给出另一个函数 get_base ( 段描述符) 的源代码,计算段描述符中的基地址:

    在这里插入图片描述

    (32) 接着介绍生成 新进程的 TCB 中的 LDT 表中的描述符的函数 _set_base ( 描述符地址 , 段的基地址 ) :

    在这里插入图片描述

    以及 3-03b 函_set_gate,_set_seg_desc :

    在这里插入图片描述

    以及 3-03c 函_set_tssldt_desc :

    在这里插入图片描述

    (33)接着介绍页目录表和页表的属性位,这关系到为新进程创建页目录结构:

    在这里插入图片描述
    +
    在这里插入图片描述

    (34) 在创建新进程,进行页复制的时候,我们疑惑原进程是如何可以访问更大的线性地址空间的,源于 _system_call 的设置:

    在这里插入图片描述

    (34) 更新 CR3 页目录表缓存的宏定义,在修改了页目录表以后:

    在这里插入图片描述

    (35)接着介绍又一个大的函数, copy_page_tables (),顾名思义,为新进程的创建复制页表,这不同于李忠老师的操作系统:

    在这里插入图片描述

    可见,进程 1 共享进程 0 的数据段和代码段。但进程 0 对自己的内存页有读写的权利,但进程 1 对这 160 页只有读的权利。这让咱们很疑惑,这有什么意义和影响呢?艺术书说了:这只是暂时的,待给进程 1 分配了新的程序,就会解除这种共享关系,并重新组织自己的内存结构。

    (36)接着介绍关于文件与节点的结构体 file 、 d_inode 、 m_inode , 因为进程控制块 TCB 里也会用到:

    在这里插入图片描述

    (37)我们复习下全局页目录表和 4 个页表的初始化,填写了什么数据,这将影响到 fork 函数中对内存页的申请与新进程页目录表和页表的完善:

    在这里插入图片描述

    (38)
    谢谢

  • 相关阅读:
    java VisualVM工具连接远程服务和实践
    【5】Docker中部署MySQL
    【Minio】新一代自建文件系统——Minio
    Linux下手动修改服务器时间(没网环境下)
    redis缓存一致性以及解决方案
    面试算法22:链表中环的入口节点(2)
    【opencv】多版本安装
    springboot+党员信息管理系统 毕业设计-附源码161528
    python_data_analysis_and_mining_action-master-7
    Java文件输入输出(简单易懂版)
  • 原文地址:https://blog.csdn.net/zhangzhangkeji/article/details/140409942