#author("2025-10-31T10:50:12+09:00","default:guest","guest") #author("2025-10-31T11:22:01+09:00","default:guest","guest") *参照元 [#x11332c7] #backlinks *説明 [#j7522234] -パス: [[linux-5.15/mm/page_alloc.c]] -与えられたマイグレーションの種類(MIGRATE_XXX)からfree_listを探し、要求されたサイズに合う最も小さい領域を返す。 -主なデータ構造と処理の流れ --zoneを探す(この関数に来た時点で既に決定されている、zone 引数で指定される) ---ZONE_DMA, ZONE_NORMALなど --free_areaを探す(確保するサイズのメモリオーダーごとに分かれている) ---1ページ(オーダー 0) ---2ページ(オーダー 1) ---4ページ(オーダー 2) ---8ページ(オーダー 3) ---... ---オーダーは MAX_ORDER - 1 が最大 --free_listを探す(2^nページの空き領域の先頭ページが並んだリスト) free_area[0] : [page 0], [page 8], [page 12] free_area[1] : [page 2, 3], [page 10, 11] free_area[2] : [page 4, 5, 6, 7] ... **引数 [#hc2b0655] -struct zone *zone --メモリゾーン --[[linux-5.15/zone]] -unsigned int order --メモリオーダー、2 のべき乗で指定する --0 なら 1 ページ、1 なら 2 ページ、n なら 2^n ページ --free_area の選択に使われる --メモリオーダー、2のべき乗で指定する --0なら1ページ、1なら2ページ、nなら2^nページ --free_areaの選択に使われる -int migratetype --マイグレーションの種類、MIGRATE_XXX を指定する --free_list の選択に使われる --マイグレーションの種類、MIGRATE_XXXを指定する --free_listの選択に使われる **返り値 [#w18e4b32] -struct page * --確保した領域の先頭ページ --[[linux-5.15/page]] **参考 [#kb707ffa] *実装 [#h753172b] /* * Go through the free lists for the given migratetype and remove * the smallest available page from the freelists */ static __always_inline struct page *__rmqueue_smallest(struct zone *zone, unsigned int order, int migratetype) { unsigned int current_order; struct free_area *area; struct page *page; /* Find a page of the appropriate size in the preferred list */ for (current_order = order; current_order < MAX_ORDER; ++current_order) { area = &(zone->free_area[current_order]); page = get_page_from_free_area(area, migratetype); if (!page) continue; del_page_from_free_list(page, zone, current_order); expand(zone, page, order, current_order, migratetype); set_pcppage_migratetype(page, migratetype); return page; } return NULL; } - --[[linux-5.15/page]] --[[linux-5.15/get_page_from_free_area()]] --[[linux-5.15/del_page_from_free_list()]] --[[linux-5.15/expand()]] --[[linux-5.15/set_pcppage_migratetype()]] *コメント [#l531f39b]