进程之VMA

概念

mmap指针指向的vm_area_struct链表的每一个节点就代表进程的一个虚拟地址空间,即一个VMA。一个VMA最终可能对应ELF可执行程序的数据段、代码段、堆、栈、或者动态链接库的某个部分。

123
234

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 (*get_unmapped_area) (struct file *filp,                          
                unsigned long addr, unsigned long len,                              
                unsigned long pgoff, unsigned long flags);                          
    void (*unmap_area) (struct vm_area_struct *area);                               
    unsigned long mmap_base;        /* base of mmap area */                         
    unsigned long free_area_cache;      /* first hole */                            
    pgd_t * pgd;                                                                    
    atomic_t mm_users;          /* How many users with user space? */               
    atomic_t mm_count;          /* How many references to "struct mm_struct" (users count as 1) */
    int map_count;              /* number of VMAs */                                
    struct rw_semaphore mmap_sem;                                                   
    spinlock_t page_table_lock;     /* Protects page tables, mm->rss, mm->anon_rss */
                                                                                    
    struct list_head mmlist;        /* List of maybe swapped mm's.  These are globally strung
                         * together off init_mm.mmlist, and are protected           
                         * by mmlist_lock                                           
                         */                                                         
                                                                                    
    unsigned long start_code, end_code, start_data, end_data;                       
    unsigned long start_brk, brk, start_stack;                                  
    unsigned long arg_start, arg_end, env_start, env_end;                       
    unsigned long rss, anon_rss, total_vm, locked_vm, shared_vm;                
    unsigned long exec_vm, stack_vm, reserved_vm, def_flags, nr_ptes;           
                                                                                
    unsigned long saved_auxv[42]; /* for /proc/PID/auxv */ 
 }

问题:
1)在结构mm_struct中,mmap(vm_area_struct)中,每个VMA对应着BSS,HEAP,STACK。
在mm_struct中,start_stack和end_stack;start_code和end_code;start_data和end_data,对应的栈,代码和数据段和上面有些重复?
计划:写个程序,然后查看静态变量,或者malloc,或者brk或者mmap的内存都分布在这些结构的那些地方。

参考

Linux用户态进程的内存管理
https://zhuanlan.zhihu.com/p/36140049
brk() 和 mmap() 内存映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值