进程地址空间
来源:互联网 发布: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中是否缓存了改虚拟地址到物理地址的映射,如果在缓存中直接命中,物理地址立刻返回,否则,就需要再通过页表搜索需要的物理地址。
进程地址空间由进程可以寻址的虚拟内存组成,而内核也允许进程使用这种虚拟内存中的地址。进程只能访问有效区域内的内存地址,内存区域可以包含的内存对象如下:
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
- 进程地址空间
- 进程地址空间[1]
- 进程地址空间[2]
- 进程地址空间[3]
- 进程地址空间[4]
- 进程地址空间
- 进程的地址空间
- 进程地址空间
- 进程地址空间
- 8. 进程地址空间
- 进程地址空间
- Linux进程地址空间
- 进程地址空间分布
- Linux进程地址空间
- 进程地址空间
- 进程地址空间
- LINUX进程地址空间
- linux 进程地址空间
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- eclipse启动tomcat出现内存溢出错误 java.lang.OutOfMemoryError: PermGen space
- 几个简单的排序算法
- 黑马程序员——IO复习小结(二)
- 最大公约数(欧几里得算法)
- 进程地址空间
- libevent源码深度剖析二
- mysql主从配置成功后无法同步
- poj1947 Rebuilding Roads 树形背包
- 戏说java web开发中的listener和filter
- 几种常用排序算法图解
- 切片与合并
- GB2312 GBK UTF-8的区别
- ld链接器组织obj顺序