操作系统ucore lab2实验报告

操作系统lab2实验报告详细介绍了如何实现连续物理内存分配算法、寻找虚拟地址对应的页表项以及释放虚拟地址页。实验涉及的数据结构包括物理页属性结构和连续内存空闲块链表,主要函数包括内存分配、页表项查找和释放等操作。通过完成这些练习,对ucore的内存管理和虚拟内存映射有了深入理解。
摘要由CSDN通过智能技术生成

操作系统lab2实验报告

实验二主要是完成Ucore操作系统的物理内存管理。
主要包括了解如何建立对物理内存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。

练习0:填写已有实验

lab2会依赖lab1,需要把做的lab1的代码填到lab2中缺失的位置上面。这道题就是一个工具的利用。这里我使用的是linux下的一个叫做meld的工具。如下图:

直接将两个文件夹拖入,然后点击compare就行了。

然后他就会分析两份代码的不同,然后就一个个比较比较复制过去就行了,在软件里面是可以支持打开对比复制了。当然bin目录下都是make生成的就不用复制了,其他需要修改的地方主要有以下两个文件:

kdebug.c
trap.c

然后直接通过这个一一对比粘贴就行了。

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

在此之前我们要先熟悉两个数据结构:
第一个就是如下所示的每一个物理页的属性结构

struct Page {
    int ref;                        // page frame's reference counter
    uint32_t flags;                 // array of flags that describe the status of the page frame
    unsigned int property;          // the num of free block, used in first fit pm manager
    list_entry_t page_link;         // free list link
};

该结构四个成员变量意义如下:

  • 1、ref表示这样页被页表的引用记数,应该就是映射此物理页的虚拟页个数。一旦某页表中有一个页表项设置了虚拟页到这个Page管理的物理页的映射关系,就会把Pageref加一。反之,若是解除,那就减一。
  • 2、 flags表示此物理页的状态标记,有两个标志位,第一个表示是否被保留,如果被保留了则设为1(比如内核代码占用的空间)。第二个表示此页是否是free的。如果设置为1,表示这页是free的,可以被分配;如果设置为0,表示这页已经被分配出去了,不能被再二次分配。
  • 3、property用来记录某连续内存空闲块的大小,这里需要注意的是用到此成员变量的这个Page一定是连续内存块的开始地址(第一页的地址)。
  • 4、page_link是便于把多个连续内存空闲块链接在一起的双向链表指针,连续内存空闲块利用这个页的成员变量page_link来链接比它地址小和大的其他连续内存空闲块

然后是下面这个结构。一个双向链表,负责管理所有的连续内存空闲块,便于分配和释放。

typedef struct {
    list_entry_t free_list;         // the list header
    unsigned int nr_free;           // # of free pages in this free list
} free_area_t;
  • free_list是一个list_entry结构的双向链表指针
  • nr_free则记录当前空闲页的个数

有了这样两个结构加上课上的讲解,我们可以开始做实验了。
首先根据实验指导书,我们第一个实验需要完成的主要是default_pmm.c中的default_initdefault_init_memmapdefault_alloc_pagesdefault_free_pages几个函数的修改。


先来看看default_init函数,该函数它已经实现好了,不用做修改:

/*default_init: you can reuse the  demo default_init fun to init the free_list and set nr_free to 0.
free_list is used to record the free mem blocks. nr_free is the total number for free mem blocks.*/
static void default_init(void) { 
    list_init(&free_list);
    nr_free = 0;
}

然后是default_init_memmap,这个函数是用来初始化空闲页链表的,初始化每一个空闲页,然后计算空闲页的总数。
注释如下:

default_init_memmap:  CALL GRAPH: kern_init --> pmm_init-->page_init-->init_memmap--> pmm_manager->init_memmap
 *              This fun is used to init a free block (with parameter: addr_base, page_number).
 *              First you should init each page (in memlayout.h) in this free block, include:
 *                  p->flags should be set bit PG_property 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值