操作系统实验二实验报告

这篇博客详细介绍了ucore操作系统实验中关于物理内存管理的实践,包括first-fit分配算法的实现、虚拟地址对应的页表项查找以及页的释放。通过理解ucore的内存管理框架和页表寻址机制,博主逐步完成了各项练习。
摘要由CSDN通过智能技术生成

实验二:物理内存管理


练习0:填写已有实验

将lab1中已完成的代码更新到lab2中,在这里分别尝试了diff+patch和meld两种方法
在lab2目录下,trap.c的更新如下(注意可能需要手动在.patch文件中处理合并部分)

diff -c ./kern/trap/trap.c ../lab1/kern/trap/trap.c > ./kern/trap/trap.patch
patch -p2 -i ./kern/trap/trap.patch

对kdebug.c的更新使用meld,命令行输入meld后直接拖入要合并的文件并选择合并方式即可


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

1.1 理解ucore的机制

首先来看页的结构定义在kern/mm/memlayout.h

/* *
 * struct Page - Page descriptor structures. Each Page describes one
 * physical page. In kern/mm/pmm.h, you can find lots of useful functions
 * that convert Page to other data types, such as phyical address.
 * */
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
};

/* Flags describing the status of a page frame */
#define PG_reserved                 0      
#define PG_property                 1      
  • ref表示页被引用的计数器,当有一个虚拟页映射到了这个结构描述的物理页,计数器加1,反之减1,当变为0的时候要设置其标记位表示页是未分配的
  • flags表示页的状态标记,有2个标记,bit0表示此页是否被保留,若被保留则设置为1,bit1表示此页是否是空闲的,若是空闲则设置为1,可以通过SetPageReserved等宏进行标记的设置
  • property表示某连续内存空闲块的大小,即地址连续空闲页的个数,需要设置此变量的页是头页,连续内存空闲块地址最小的一页
  • page_link表示把多个连续内存空闲块链接在一起的双向链表指针,具体定义及操作参考libs/list.h

为了有效管理一系列地址不连续的多个小连续内存空闲块(块内的物理页是连续的),定义了free_area_t数据结构,包含有list_entry_t双向链表指针和nr_free记录当前空闲页个数的变量

/* free_area_t - maintains a doubly linked list to record free (unused) pages */
typedef struct {
    list_entry_t free_list;         // the list header
    unsigned int nr_free;           // # of free pages in this free list
} free_area_t;

ucore为了管理内存分配和释放,建立了一个物理内存页管理框架包含一系列操作,定义在kern/mm/pmm.h

// pmm_manager is a physical memory management class. A special pmm manager - XXX_pmm_manager
// only needs to implement the methods in pmm_manager class, then XXX_pmm_manager can be used
// by ucore to manage the total physical memory space.
struct pmm_manager {
    const char *name;                                 // XXX_pmm_manager's name
    void (*init)(void);                               // initialize internal description&management data structure
                                                      // (free block list, number of free block) of XXX_pmm_manager 
    void (*init_memmap)(struct Page *base, size_t n); // setup description&management data structcure according to
                                                      // the initial free physical memory space 
    struct Page *(*alloc_pages)(size_t n);            // allocate >=n pages, depend on the allocation algorithm 
    void (*free_pages)(struct Page *base, size_t n);  // free >=n pages with "base" addr of Page descriptor structures(memlayout.h)
    size_t (*nr_free_pages)(void);                    // return the number of free pages 
    void (*check)(void);                              // check the correctness of XXX_pmm_manager 
};

1.2 first-fit方法的实现

first-fit是通过遍历空闲块链表,将第一个符合要求的块分配出去的算法,包含改变标记位、从链表中删除、处理多余的页(符合要求的块大于所需的大小)
实验1中重点实现init_memmapalloc_pagesfree_pages这三个函数,基于实验代码中部分完成的部分进一步修改如下

/*reuse the demo default_init fun*/
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 = 0;                                  
        SetPageProperty(p);
        p->property = 
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值