温暖的电波  

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是没有建立线性映射的)。

posted on 2022-02-17 22:16  温暖的电波  阅读(1435)  评论(0编辑  收藏  举报