私には割り当てがあり、できる限り最善を尽くしましたが、何を試しても最適なスキームを得ることができません。以下はコードです。slob_page_alloc
ベスト フィットを実装するために、関数に変更を加えました。コードを以下に示します。
static void *slob_page_alloc(struct page *sp, size_t size, int align)
{
slob_t *prev, *cur, *aligned = NULL, *best_fit=NULL;
/* See SLOB_UNITS defination for meaning of macro. units is required
* number OF units.*/
int delta = 0, units = SLOB_UNITS(size);
unsigned long frag_size = -1UL;
/*Iterate throught the whole page to find best fit*/
//printk("Before the for loop\n");
printk("Starting slob_page_alloc execution\t");
for(prev=NULL, cur=sp->freelist; ; prev=cur, cur=slob_next(cur)) {
slobidx_t avail = slob_units(cur);
if(align) {
aligned = (slob_t *)ALIGN((unsigned long)cur, align);
delta = aligned - cur;
}
if(avail >= delta+units) {
if( frag_size > avail-units ) {
frag_size = avail-units;
best_fit = cur;
}
}
if(slob_last(cur))
break;
}
//printk("after the for loop.\n");
if(best_fit) {
slobidx_t avail = slob_units(best_fit);
//printk("best fit found\n");
if (align) {
aligned = (slob_t *)ALIGN((unsigned long)best_fit, align);
delta = aligned - best_fit;
}
if (avail >= units + delta) { /* room enough? */
slob_t *next;
if (delta) { /* need to fragment head to align? */
next = slob_next(best_fit);
/*Update the newly fragmented slob*/
set_slob(aligned, avail - delta, next);
/* Update the lod slob about reduced size
* and new next slob*/
set_slob(best_fit, delta, aligned);
prev = best_fit;
best_fit = aligned;
avail = slob_units(best_fit);
}
next = slob_next(best_fit);
if (avail == units) { /* exact fit? unlink. */
if (prev)
set_slob(prev, slob_units(prev), next);
else
sp->freelist = next;
} else { /* fragment */
if (prev)
set_slob(prev, slob_units(prev), best_fit + units);
else
sp->freelist = best_fit + units;
set_slob(best_fit + units, avail - units, next);
}
sp->units -= units;
if (!sp->units)
clear_slob_page_free(sp);
printk("Returned from slob_page_alloc\t");
return best_fit;
}
}
printk("Returned from slob_page_alloc\t");
return NULL;
}
このスキームでカーネルを構成すると、どこかでハングします。
デバッグ:
この機能と機能のどこかで印刷を行いましたslob_alloc
。私には意味がありませんが、私の関数は何度も呼び出されて正常に戻り、再び呼び出されて戻ります。しかし、ある時点で呼び出されると、この関数内のステートメントが出力されますが、呼び出し先からのステートメントは出力されず、無期限にハングします。
どんな助けでも大歓迎です!! ありがとう。