进程地址空间

来源:互联网 发布:mac os破解 编辑:程序博客网 时间:2024/05/29 11:30
进程地址空间
    进程地址空间由进程可以寻址的虚拟内存组成,而内核也允许进程使用这种虚拟内存中的地址。进程只能访问有效区域内的内存地址,内存区域可以包含的内存对象如下:
    1.可执行文件代码的内存映射,称为代码段
    2.可执行文件的已初始化全局变量的内存映射,称为数据段
    3.包含未初始化的全局变量,也就是bss段的零页的内存映射
    4.用于进程用户控件栈的零页的内存映射
    5.任何内存映射文件
    6.任何共享内存段
    7.任何匿名的内存映射,比如由malloc分配的内存
    内核使用内存描述符结构体mm_struct来表示进程的地址空间,该结构包含了和进程地址空间有关的全部信息,给结构简要信息如下:
    struct mm_struct {
        struct vm_area_struct *mmap;/*内存区域链表*/
        struct rb_root mm_rb;       /*vma形成的红黑树*/
        atomic_t mm_users;         /*使用地址空间的用户数*/
        atomic_t mm_count;          /*主使用计数器*/
        /**************/
        unsigned long start_code;   /*代码段开始的地方*/
        unsigned long end_code;     /*代码段结束的地方*/
        /**********充满了此类数据****/
  };
    内核同时使用两个计数器是为了区别主使用计数(mm_count)器和使用该地址空间的进程数目(mm_users);mmap和mm_rb这两个数据结构描述的对象是相同的:该地址空间中的全部内存区域,但是前者是以链表的形式存放而后者是以红-黑树的形式存放。mmap作为链表,利于简单、高效的遍历所有元素,而mm_rb结构作为红-黑树,更适合搜索指定元素。
    内核使用函数mmap或者do_mmap创建新的地址空间,当地址空间用完之后,调用mummap或者do_mummap删除地址空间。
    虽然应用程序的操作对象时映射到物理内存之上的虚拟内存,但是处理器直接操作的却是物理内存,所以在应用程序访问一个虚拟内存时,首先必须将虚拟内存转化为物理内存地址,处理器才可以处理,linux使用三级页表完成转换,但是可以按照需要在编译时简化使用页表的三级结构,比如只使用两级。该三级页表是:
    1.顶级页表是页全局目录(PGD),PGD中的表项指向二级页目录中的表项:PMD
    2.二级页表是中间页表(PMD),其中的表项指向PTE中的表项
    3.最后一级的页表简称为页表(PTE),该页表指向物理页表
    多数体系结构为了提高搜索内存中的物理地址的速度,都多数实现了TLB(翻译后缓冲器),TLB作为将一个虚拟地址映射到物理地址的硬件缓存,当请求访问一个虚拟地址时,处理器将首先检查TLB中是否缓存了改虚拟地址到物理地址的映射,如果在缓存中直接命中,物理地址立刻返回,否则,就需要再通过页表搜索需要的物理地址。

0 0
原创粉丝点击