vm_area_struct结构

每一个用户态进程都有独立的页目录,pgd就是页目录指针。进程的3GB虚拟地址空间不可能是全部映射到物理内存中的,所以mm结构的vm_area_struct记录了虚拟地址空间的使用情况。 注意:page结构记录了物理内存的使用情况

struct vm_area_struct {
    struct mm_struct * vm_mm;  

    unsigned long vm_start;    
    unsigned long vm_end;       
    struct vm_area_struct *vm_next;

    pgprot_t vm_page_prot;        /* Access permissions of this VMA. */
    unsigned long vm_flags;        /* Flags, listed below. */

    struct rb_node vm_rb;


  1.     union {
            struct {
                         struct list_head list;
                         void *parent;
          1.                      struct vm_area_struct *head;
                              } vm_set;

        struct prio_tree_node prio_tree_node;
                } shared;


    struct list_head anon_vma_node;  
    struct anon_vma *anon_vma;   

    /* Function pointers to deal with this struct. */
    struct vm_operations_struct * vm_ops;

    /* Information about our backing store: */
    unsigned long vm_pgoff;        
    struct file * vm_file;       
    void * vm_private_data;       

#ifdef CONFIG_NUMA
    struct mempolicy *vm_policy;    /* NUMA policy for the VMA */
#endif
};

在这个结构中,vm_start和vm_end记录了这个进程当前使用的虚拟地址空间。假设一个进程的某段合法的起始虚拟地址为A,大小为2个物理页面,就需要一个vm_area_struct来描述这段虚拟地址区域。一个进程有多个虚拟地址区域,这些vm_area_struct根据虚拟地址被组织成一颗红黑树,这主要是为了加速查找的速度。假设进程最初仅仅从起始虚拟地址A开始映射了一个物理页面,当该进程首次访问大于A+4KB小于A+8KB的虚拟地址时,由于这个虚拟地址没有映射物理页面,因此会触发页面故障,此时缺页中断处理函数do_page_fault()将查找该进程的vm_area_struct结构,在本例中,这个被访问的虚拟地址在合法的范围内,所以do_page_fault()会分配一个新的物理页面并为这个虚拟地址建立映射,此时该进程成功的访问到第二个物理页面。

我们知道fork()会复制当前进程的task_struct结构,同时会为新进程复制mm结构。此时当前进程的3GB~4GB的内核态虚拟地址对应的页表项被复制到新进程的页表项中,所以说所有进程共享1GB的内核态地址空间。但是对于用户态虚拟地址区域,则把它的进程页表项设置为只读,这样当其中一个进程对其进行写入操作时,do_page_fault()会分配新的物理页面,并建立映射,从而实现Copy On Write机制。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值