xv6实验2-内存管理单元(实验)

这篇博客详细介绍了xv6实验中关于内存管理的几个练习,包括物理内存分配、页表管理、GDB和QEMU的使用。内容涵盖了检查内存分配、理解80386手册中的页转换、使用QEMU命令查看物理内存、检查页表管理函数、映射和解除映射虚拟地址等。此外,还讨论了如何保护内核内存以及操作系统支持的最大物理内存和管理内存的开销。
摘要由CSDN通过智能技术生成

Exercise 1

Exercise 1. In the file kern/pmap.c, you must implement code for the following functions (probably in the order given).

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() test your physical page allocator. You should boot JOS and see whether check_page_alloc() reports success. Fix your code so that it passes. You may find it helpful to add your own assert()s to verify that your assumptions are correct.

练习1主要是为了熟悉内存分配的操作,页面初始化,页面内存分配以及页面内存释放等

boot_alloc主要是启动分配内存,目的是如果n大于0的话,就分配一个新的内存,否则就是返回下一个内存给它,可以看到代码里面的注释ROUNDUP就是向上取n的倍数,所以boot_alloc里面要填充的代码就很简单了。为了方便调试,可以把日志打印出来

cprintf("boot_alloc memory at %x\n", nextfree);
cprintf("Next memory at %x\n", ROUNDUP((char *) (nextfree+n), PGSIZE));
if (n != 0) {
   
    char *next = nextfree;
    nextfree = ROUNDUP((char *) (nextfree + n), PGSIZE);
    return next;
} else {
   
    return nextfree;
}

使用make qemu-nox可以看到输出

boot_alloc memory at f0114000
Next memory at f0115000

mem_init中可以看到调用过boot_allocboot_alloc(PGSIZE),PGSIZE是4096,是相吻合的。但是boot_alloc最开始的地址是f0114000就不是很清楚了

mem_init是初始化内存,其中有一个要求是需要初始化pages变量,这个变量是保存struct PageInfo的结构体的,只需要开辟一块内存空间即可。所以还是使用boot_alloc函数用来分配,就很简单了

pages = (struct PageInfo*)boot_alloc(sizeof(struct PageInfo) * npages);
memset(pages, 0, npages * sizeof(struct PageInfo));

需要注意的是需要给结构体分配n个页面的大小,即sizeof(struct PageInfo) * npages,注意sizeof的使用

page_init就比较复杂了,不过根据注释来,也可以实现

void
page_init(void)
{
   
    size_t i;
	// 1 Mark physical page 0 as in use
	pages[0].pp_ref = 1;
	// 2. [PGSIZE, npages_basemem * PGSIZE] is free
	for(i = 1; i < npages_basemem; i++) {
   
		pages[i].pp_ref = 0<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值