• Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel


    Kernel Page Global Directory (PGD) of User process created

    在早期版本:

    在fork一个进程的时候,必须建立进程自己的内核页目录项(内核页目录项要与用户空间
    的页目录放在同一个物理地址连续的页面上,所以不能共享,但所有进程的内核页表与进
    程0共享)
    3G用户,页目录中一项映射4M的空间(一项页目录1024项页表,每项页表对应1个页面4K
    ),即:
    #define PGDIR_SHIFT 22
    #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
    >>> sys_fork->do_fork->copy_mm->mm_init->pgd_alloc->get_pgd_slow
    #if CONFIG_X86_PAE
    。。。。。。。。。。。。。
    #else
    extern __inline__ pgd_t *get_pgd_slow(void)
    {
    >>> 分配页目录表(包含1024项页目录),即为一个进程分配的页目录可以映射的空间为
    1024*4M=4G
     pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
     if (pgd) {
    >>> #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE)
    >>> TASK_SIZE为3G大小,USER_PTRS_PER_PGD为用户空间对应的页目录项数目(
    3G/4M=768)
    >>> 将用户空间的页目录项清空
      memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
    >>> 将内核页目录表(swapper_pg_dir)的第768项到1023项拷贝到进程的页目录表的第
    768项到1023项中
      memcpy(pgd + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD, 
    (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
     }
     return pgd;
    }
    #endif

    比較後來的版本:

    pgd_t *pgd_alloc(struct mm_struct *mm)  -> 
     pgd_ctor(mm, pgd); //关键代码,将指向内核空间的页目录项拷贝到新分配的pgd对应的项目中。
    ->
        clone_pgd_range(pgd + KERNEL_PGD_BOUNDARY, //item points to the kernel space
                 swapper_pg_dir + KERNEL_PGD_BOUNDARY, KERNEL_PGD_PTRS);

    ref. 

    [1] http://biancheng.dnbcw.info/linux/321897.html

    [2] http://m.blog.csdn.net/blog/SunnyBeiKe/6898253

  • 相关阅读:
    设置zookeeper开机自启动
    安装zookeeper
    Elasticsearch 5.6.5 安装head插件
    [redis] Node is not empty. Either the node already knows other nodes
    【redis】 redis 创建集群时,Waiting for the cluster to join.... 一直等待
    [redis] redis.clients.jedis.exceptions.JedisDataException: MOVED 13102 127.0.0.1
    [linux] FastDFS访问文件,400 Bad Request
    [linux] Nginx编译安装错误error: the HTTP rewrite module requires the PCRE library
    [java] java解析txt文件
    【java】 java 解压tar.gz读取内容
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3833610.html
Copyright © 2020-2023  润新知