操作系统ucore lab2实验报告

这篇实验报告详细介绍了Lab2的内容,包括实现first-fit内存分配算法、查找虚拟地址对应的页表项、释放页及取消页表映射。在first-fit算法中,初始化free_list并调整分配与释放页面的逻辑。实验还涵盖了页目录表的使用,确保能正确创建和查找页表项,以及在多进程环境中有效管理页的映射和释放。
摘要由CSDN通过智能技术生成

Lab2

Exercise0:填写已有实验

使用meld将lab1中的代码填入实验中

Exercise1:实现 first-fit 连续物理内存分配算法

default_init()
static void
default_init(void) {
    list_init(&free_list);
    nr_free = 0;
}

这个函数的正确代码已经给出,不需要进行修改。

函数的作用是对free_list进行初始化,对free_list 的头结点进行初始化,并且把free_list 中的nr_free设置为0,也就是把当前的空闲页中空闲页的数量先初始化为0。

default_init_memmap(struct Page *base, size_t n)
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;//设置标志位和property为0
        set_page_ref(p, 0);//将此页的引用计数设为零
    }
    base->property = n;//初始化块首的property为整个free_list的大小
    SetPageProperty(base);//将块首的标志位设置为free
    nr_free += n;//把free_list中的空闲块数量设置为n
    list_add_before(&free_list, &(base->page_link));//最后把整个空闲块加到free_area_t 中
}

这个函数的代码也已经给出,但其中有一些小的问题

问题出在把以base为头的整个空闲页链表加到free_list中时,最初给出的代码是把整个块加到头指针的后面,我把这里改成了加在头的前面,由于这是个双向循环链表,并且刚刚初始化,还是个空的链表,所以两个方法的结果是相同的,但是意义却是不同的。

在这几行代码中有些需要注意的地方:

p->flags = p->property = 0;//设置标志位</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值