进程地址空间

用户空间中进程的内存,由进程可寻址的虚拟内存组成,一般为32位或64位的平坦地址空间,但不是所有虚拟地址都可以访问的,其中可以被访问的合法地址空间称为 内存区域,内存区域有对进程可读、可写、可执行属性,包括代码段、数据段、bss段、进程用户空间栈、共享库、内存映射文件、共享内存段、匿名内存映射,当一个进程的地址空间与另一个进程的地址空间有相同的内存地址,称为 线程(是否共享地址空间是进程和线程的唯一区别)
                                                                                                              
内存描述符(mm_struct)结构体表示进程的地址空间,包含和进程地址空间有关的全部信息(mm_users、mm_count、mmlist、mmap、mm_rb,其中mmap和mm_rb指向全部内存区域对象,前者使用 链表,后者使用 红黑树)                                                                                                                                                                                                                                                                                 
  • 进程描述符(task_struct)中mm域存放着进程使用的内存描述符                                                                                                                                           
内核线程没有进程地址空间,不需要访问任何用户空间的内存,当需要访问内核内存时,直接使用前一个进程的内存描述符       

虚拟内存地址(VMA)由vm_area_struct结构体描述了指定地址空间内连续区间上的一个独立内存范围,作为一个单独的内存对象管理,拥有一致属性,vm_mm域指定了相关的mm_struct结构体,vm_flags包含了内存区域的整体信息(如vm_shared、vm_reserved、vm_read等)

cat /proc/n/maps (和pmap)都可以查看给定进程的内存空间和其中所含的内存区域
输出格式:
开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件,mapped表示进程的全部地址空间,writable/private表示可写和私有的

do_mmap()函数创建一个新的线性地址区间,由file指定文件,文件中从偏移offset处开始,长度为len字节的范围内的数据,指定了文件名和偏移量(文件映射),为null( 匿名映射

linux中使用三级页表来完成地址转换(虚拟地址-物理地址),顶级页表(页全局目录PGD)、二级页表(中间页目录PMD),最后一级页表(页表)

猜你喜欢

转载自blog.csdn.net/u012989012/article/details/79714296