LAB2_Part1_Physical Page Management

简介

在本实验中,我们将编写操作系统的内存管理代码。 内存管理有两个组成部分。

第一个部分是内核的物理内存分配器,以致于内核可以分配和释放内存。 分配器将以4096字节为操作单位,称为一个页面。 我们的任务是维护一个数据结构,去记录哪些物理页面是空闲的,哪些是已分配的,以及共享每个已分配页面的进程数。 我们还要编写例程来分配和释放内存页面。

内存管理的第二个组件是虚拟内存,它将内核和用户软件使用的虚拟地址映射到物理内存中的地址。 当指令使用内存时,x86硬件的内存管理单元(MMU)执行映射,查询一组页表。 我们根据任务提供的规范修改JOS以设置MMU的页面表。

lab2包含的新源文件:

  • inc/memlayout.h
  • kern/pmap.c
  • kern/pmap.h
  • kern/kclock.h
  • kern/kclock.c

Part 1: Physical Page Management

物理内存页管理
操作系统必须跟踪物理RAM的哪些部分是空闲的以及哪些是当前正在使用的。 JOS以页为粒度管理PC的物理内存,以便它可以使用MMU映射和保护每个分配的内存。

在编写剩余的虚拟内存实现之前,您需要编写物理页分配器,因为页表管理代码为页表的存储 分配物理内存。

Exercise 1

必须实现kern/pmap.c 中的以下函数

  • boot_alloc()
  • mem_init() (only up to the call to check_page_free_list(1))
  • page_init()
  • page_alloc()
  • page_free()
    check_page_free_list() and check_page_alloc()可以测试你的物理分页器。

发现突然不像LAB1那样有详细的步骤,有点无从下手的感觉。

源码阅读

知识点:

  1. va_list\ va_start等等
    VA函数(variable argument function),参数可变函数。理解这个操作,头脑中需要有栈的概念,参数按序(从右到左)压栈,第一个参数在低地址位置。函数原型为
typedef char* va_list;
// 以4字节为单位对齐
#define _INTSIZEOF(n) (sizeof(n)+sizeof(int)-1)& ~(sizeof(int)-1)
// 求得参数栈的第一个参数地址
#define va_start(ap, v) (ap = (va_list)&v + _INTSIZEOF(v)) 
// 这里很巧妙,ap+SIZE指向下一个参数地址,再返回总体减去size(即又指回了当前变量) 
#define va_arg(ap, t)   (*(t *) ((ap+=_INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)  (ap = (va_list) 0)
步骤 说明
va_list ap 定义一个变差变量ap
va_start(ap, last) 初始化ap,得到可变参数列表的第一个参数的确切地址。实际就是指向参数堆栈的栈顶
va_arg(ap, type) 已知变量类型为type的情况下,获得下一个变参变量
va_end(ap) 结束操作
  1. 感觉还是需要详细理解一下lab1中Part3的虚拟内存部分。
    在对entry_pgdir进行初始化的时候发现一个神奇的写法,暂时不明白,占个坑。
    entry_pgdir的写法也是内存映射的一个重要部分。
__attribute__
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值