内存管理基础.docVIP

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
系统对进程的虚拟内存管理:mm{},vm_area_struct{} 系统对物理内存管理:page{} 每个进程都可用4G的虚拟地址空间 0~4G, 每个进程的页表不同(page table : 内存映射。 Memory mapping) 几种内存地址: ??????????????????????????? 物理地址(PA), 虚拟地址:? 内核空间: 3~4G共1G, 内核虚拟地址(其中包括896M的内核逻辑地址) 又划分为两部 分:实际的物理地址直接映射到内核空间, 当实际物理内存896M时,此时要做映射,通过建立页表, 只有前896M存 在这种映射关系 当实际物理内存896M时,PA全部映射到内核空间,此时内核VA – 3G = 对应的物理PA,反之亦然。此部分地址称为内核逻辑地址区域kernel logical address ?????? 用户空间:? 0~3G ,页表映射 ? ?? 高端内存: 896M的内存空间 ?? 以上4G虚拟地址空间分配见本子Figure-1。重点掌握kernel logical address 见课件 涉及到的内核结构体: ????? task-struct { mm_struct *mm ;} ?????? ? mm_struct *mm {pgd_t pgd;} ???? ?vm_area_struct? * mmap{ }?? /* emphasis Linux内核中对应进程内存区域的数据结构,一个进程有多个内存区域, 所以有多个vma*/ cat /proc/pid/map 内存映射 的两层含义:1. 把VA 映射到对应的 PA上(对VA的操作即对PA的操作) ??????????????????? 2. 把一个文件的地址空间(文件打开后有缓存,即文件 打开后存在于内存上,占用一定内存空间)映射到进程,让进程可以通过访问内存从而访问文件。 ? 内存映射的基本单位都是VMA,如struct file_operations{ ?????????????????????????????????? ???????????????????? int (*mmap) (struct file *,? struct vm_area_struct *); } ? Linux内存管理中,4G的进程地址空间, 0-3G为用户空间,3-4G为内核空间,内核空间中小于896M的虚拟内存可以通过offset容易的映射到物理内存,大于896M的部分通过页表映射到物理内存,假 如只有800M内 存,会被内核空间完全映射,那用户空间的虚拟地址映射到物理内存哪里? 是不是内核空间虽然能够完全映射到物理内存,但是因为不会全部使用物理内存,所以当用户空间需要内 存映射时,会从物理内存中空闲的部分进行映射?如果是这样,对于物理内存而言,同时存在着内核空间的映射和当前进程的用户空间的映射 ? Problems: 文件打开后被调入内存,称之为缓存 下载一个新的内核 ? 叶框与页区别 页的状态 page cache, buffer cache file inode char tr = malloc(0); 把各个函数都用一下,把每个函数的返回值打印出来,看在哪个空间内。 ? 8.1进程与内存 8.1.1进程如何使 用内存(进程的内存映像) ?????? 毫无疑问所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码, 或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。 ?????? 对任何一个普通进程来讲,它都会涉及到5种不同的数据段。稍有编程知识的朋友都该能想到这几个数据段种包含有“程序代码段”、“程序数据 段”、“程序堆栈段”等。不错,这几种数据段都在其中,但除了以上几种数据段之外,进程还另外包含两种数据段。下面我们来简单归纳一下进程对应的内存空间 中所包含的5种不 同的数据区(由vm_area_struct描述各个段)。 ? 代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作, 而不允许写入(修改)操作——它是只读不可写的。 ? 数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。可读可写 ? BSS段[2]:BSS段包含了程序中未初始化全局变量,在内存中 bss段 全部置零。 ? 堆(heap):堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张

文档评论(0)

word.ppt文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档