C Linux内核页面释放
我正在构建自己的内存池作为Linux内核模块。我修改了页面帧分配函数,以便用户级进程从内存池中获取页面帧。这个很好用。然后我尝试修改页面释放函数,以便在进程释放页面帧时回收它们。但每当我启用页面回收时,我都无法启动任何程序,控制台中会打印“分段错误”消息 我正在使用C Linux内核页面释放,c,memory-management,linux-kernel,C,Memory Management,Linux Kernel,我正在构建自己的内存池作为Linux内核模块。我修改了页面帧分配函数,以便用户级进程从内存池中获取页面帧。这个很好用。然后我尝试修改页面释放函数,以便在进程释放页面帧时回收它们。但每当我启用页面回收时,我都无法启动任何程序,控制台中会打印“分段错误”消息 我正在使用alloc_page(uuu-GFP\u-HIGHMEM | u-GFP\u-MOVABLE | u-GFP\u-ZERO)创建内存池,内存池进入每个cpu页面帧缓存,因此我得到的每个页面都有一个使用计数器(页面->\u计数)设置为1
alloc_page(uuu-GFP\u-HIGHMEM | u-GFP\u-MOVABLE | u-GFP\u-ZERO)
创建内存池,内存池进入每个cpu页面帧缓存,因此我得到的每个页面都有一个使用计数器(页面->\u计数)设置为1
对于页面释放,我在free\u pcppages\u bulk()
中插入了几行,当每cpu页面帧缓存希望将一些空闲页面刷新回Buddy系统时,会调用该命令:
static void free_pcppages_bulk(struct zone *zone, int count,
struct per_cpu_pages *pcp)
{
int migratetype = 0;
int batch_free = 0;
int to_free = count;
spin_lock(&zone->lock);
zone_clear_flag(zone, ZONE_ALL_UNRECLAIMABLE);
zone->pages_scanned = 0;
while (to_free) {
struct page *page;
struct list_head *list;
/*
* Remove pages from lists in a round-robin fashion. A
* batch_free count is maintained that is incremented when an
* empty list is encountered. This is so more pages are freed
* off fuller lists instead of spinning excessively around empty
* lists
*/
do {
batch_free++;
if (++migratetype == MIGRATE_PCPTYPES)
migratetype = 0;
list = &pcp->lists[migratetype];
} while (list_empty(list));
do {
page = list_entry(list->prev, struct page, lru);
/* must delete as __free_one_page list manipulates */
list_del(&page->lru);
/* MIGRATE_MOVABLE list may include MIGRATE_RESERVEs */
/* --ADDED BY ME-- */
if(colored_free != NULL) { /* if my memory pool is created */
if(!colored_free(page, zone)) { /* if it fails, free page to Buddy system */
__free_one_page(page, zone, 0, page_private(page));
}
}
else {
__free_one_page(page, zone, 0, page_private(page));
}
trace_mm_page_pcpu_drain(page, 0, page_private(page));
} while (--to_free && --batch_free && !list_empty(list));
}
__mod_zone_page_state(zone, NR_FREE_PAGES, count);
spin_unlock(&zone->lock);
}
在colored\u free()
中,我只需将页面描述符插入一个页面空闲列表中。由于页面使用计数器在释放到Buddy system时设置为0,因此我将其重置为1,以在创建内存池时恢复初始页面状态
有什么建议吗?或者有没有更好的方法将页面框架释放到我的内存池而不是好友系统