linux内存管理教程分析.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux Memory Management i386 MMU 进程的虚拟空间 内存的加锁和保护 物理空间管理 空闲物理内存管理 内核态实存的申请与释放 内核态虚存的申请与释放 页交换进程和页面换出 缺页中断和页面换入 Cache i386 MMU 段选择子(selector) 段描述符格式 G为段的粒度属性 G=0时,段的大小以字节为单位, G=1时,段的大小以4K字节为单位。 GDT入口分配 LDT入口分配 控制寄存器 CR3指示页目录表的起始地址 CR0寄存器的PE位(位0)用于控制段机制。PE=1则处理器工作于保护模式下;PE=0则处理器工作于实模式下,等同于8086 CR0的PG位(位31)用于控制分页机制。PG=1则启用分页机制,32位线性地址通过页表转换为物理地址;PG=0则禁止分页机制,32位线性地址直接寻址物理地址 当PE=1且PG=0时,处理器工作于保护模式下,但禁止分页机制。此时没有内存和磁盘之间的页面交换,也就不存在虚拟内存 当PE=1且PG=1时,处理器工作于保护模式下,但启用分页机制。此时有内存和磁盘之间的页面交换,磁盘起到虚拟内存的作用 CR2指示引起缺页中断的地址 32位线性地址 Linux分页管理 页目录项和页表项 PCB对存储空间的管理 虚存段vma 一个进程的虚拟空间 进程的虚拟空间分布 进程的虚拟空间分布 AVL树(Adelson-Velskii and Landis) 内存的加锁和保护 mm/mprotect.c,mm/mlock.c 对整个虚存段加锁或保护 对虚存段前部加锁或保护 对虚存段后部加锁或保护 对虚存段中部加锁或保护 初始化后物理存储分布 物理页面 空闲物理内存管理 bitmap表 在物理内存低端,紧跟mem_map表的bitmap表以位示图方式记录了所有物理内存的空闲状况。与mem_map一样,bitmap在系统初始化时由free_area_init()函数创建(mm/page_alloc.c)。 与一般性位图不同,bitmap表分割成NR_MEM_LISTS组(缺省值6)。 buddy算法 buddy算法分配空闲块,由_get_free_pages()和free_pages()函数执行。change_bit()函数根据bitmap的对应组,判断回收块的前后邻居是否也为空。 空闲物理内存管理 LINUX用free_area数组记录空闲的物理页帧 struct free_area_struct { struct page *next; /* 此结构的next,prev指针与struct page匹配 */ struct page *prev; unsigned int * map; /* 指向bitmap */ }; static struct free_area_struct free_area[NR_MEM_LISTS]; 空闲物理内存管理 内核态实存的申请与释放 kmalloc()和kfree() kmalloc_cache 在新版本里已经被SLAB替换 Slab: memory object(Solaris2.4) SLAB可供用户使用的函数有: kmem_cache_create(), kmem_cache_alloc(), kmalloc(), kmem_cache_free, kfree()/kfree_s(), kmem_cache_shrink(), kmem_cache_reap() 在新版本里已经被SLAB替换 内核态虚存的申请与释放 可分配的虚拟空间在3G+high_memory+HOLE_8M以上高端,由vmlist链表管理 申请与释放(mm/vmalloc.c) vmalloc()和vfree() vmlist链表的节点类型(include/linux/vmalloc.h) struct vm_struct { unsigned long flags; /* 虚拟内存块的占用标志 */ void * addr; /* 虚拟内存块的起始地址 */ unsigned long size; /* 虚拟内存块的长度 */ struct vm_struct * next; /* 下一个虚拟内存块 */ }; static struct vm_struct * vmlist = NULL; 3G+high_memory+HOLE_8M以上高端空间 页交换进程和页面换出 内核态交换进程kswapd 一个是内核线程(kernel thread):没有虚拟存储空间,运行在内核态,直接使用物理地址空间

文档评论(0)

美洲行 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档