Linux中内存分配和回收.docVIP

  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中内存分配和回收

一。 HYPERLINK /linuxmm \l NBE1 系统启动时的内存操作 二。 HYPERLINK /linuxmm \l NBE2 伙伴算法 三。 HYPERLINK /linuxmm \l NBE3 slab分配器 四。 HYPERLINK /linuxmm \l NBE4 slob分配器 五。 HYPERLINK /linuxmm \l NBE5 slub分配器 六。 HYPERLINK /linuxmm \l NBE6 kmalloc和kfree 七。 HYPERLINK /linuxmm \l NBE7 vmalloc和vfree 八。 HYPERLINK /linuxmm \l NBE8 glibc中的malloc和free 九。 HYPERLINK /linuxmm \l NBE9 参考资料 一。[[Anchor(NBE1)]]系统启动时的内存操作 1。pg0的位置和尺寸 当系统刚刚启动时,在分页功能未打开前,线性地址和物理地址是一一对应的。刚开启分页功能时,pg0的内存地址是 在编译内核时定义好的,见arch\i386\kernel\vmlinux.lsd.S,大小为4096字节,启始地址紧跟内核在内存中物理地址。由于 内核保护模式代码启始位置为0x100000,所以pg0地址=0x100000+内核保护模式代码尺寸。 对pg0的操作主要是开启分页机制时填写页面描述表信息,上一节在第一次页寻址设置中已经详细介绍。 2。内存位图的内存操作 内存位图是系统设置区域和页面管理前的内存使用状态表。 2.1内存位图的位置和尺寸 位图contig_page_data.bdata-node_bootmem_map的起始地址跟在init_pg_tables_end的后面。大小等于所有物理页面数除以32,即每一位代表一个页面。 首先我们看文件arch/i386/kernel/setup.c中的setup_memory函数 min_low_pfn = PFN_UP(init_pg_tables_end); 然后看同样文件中的函数setup_bootmem_allocator bootmap_size = init_bootmem(min_low_pfn, max_low_pfn); 在init_bootmem中min_low_pfn是init_pg_tables_end的页框号 最终在函数init_bootmem_core中我们看到 bdata-node_bootmem_map = phys_to_virt(PFN_PHYS(mapstart)); 其中mapstart就是min_low_pfn;bdata就是NODE_DATA(0),也就是contig_page_data.bdata 所以contig_page_data.bdata-node_bootmem_map就是init_pg_tables_end指向地址 我们前面已经介绍init_pg_tables_end的实际位置和内核大小有关 init_pg_tables_end=内核保护模式代码启始地址(0x100000)+内核保护模式代码尺 寸+pg0的1024个4字节页面描述符号+保证第一次分页设置的页表尺寸(一般还需要若干1024个4字节的页面描述符号,由内核尺寸决定)+描述1G 内存的位图尺寸128K字节+描述1G内存的页表空间(1024*4096字节)+间隔空间(4*4096字节) 可以看出如果内核尺寸在4M左右,描述1G内存也需要大量页表空间(4M),这样第一次分页设置实际上就至少需要3个页表的页描述符。 2.2内存位图的释放 在设置了区域和页面管理以后,内存位图就不需要了。释放内存位图的内存时,使用了函数free_pages_bootmem。 首先见启动过程中的mem_init()函数,这是在设置了区域和页面管理后执行的。我们看其中的 free_all_bootmem()调用,在free_all_bootmem_core中将bdata-node_bootmem_map的 对应页面结构逐个调用free_pages_bootmem。 在free_pages_bootmem中首先清除了页面结构的PG_reserved标记,然后设置页面使用记数count为1,最后调用free_page(下面会详细描述)。 3。pte的内存分配 设置页表时,pte的内存分配使用了函数alloc_bootmem_low_pages,由于此时区域页面管理还未开始使用,使用的都是内存位图搜索。 在one_page_table_init中使用alloc_bootmem_low_pages为页表分配内存,大小为一个页面4096字节。 见mm/bootmem.c中的alloc_bootmem_

文档评论(0)

xxj1658888 + 关注
实名认证
文档贡献者

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档