进程的用户空间管理。每个进程经编译、链接后形成的二进制映像文件有一个代码段和数据段进程运行时须有独占的堆栈空间r堆栈段空洞进程的用户空间(3G)数据段代码段ΛV
• 每个进程经编译、链接后形成的二进 制映像文件有一个代码段和数据段 • 进程运行时须有独占的堆栈空间 进程的用户空间管理 堆栈段 空洞 数据段 代码段 进程的用户空 间(3G) < >
进程用户空间,Linux把进程的用户空间划分为一个个区间,便于管理一个进程的用户地址空间主要由mm structr结构和vm area structs结构来描述。mmstruct结构它对进程整个用户空间进行描述vmareastructs结构对用户空间中各个区间(简称虚存区)进行描述
• Linux把进程的用户空间划分为一个个区间, 便于管理 • 一个进程的用户地址空间主要由mm_struct 结构和vm_area_structs结构来描述。 • mm_struct结构它对进程整个用户空间进行 描述 • vm_area_structs结构对用户空间中各个区 间(简称虚存区)进行描述 进程用户空间 < >
mm struct 结构struct mm_struct{atomic_t count;pgd_t * pgd;int map_count;struct semaphore mmap sem;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,total_vm, locked_vm;unsigned long def_flags;struct vm_area_struct *mmap, *mmap_avl, *mmap_cache;unsigned long swap_cnt;unsigned long swap_address;1;
struct mm_struct { atomic_t count; pgd_t * pgd; int map_count; struct semaphore mmap_sem; 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, total_vm, locked_vm; unsigned long def_flags; struct vm_area_struct *mmap, *mmap_avl, *mmap_cache; unsigned long swap_cnt; unsigned long swap_address; }; mm_struct 结构 < >
域名说明对mn_struct结构的引用进行计数。为了在Linux中实现线程,内核调用clone派生一个线程,线程count和调用进程共享用户空间,即mm_struct结构,派生后系统会累加mm_struct中的引用计数。pgd进程的页目录基地址,当调度程序调度一个进程运行时,就将这个地址转成物理地址,并写入控制寄存器(CR3)在进程的整个用户空间中虚存区的个数map_countsemaphore对mm struct结构进行串行访问所使用的信号量Start_code,end_cod进程的代码段和数据段的起始地址和终止地址start data,enddatastart_brk, brk,每个进程都有二个特殊的地址区间,这个区间就是所谓的堆,也就是图4.4中的空洞。前两个域分别描述堆的起始地址和终止的地址,最后一个域描述堆栈段的起始start_stack:地址。命令行参数所在的堆栈部分的起始地址和终止地址:arg_start, arg_end,env_start,env_end环境串所在的堆栈部分的起始地址和终止地址rss, total_vm,进程贮留在物理内存中的页面数,进程所需的总页数,被锁定在物理内存中的页数。locked_vmmmapvm_area_struct虚存区结构形成一个单链表,其基址由小到大排列mmap_avlvm_area_struct虚存区结构形成一个颗AVL平衡树最近一次用到的虚存区很可能下一次还要用到,因此,把最近用到的虚存区结构放mmap_cache入高速缓存,这个虚存区就由mmap_cache指向
域名 说 明 count 对mm_struct结构的引用进行计数。为了在Linux中实现线程,内核调用clone派生一个线程,线程 和调用进程共享用户空间,即mm_struct结构,派生后系统会累加mm_struct中的引用计数。 pgd 进程的页目录基地址,当调度程序调度一个进程运行时,就将这个地址转成物理地址,并写入控制 寄存器(CR3) map_count 在进程的整个用户空间中虚存区的个数 semaphore 对mm_struct结构进行串行访问所使用的信号量 Start_code,end_cod e, start_data, end_data 进程的代码段和数据段的起始地址和终止地址 start_brk, brk, start_stack; 每个进程都有一个特殊的地址区间,这个区间就是所谓的堆,也就是图4.4中的空 洞。前两个域分别描述堆的起始地址和终止的地址,最后一个域描述堆栈段的起始 地址。 arg_start, arg_end, env_start, env_end 命令行参数所在的堆栈部分的起始地址和终止地址; 环境串所在的堆栈部分的起始地址和终止地址 rss, total_vm, locked_vm 进程贮留在物理内存中的页面数,进程所需的总页数,被锁定在物理内存中的页数。 mmap vm_area_struct虚存区结构形成一个单链表,其基址由小到大排列 mmap_avl vm_area_struct虚存区结构形成一个颗AVL平衡树 mmap_cache 最近一次用到的虚存区很可能下一次还要用到,因此,把最近用到的虚存区结构放 入高速缓存,这个虚存区就由mmap_cache指向
VM AREA STRUCT 结构struct vm area struct {struct mm_struct * vm_mm;unsigned long vm_start;unsigned long vm_end;pgprot t vm page prot:unsigned short vm_flags;struct vm area struct *vm next;short vm avl height:struct vmarea struct *vm avl_left, *vm avl right;struct vm operations_struct * vm_ops;struct vm area struct *vm next share,**vm pprev share;unsigned long vm offset;struct file * vm_file;unsigned long vm pte;
struct vm_area_struct { struct mm_struct * vm_mm; unsigned long vm_start; unsigned long vm_end; pgprot_t vm_page_prot; unsigned short vm_flags; struct vm_area_struct *vm_next; short vm_avl_height; struct vm_area_struct *vm_avl_left, *vm_avl_right; struct vm_operations_struct * vm_ops; struct vm_area_struct *vm_next_share, **vm_pprev_share; unsigned long vm_offset; struct file * vm_file; unsigned long vm_pte; }; VM_AREA_STRUCT 结构 < >