#define free_list (free_area.free_list)
#define nr_free (free_area.nr_free)
static void
default_init(void) {//初始化操作
list_init(&free_list);//链表初始化
nr_free = 0;//空闲内存清零
}
static void
default_init_memmap(struct Page *base, size_t n) {//内存块信息载入以及初始化
assert(n > 0);
struct Page *p = base;
for (; p != base + n; p ++) {
assert(PageReserved(p));
p->flags = p->property = 0;//头标志位、块数清零
set_page_ref(p, 0);
}
base->property = n;//创建一块大空闲内存
SetPageProperty(base);
nr_free += n;//设置空闲内存内的块数
list_add(&free_list, &(base->page_link));//内存块插入空闲分配链表
}
static struct Page *
default_alloc_pages(size_t n) {//内存分配函数
assert(n > 0);
if (n > nr_free) {
return NULL;
}
struct Page *page = NULL;
list_entry_t *le = &free_list;
while ((le = list_next(le)) != &free_list) {//根据first-fit算法特点进行首次适应块分配
struct Page *p = le2page(le, page_link);
if (p->property >= n) {
page = p;
break;
}
}
if (page != NULL) {//对找到的可以块进行相应处理
list_del(&(page->page_link));//从空闲内存链上摘除
if (page->property > n) {//将分配块富余的部分切下来重新挂到空闲链上
struct Page *p = page + n;//新块的首块地址
p->property = page->property - n;//新块的大小
SetPageProperty(p);
list_add(page->page_link.prev, &(p->page_link));//挂载新块
}
nr_free -= n;
ClearPageProperty(page);
}
return page;
}
static void
default_free_pages(struct Page *base, size_t n) {//内存块释放以及前后合并
assert(n > 0);
struct Page *p = base;
for (; p != base + n; p ++) {//块数据初始化
assert(!PageReserved(p) && !PageProperty(p));
p->flags = 0;
set_page_ref(p, 0);
}
base->property = n;
SetPageProperty(base);
list_entry_t *le = list_next(&free_list);
list_add(&(free_list),&(base->page_link));//块插到空闲链头结点下面
while (le != &free_list) {//对链表位置进一步调整
p = le2page(le, page_link);
le = list_next(le);
if(p + p->property <= base){//空闲块前面存在其他空闲块
list_del(&(base->page_link));//原来位置删掉
if(p + p->property == base){//空闲块和前面的空闲块相邻->合并操作
p->property += n;
ClearPageProperty(base);
base = p;
}
else{
list_add(&(p->page_link),&(base->page_link));//不相邻直接插在后面
}
}
else{
if(base + base->property == p){//和下面的相邻直接合并退出
base->property += p->property;
list_del(&(p->page_link));
ClearPageProperty(p);
}
break;
}
}
nr_free += n;
}
static size_t
default_nr_free_pages(void) {
return nr_free;
}
ucore 操作系统os first-fit 算法实现
最新推荐文章于 2024-03-25 22:41:44 发布