比如,请求一个不可移动的页面时,如果系统从 MIGRATE_MOVABLE 迁移类型的 pageblock 中分配页面,会导致这个 pageblock 的迁移类型变成 MIGRATE_UNMOVABLE。通过 cma_init_reserved_areas() 迭代所有的 CMA 区域,将 CMA 区域以 pageblock 为单位分割,设置 pageblock 为 MIGRATE_CMA 迁移类型,然后通过 _free_pages() 函数将内存页面返还给 buddy 系统。这样就可以规避上述问题了。