1、reusable会在early_init_dt_reserve_memory_arch()函数中加入到memblock.reserve的region中,因而可以在/sys/kernel/debug/memblock/reserved中看到
2、no-map属性的内存在early_init_dt_reserve_memory_arch()函数中不会加入到memblock.reserve的region中,只会将其flag设置MEMBLOCK_NOMAP,因而在/sys/kernel/debug/memblock/reserved中无法看到
3、reusable属性的内存会在map_mem()函数中通过如下代码段进行建立线性映射
/* map all the memory banks */ for_each_mem_range(i, &start, &end) { //遍历所有的memblock.memory if (start >= end) break; /* * The linear map must allow allocation tags reading/writing * if MTE is present. Otherwise, it has the same attributes as * PAGE_KERNEL. */ //只映射MEMBLOCK_NOMAP属性的区域 __map_memblock(pgdp, start, end, pgprot_tagged(PAGE_KERNEL), flags); }
4、与第三部遥相呼应,no-map属性的内存不会在map_mem()中建立线性映射
下面是将内存加入到buddy系统的流程
5、reusable属性的内存不会释放到buddy系统。在free_low_memory_core_early()函数中会遍历所有的memblock.reserve区域,并通过reserve_bootmem_region(start, end)将各个reserved的PFN对应的struct page设置reserved标志:__SetPageReserved(page)
6、而no-map属性的内存在memblock.memory中,同样在free_low_memory_core_early()函数中会遍历所有(memory && !reserved)的memblock regions;同时在遍历过程中还会调用should_skip_region()过滤掉MEMBLOCK_NOMAP标志的region。因而对于no-map属性的内存区域,虽然在memblock.memory区且没有在memblock.reserve区,但是由于MEMBLOCK_NOMAP标志的存在是不会释放的buddy系统的(况且no-map是没有建立线性映射的)。