zoukankan      html  css  js  c++  java
  • 虚拟存储器摘总

    虚拟内存

    http://www.cnblogs.com/feng9exe/p/6379686.html

    来理解一下虚拟地址映射的过程:拿到一个虚拟地址,根据已有的vm_area_struct看这个虚拟地址是否属于某个vm_area_struct

    • 如果没有匹配到,就报段错误,访问了一个没有分配的虚拟地址。
    • 如果匹配到了vm_area_struct,根据虚拟地址和页表的映射关系,找到对应的页表项PTE,如果PTE没有分配,就报一个缺页异常,去加载相应的文件数据到物理内存,如果PTE分配,就去相应的物理页的偏移位置读取数据

    所以虚拟页的三种状态的实际含义如下:

    • 未分配虚拟页,指的是没有使用mmap建立vm_area_struct,所以也就没有对应到具体的页表项
    • 已分配虚拟页,未映射到物理页,指的是已经使用了mmap建立的vm_area_struct,可以映射到对应的页表项,但是页表项没有指向具体的物理页
    • 已分配虚拟页,已映射到物理页,指的是已经使用了mmap建立的vm_area_struct,可以映射到对应的页表项,并且页表项指向具体的物理页

    mmap要么映射到一个后备文件,要么映射到一个匿名文件。操作系统分配物理内存时实际用到了匿名文件的mmap。

    2. vm_page_prot 表示这个区域的页的访问权限

    http://blog.csdn.net/xu3737284/article/details/12710217

    linux操作系统是通过sys_exec对可执行文件进行映射以及读取的,有如下几步:

      1.创建一组vm_area_struct

      2.圈定一个虚拟用户空间,将其起始结束地址(elf段中已设置好)保存到vm_start和vm_end中。

      3.将磁盘file句柄保存在vm_file中

      4.将对应段在磁盘file中的偏移值(elf段中已设置好)保存在vm_pgoff中;

      5.将操作该磁盘file的磁盘操作函数保存在vm_ops中

    http://blog.csdn.net/al_xin/article/details/38590931

    一个具体区域结构包含下面的字段:

    • vm_start:指向这个区域的起始处。
    • vm_end:指向这个区域的结束处。
    • vm_prot:描述这个区域的内包含的所有页的读写许可权限。
    • vm_flags:描述这个区域内页面是与其他进程共享的,还是这个进程私有的(还描述了其他一些信息)。
    • vm_next:指向链表中下一个区域结构。

    http://blog.csdn.net/chen98765432101/article/details/54881652

    缩写解释:

    VA:虚拟地址

    VPN:虚拟页号

    PTE:页表项

    PTEA:页表项地址

    PA:物理地址

    DATA:数据

    MMU:内存管理单元

    TLB:地址翻译缓冲器

    设置存储器层次结构主要是为了缓存低速的存储器。主存是对磁盘等设备的缓存,cache是对主存的缓存,tlb是对主存页表的缓存。

    http://www.cnblogs.com/feng9exe/p/6379650.html

    struct mm_struct
    {
        struct vm_area_struct *mmap;            /* list of VMAs */
        struct rb_root mm_rb;
        struct vm_area_struct *mmap_cache;      /* last find_vma result */
        ...
        unsigned long start_code, end_code, start_data, end_data;
        unsigned long start_brk, brk, start_stack;
        ...
    };

    struct vm_area_struct
    {
        struct mm_struct *vm_mm;        /* The address space we belong to. */
        unsigned long vm_start;         /* Our start address within vm_mm. */
        unsigned long vm_end;           /* The first byte after our end address
                                               within vm_mm. */
        ....
        /* linked list of VM areas per task, sorted by address */
        struct vm_area_struct *vm_next;
        ....
        /* describe the permissable operation */
        unsigned long vm_flags;
        /* operations on this area */
        struct vm_operations_struct * vm_ops;
        
        struct file * vm_file; /* File we map to (can be NULL). */
    } ;

  • 相关阅读:
    洛谷 P2148 [SDOI2009]E&D(SG函数入门)
    洛谷 P2197 【模板】nim游戏
    博弈整理
    洛谷 P2939 [USACO09FEB]改造路Revamping Trails(分层最短路二维dijs)
    洛谷 P3831 [SHOI2012]回家的路(最短路+分层图思想)
    BZOJ 2763 [JLOI2011]飞行路线(分层最短路)
    洛谷 P4016 负载平衡问题(费用流)
    洛谷 P1251 餐巾计划问题(费用流)
    把数组排成最小的数
    整数中1出现的次数(从1到n整数中1出现的次数)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7281297.html
Copyright © 2011-2022 走看看