操作系统 | Project_内存管理

本文详细介绍了如何修改Minix3.1.2的操作系统,改进brk系统调用,实现当进程数据段+栈段空间不足时,自动分配更大内存并迁移数据。实验涉及环境配置、alloc.c和break.c的修改,以及编译Minix的过程。测试结果显示,新的内存管理机制能够有效处理内存扩展需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的

1、熟悉Minix操作系统的进程管理
2、学习Unix风格的内存管理

二、内容与设计思想

  修改Minix3.1.2a的进程管理器,改进brk系统调用的实现,使得分配给进程的数据段+栈段空间耗尽时,brk系统调用给该进程分配一个更大的内存空间,并将原来空间中的数据 复制至新分配的内存空间,释放原来的内存空间,并通知内核映射新分配的内存段。

三、使用环境

  物理机:Windows10
  虚拟机:Minix3.1.2
  虚拟机软件:Vmware
  终端控制软件:MobaXterm
  物理机与虚拟机文件传输:FileZilla

四、实验过程

  (1)Minix3.1.2实验环境配置

    · 下载Minix3.1.2镜像文件并创建虚拟机
    · 修改虚拟机兼容性,选择5.x版本
    · 启动虚拟机,在setup步骤中,网卡选择AMD LANCE以便获得IP地址。安装完成后,输入shutdown,然后输入boot d0p0重启。
在这里插入图片描述
    · 输入mv /etc/rc.daemons.dist /etc/rc.daemons。在网络模式设置为NAT模式时,重启后可以看到IP地址。
在这里插入图片描述
    · 在虚拟机终端输入packman安装额外的软件包,为了方便,选择全部安装(400MB左右)
在这里插入图片描述

  (2)实现alloc.c函数

    · 修改/usr/src/servers/pm/alloc.c中的alloc_mem函数,把first-fit修改成best-fit,即在分配内存之前,先遍历整个空闲内存块列表,找到最佳匹配的空闲块。
    · 函数实现思路:
   遍历空闲块的链表,best_ptr记录当前最佳适配的空闲块,若找到满足条件且更小的空闲块,那么则对best_ptr进行更新,直至遍历结束。

    hp=hole_head;
    best_ptr=NIL_HOLE;//记录当前找到的最佳适配块
    best_prev_ptr=NIL_HOLE;
    prev_ptr=NIL_HOLE;
    while(hp!=NIL_HOLE && hp->h_base < swap_base){
   
   
        if(hp->h_len >= clicks && best_ptr== NIL_HOLE){
   
   
            best_ptr=hp;
            best_prev_ptr=prev_ptr;
        }
        if(hp->h_len>=clicks && best_ptr!=NIL_HOLE){
   
   
            //如果块大小小于当前的最佳适配块,则更新当前最佳适配块
            if(hp->h_len < best_ptr->h_len){
   
   
                best_ptr=hp;
                best_prev_ptr=prev_ptr;
            }
        }
        prev_ptr= hp ;
        hp=hp->h_next;
    }

  (3)实现break.c函数

    · 修改/usr/src/servers/pm/break.c中的adjust函数,完成函数allocate_new_mem的定义并增加一个allocate_new_mem局部函数在adjust函数中调用。
    break.c函数的作用:do_brk函数计算数据段新的边界,然后调用adjust函数计算程序当前的空闲空间是否足够分配:
    (a)若足够,则调整数据段指针,堆栈指针并通知内核程序的映像发生了变化,返回do_brk函数。
    (b)若不够,则调用allocate_new_mem函数申请新的足够大的内存空间。

 //计算栈底指针=栈顶指针+栈大小
  base_of_stack = (long) mem_sp->mem_vir + (long) mem_sp->mem_len;
  //byte与click单位转换,得到新的栈顶指针
  sp_click = sp >> CLICK_SHIFT; 
  if (sp_click >= base_of_stack) return(ENOMEM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值