电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

Linux中内存的分配和回收VIP免费

Linux中内存的分配和回收_第1页
1/17
Linux中内存的分配和回收_第2页
2/17
Linux中内存的分配和回收_第3页
3/17
一。系统启动时的内存操作 二。伙伴算法 三。slab 分配器 四。slob 分配器 五。slub 分配器 六。kmalloc 和 kfree 七。vmalloc 和 vfree 八。glibc 中的 malloc 和 free 九。参考资料 一。[[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 内存位图的释放 在设置了区域和页面管理以后,内存位...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

Linux中内存的分配和回收

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部