【MIT-OS6.S081作业5.1】Lab5-lazy page allocation-Eliminate allocation from sbrk()

本文记录MIT-OS6.S081 Lab5 lazy page allocation 的Eliminate allocation from sbrk()函数的实现过程

文章目录

  • [1. 作业要求](#1. 作业要求)
    • [Eliminate allocation from sbrk() (easy)](#Eliminate allocation from sbrk() (easy))
  • [2. 实现过程](#2. 实现过程)
    • [2.1 代码实现](#2.1 代码实现)

1. 作业要求

Eliminate allocation from sbrk() (easy)

Your first task is to delete page allocation from the sbrk(n) system call implementation, which is the function sys_sbrk() in sysproc.c. The sbrk(n) system call grows the process's memory size by n bytes, and then returns the start of the newly allocated region (i.e., the old size). Your new sbrk(n) should just increment the process's size (myproc()->sz) by n and return the old size. It should not allocate memory -- so you should delete the call to growproc() (but you still need to increase the process's size!).

Try to guess what the result of this modification will be: what will break?

Make this modification, boot xv6, and type echo hi to the shell. You should see something like this:

c 复制代码
init: starting sh
$ echo hi
usertrap(): unexpected scause 0x000000000000000f pid=3
            sepc=0x0000000000001258 stval=0x0000000000004008
va=0x0000000000004000 pte=0x0000000000000000
panic: uvmunmap: not mapped
  • The "usertrap(): ..." message is from the user trap handler in trap.c; it has caught an exception that it does not know how to handle. Make sure you understand why this page fault occurs. The "stval=0x0...04008" indicates that the virtual address that caused the page fault is 0x4008.

2. 实现过程

2.1 代码实现

Your new sbrk(n) should just increment the process's size (myproc()->sz) by n and return the old size. It should not allocate memory -- so you should delete the call to growproc() (but you still need to increase the process's size!).

这个提示的意思是只增加进程的sz,返回旧的size,但是不分配内存。

我们看一下原来的sys_sbrk函数,调用了growproc函数来对内存进行重新分配,返回旧的大小。

c 复制代码
uint64
sys_sbrk(void)
{
  int addr;
  int n;

  if(argint(0, &n) < 0)
    return -1;
  addr = myproc()->sz;
  if(growproc(n) < 0)
    return -1;
  return addr;
}

进入growproc:

c 复制代码
int
growproc(int n)
{
  uint sz;
  struct proc *p = myproc();

  sz = p->sz;
  if(n > 0){
    if((sz = uvmalloc(p->pagetable, sz, sz + n)) == 0) {
      return -1;
    }
  } else if(n < 0){
    sz = uvmdealloc(p->pagetable, sz, sz + n);
  }
  p->sz = sz;
  return 0;
}

uvmalloc底层会调用kalloc函数来分配内存。仿照growproc的思路我们重写一下sys_sbrk:

c 复制代码
uint64
sys_sbrk(void)
{
  uint64 oldSize;
  int n;

  if(argint(0, &n) < 0)
    return -1;
  struct proc *p = myproc();
  oldSize = p->sz;
  if(n > 0){
    p->sz += n;
  } else if(n < 0){
    p->sz = uvmdealloc(p->pagetable, p->sz, p->sz + n);
  }
  return oldSize;
}

编译通过,测试echo hi,如题打印:

完活!还有bug下一节继续讲怎么实现Lazy allocation。

相关推荐
PMAOS1 天前
4G 功能机操作系统选型指南:KaiOS、Mocor、MAUI、PMAOS 的能力边界与验证方法
嵌入式硬件·ai·操作系统
罗四强1 天前
第10篇:打包上架:签名、打包 HAP、发布到华为应用市场
分布式·操作系统·harmonyos·arkts·鸿蒙系统
Liaiyang663 天前
空圈容错视角-HarmonyOS 7 架构体检:从被动容错到主动免疫的真伪验证与生态反推
操作系统·harmonyos·架构设计·ai-agent·端云协同·鸿蒙7·空圈容错
OpenAnolis小助手3 天前
龙蜥社区亮相 GOSIM AI Vision Forum 共话“Agentic Native”开源新
人工智能·ai·开源·操作系统·龙蜥社区·agent
阿里云基础软件3 天前
Agent 任务提速 10.71%,内存占用降低 21.60%|Alibaba Cloud Linux 4 重大发布
java·linux·人工智能·操作系统·agent
OpenAnolis小助手4 天前
多租户公有云共享 CXL 内存池场景下的内存卸载研究
人工智能·操作系统·龙蜥社区·risc-v·agentic os
OpenAnolis小助手7 天前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
硅基手札7 天前
操作系统设计思想系列 13 · NuttX 深度 — POSIX 飞控底座 + RTOS 群像
架构·操作系统·嵌入式开发·ecos·sel4·nuttx
2CM_Embed8 天前
μC/OS-II 任务管理详解(三):任务创建、任务栈、删除、优先级修改与挂起恢复
操作系统
硅基手札8 天前
操作系统设计思想系列 11 · ThreadX 深度 — 预抢占阈值·认证型设计
操作系统·开源项目·嵌入式开发·嵌入式操作系统·设计思想·threadx