reserve mem
初始化:__fdt_scan_reserved_mem
由于此时设备树还没有展开,只能通过扫描所有设备树节点判断是否包含"reserve-memory"这个属性;
如果获取到了,得到它的child device_node,获取reg属性,里面包含size,length;
获取其是否包含no-map属性:
- 如果是no-map属性,将此段内存从早期的memory block内存管理移除
- 如果没有no-map属性,在memblock中reserve;
设备初始化:of_reserved_meme_device_init
分配内存:dma_alloc_coherent
与伙伴子系统的关系:
no-map
早期内存是通过memblock管理,no-map会将对应的内存从memory block移除; reuseable不会;
在mem_init时:free_low_memory_core_earyly->free_one_pages 会将memblock中的内存释放给伙伴子系统进行管理;
因此no-map的内存会脱离伙伴子系统的管理了;
在coherent.c,对此片内存进行io_remap,通过bitmap对此片内存进行管理,存在严重的内部碎片与外部碎片;
- 内部碎片:比如只需要5个page,会按照order 3 进行分配,有3个page的内部碎片;
- 外部碎片:只是简单的通过将bitmap置0,置1,久而久之,存在外部碎片;
reuseable
cma迁移类型;