Linux进程地址空间管理_第1页
Linux进程地址空间管理_第2页
Linux进程地址空间管理_第3页
Linux进程地址空间管理_第4页
Linux进程地址空间管理_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux进程地址空间管理第一页,共24页。进程地址空间管理:管什么?管3GB的用户虚拟地址空间:哪些区域被分配了,哪些区域是空闲的被分配区域的用途、权限等属性信息页表的相应部分需要创建映射时再创建页表,不需要时释放页表(而内核空间对应的页表永不释放)被映射给进程的物理内存需要时动态申请,不需要时释放不要求物理内存必须连续回收暂时不用的页框(Ch.17)2第二页,共24页。进程地址空间管理2个原则“先申请,后使用”“不用了,及时释放”尽量推迟物理内存的分配时机3第三页,共24页。内存描述符(mm_struct)每个进程都有自己独立的3GB的线性地址空间。该空间不同的区域有不同的用途:代码区、全局数据区、栈区、堆区…与进程地址空间有关的全部信息都包含在一个叫内存描述符的数据结构中。4第四页,共24页。相关的数据结构task_struct用于描述一个进程,task_struct中有一个字段:structmm_struct*mm;mm_struct用于描述一个进程虚拟地址空间的布局。mm_struct中有一个字段mmap,指向了一个链表。

structvm_area_struct*mmapmmap链表中的一个节点vm_area_struct记录了实际分配的一个内存区域。5第五页,共24页。进程描述符(task_struct)structtask_struct{/*thesearehardcoded-don'ttouch*/volatilelongstate;/*-1unrunnable,0runnable,>0stopped*/longcounter;longpriority;….…………/*information*/structfs_struct*fs;/*open*/struct*files;/*memorymanagementinfo*/

structmm_struct*mm;….…………}第六页,共24页。内存描述符第七页,共24页。内存描述符(续)第八页,共24页。内存描述符(再续)第九页,共24页。线性区(vm_area_struct)必须记录进程地址空间中哪些区域被使用了,而哪些区域空闲。如果进程地址空间中的一个区域被分配给了进程,则内核会创建一个对应的线性区,也叫虚拟内存区(VMA)属于同一个进程地址空间的线性区形成一个链表。不同的VMA绑定不同的访问权限和属性:可读、可写、可执行、私有、共享、锁定等。不同的VMA中存放了不同类型的数据:代码、全局变量、只读数据、动态库…为了加速查找空闲虚拟内存区,Linux同时将同一进程的所有线性区组织成一棵红黑树。线性区的开始和结束都必须4KB对齐10第十页,共24页。VirtualMemoryAreas第十一页,共24页。与进程地址空间相关的数据结构mm_struct第十二页,共24页。触发进程空间的内存动态分配的操作进程创建:fork,execv,clone扩充/紧缩堆内存:brk,sbrk创建文件内存映射或匿名映射:mmap,mremap,munmap创建进程间共享内存:shmat,shmdt当用户堆栈不够用的时候,需要扩展堆栈上述操作都可能引起线性区数据结构的创建和删除。13第十三页,共24页。如何实现进程地址空间动态内存分配查找进程虚拟地址空间是否存在大小合适的空闲区域。如果有,则创建相应的线性区描述符vm_area_struct,并将其插入链表mmap线性区创建成功后,立即返回(注意,没有分配相应的物理页框,也没有修改页表!)当用户程序访问刚刚动态分配的内存时,会触发缺页异常。在缺页异常的中断服务程序中按“一次一页”的方式分配物理页框,并修改页表。14第十四页,共24页。增加或删除一个线性区第十五页,共24页。处理线性区的函数内核进程需要对一个线性区进行处理,比如确定一个给定线性地址是否存在于一个线性地址空间中find_vma(),查找一个线性地址所属的线性区两个参数:进程内存描述符的地址mm和线性地址addrfind_vma_intersection(),查找一个与给定地址区间重叠的线性区get_unmapped_area(),查找一个空闲的地址区间insert_vm_struct(),向内存描述符链表中插入一个线性区split_vma(),拆分线性区第十六页,共24页。创建一个线性区间mmap()和do_mmap(),创建一个线性区根据file参数映射指定的文件中偏移量为offset,长度为len的一段内容addr参数指明从何处开始查找一段可用的空闲线性地址区间Prot参数指定这个区间所包含的页的存取权限flags参数指定这个创建的线性区本身的一些标志staticinlineunsignedlongdo_mmap(structfile*file, unsignedlongaddr, unsignedlonglen, unsignedlongprot, unsignedlongflag, unsignedlongoffset)

include/linux/mm.h第十七页,共24页。删除一个线性区间munmap()和do_munmap()do_munmap()函数从进程地址空间中删除一段线性空间mm参数指向了当前进程的内存描述符addr参数为线性区的起始地址len参数指明要删除的区间大小intdo_munmap (structmm_struct*mm,unsignedlongaddr, size_tlen) mm/mmap.c第十八页,共24页。mmap内存映射利用mmap函数可以将一个磁盘文件或者其它设备对象映射到虚拟内存空间。文件被映射到多个页上,所有页的大小之和大于等于文件大小。19第十九页,共24页。mmap内存映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset)start:要映射到的虚拟内存区域的起始地址,通常都是用NULL,NULL表示由内核来指定该内存地址length:要映射的内存区域的大小prot:期望的内存保护标志,是以下的某个值,可以通过or运算符组合到一起1.PROT_EXEC可执行;2.PROT_READ可读;3.PROT_WRITE可执flags:指定映射对象的类型,映射选项和映射页是否可以共享。MAP_SHARED

/MAP_PRIVATE/MAP_LOCKED/MAP_ANONYMOUSfd:文件描述符(由open函数返回)offset:表示被映射对象(即文件)从那里开始对映,通常都是用0。该值应该为大小应为PAGE_SIZE的整数倍返回值:成功则返回被映射虚拟内存区的指针,失败返回-1。20第二十页,共24页。mmap内存映射int

munmap(void

*start,

size_t

length)取消映射关系

int

msync(const

void

*start,

size_t

length,

int

flags)将内存中的内容同步到文件

思考:mmap函数执行时会一次性将整个被映射文件读入内存吗?即用mmap函数映射一个大文件时会很耗时吗?21第二十一页,共24页。mmap的应用快速读写大文件,简化程序逻辑。快速读写I/O设备(如V4L库)创建进程间共享内存(可利用/dev/zero文件)在用户态的应用程序中直接读写物理内存(即读写指定物理地址上的内存单元)。/dev/mem是整个物理内存的全映像文件open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接着就可以用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论