ucore 操作系统os first-fit 算法实现

从零实现物理内存管理器:剖析ucore Lab 2中的First-Fit算法与页表映射 本文深入解析ucore Lab 2中物理内存管理器的实现,重点探讨First-Fit算法与页表映射机制。通过详细代码分析展示如何设计高效的内存分配策略,解决碎片化问题,并建立精确的地址转换系统。文章结合实践案例,为操作系统开发者提供内存管理的核心实现方法与优化技巧。 阅读详情
#define free_list (free_area.free_list)
#define nr_free (free_area.nr_free)

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 = p->property = 0;//头标志位、块数清零
        set_page_ref(p, 0);
    }
    base->property = n;//创建一块大空闲内存
    SetPageProperty(base);
    nr_free += n;//设置空闲内存内的块数
    list_add(&free_list, &(base->page_link));//内存块插入空闲分配链表
}

static struct Page *
default_alloc_pages(size_t n) {//内存分配函数
    assert(n > 0);
    if (n > nr_free) {
        return NULL;
    }
    struct Page *page = NULL;
    list_entry_t *le = &free_list;
    while ((le = list_next(le)) != &free_list) {//根据first-fit算法特点进行首次适应块分配
        struct Page *p = le2page(le, page_link);
        if (p->property >= n) {
            page = p;
            break;
        }
    }
    if (page != NULL) {//对找到的可以块进行相应处理
        list_del(&(page->page_link));//从空闲内存链上摘除
        if (page->property > n) {//将分配块富余的部分切下来重新挂到空闲链上
            struct Page *p = page + n;//新块的首块地址
            p->property = page->property - n;//新块的大小
            SetPageProperty(p);
            list_add(page->page_link.prev, &(p->page_link));//挂载新块
        }
        nr_free -= n;
        ClearPageProperty(page);
    }
    return page;
}

static void
default_free_pages(struct Page *base, size_t n) {//内存块释放以及前后合并
    assert(n > 0);
    struct Page *p = base;
    for (; p != base + n; p ++) {//块数据初始化
        assert(!PageReserved(p) && !PageProperty(p));
        p->flags = 0;
        set_page_ref(p, 0);
    }
    base->property = n;
    SetPageProperty(base);
    list_entry_t *le = list_next(&free_list);
    list_add(&(free_list),&(base->page_link));//块插到空闲链头结点下面
    while (le != &free_list) {//对链表位置进一步调整
        p = le2page(le, page_link);
        le = list_next(le);
        if(p + p->property <= base){//空闲块前面存在其他空闲块
            list_del(&(base->page_link));//原来位置删掉
            if(p + p->property == base){//空闲块和前面的空闲块相邻->合并操作
                p->property += n;
                ClearPageProperty(base);
                base = p;
            }
            else{
                list_add(&(p->page_link),&(base->page_link));//不相邻直接插在后面
            }
        }
        else{
            if(base + base->property == p){//和下面的相邻直接合并退出
                base->property += p->property;
                list_del(&(p->page_link));
                ClearPageProperty(p);
            }
            break;
        }
    }
    nr_free += n;
}

static size_t
default_nr_free_pages(void) {
    return nr_free;
}

测试结果

操作系统 ucore lab2 操作系统 ucore lab2 物理内存管理 实验目的 理解基于段页式内存地址的转换机制 理解页表的建立和使用方法 理解物理内存的管理方法 实验步骤 练习0:填写已有实验 利用meld比较lab1和lab2两个文件夹,发现 发现kdebug.c和trap.c有差异,点入进行修改,标识明显,简单方便。 kdebug.c: trap.c: 练习1:实现 first-fit 连续物理内存分... 阅读详情

相关推荐

操作系统实验二实验报告

学堂在线-清华操作系统课程-实验二实验报告

jasonyuchen的博客 7718

图解First-Fit内存分配算法:用ucore Lab 2的代码带你理解物理页管理

本文深入解析First-Fit内存分配算法,通过ucore Lab 2的代码实践,详细讲解物理页管理的核心机制。从算法原理到具体实现,包括关键数据结构、分配与释放逻辑,以及性能优化方向,帮助读者全面理解操作系统中的物理内存管理技术。

weixin_30613343的博客 305

内存分配算法,包括first-fit,best-fit等

很详细,很复杂。不过貌似有点小问题,大家可以研究下!

OS 最先适应算法、最优适应算法、最坏适应算法的解释

主要介绍最先适应算法、下次适应算法、最优适应算法、最坏适应算法的定义和特点,无代码实现。

MoMing丶的博客 4万+

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4004

CrackerXI+脱壳实战:解决iOS应用逆向中的加密文件问题

本文详细介绍了如何使用CrackerXI+工具对iOS应用进行脱壳,解决App Store应用因FairPlay DRM加密而无法进行静态分析的难题。通过图形化界面一键操作,CrackerXI+能高效获取解密后的可执行文件,为逆向工程奠定基础。文章涵盖工具选型、实战步骤及常见问题排查,是iOS逆向入门与进阶的实用指南。

seed的博客 257

C语言模拟操作系统内存分配——首次适应算法(First Fit)

算法思想:将内存块中的所有的块按照地址递增的顺序连接成一个链表,每次要将新的作业放入内存的时候就按顺序查找内存块链表,每次都是用找到的可以用的第一个内存块。链表数据结构:链表结点共有4个区域和一个下指针构成,四个区域分别记录该内存块的起始地址,该内存块长度,内存块的状态和内存块存放的作业编号(没有作业时存放的是0)。模拟实现的策略:1.插入操作时依照地址递增的顺序检查可以装入的第一个内存块若找到,...

haohulala的博客 1万+

LSTM预测股票数据---数据预处理

# 导入相应的模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 获取训练集 def get_train_data(data,batch_size = 60 ,time_step = 20,train_begin = 0,train_end = 58...

qq_35358021的博客 3359

《ucore lab2》实验报告

资源 ucore在线实验指导书 我的ucore实验代码 练习1:实现 first-fit 连续物理内存分配算法 题目 在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提示: 在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。可能会修改default_pmm.c中的default_init,default_init_me...

1149

BMP390L数字大气压传感器原理图设计,已量产(压力传感器)

在工业设备的室内定位、地下设施监测这类 GPS 信号盲区场景里,气压高度检测的 “靠谱程度” 直接决定了系统的可用性 —— 毕竟谁也不想在地下停车场导航时,设备把 1 楼误判成 3 楼。最近在项目里基于博世 BMP390L 做了硬件电路设计,正好聊聊这款工业级数字气压传感器的硬实力,以及原理图里的那些关键设计细节。

不脱发的程序猿 350

渗透测试之哥斯拉实战

可以直接在这里使用meterpreter命令进行对服务端的控制。选择目标 - 添加,配置连接信息,之后测试连接成功!php的shell功能如图。先要进行数据库的配置信息。可以直接在这里打包全站。

大河之犬的博客 2488

操作系统实验—ucore Lab2

ucore Lab2 一、内容 本次实验包含三个部分。首先了解如何发现系统中的物理内存;然后了解如何建立对物理内 存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实 现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。 二、目的 1、理解基于段页式内存地址的转换机制 2、理解页表的建立和使用方法 3、理解物理内存的管理方法 三、实验思...

人间世 1659

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

OS课程 ucore_lab2实验报告

练习零:填写已有实验    本实验依赖实验1。请把你做的实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。提示:可采用diff和patch工具进行半自动的合并(merge),也可用一些图形化的比较/merge工具来手动合并,比如meld,eclipse中的diff/merge工具,understand中的diff/merge工具等。 其实 lab1 中只有 kern/debug/k...

qq_40872103的博客 735

数据挖掘实战-基于情感分析+网络语义分析+LDA主题分析对大唐不夜城用户评论进行文本分析

本研究基于去哪儿网和携程网的1888条大唐不夜城游客评论数据,运用Python进行文本分析。通过情感分析发现游客评价以积极为主(占比约70%),中性占20%,消极占10%。采用ROSTCM6软件进行社会网络语义分析,识别不同情绪下的高频词汇。使用LDA主题模型将评论划分为3个主题(夜景、表演、美食),并分析主题强度随时间变化趋势。实验包含数据采集、预处理、情感分析、语义网络分析和LDA建模等完整流程,为景区管理优化提供数据支持。源代码涵盖爬虫、数据处理和可视化分析的全套实现。

m0_64336780的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ucore Lab2 实验笔记

ucore Lab2 lab 2 直接执行make qemu-nox会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertion failed: (p0 = alloc_page()) == p2 - 1 1 连续物理内存管理 1.1 page 概览 对物理内存的管理,为了节省空间,也是为了配合接下来的虚拟...

dczqjzdf24384的博客 468

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ucore_lab2_物理内存管理

文章目录练习0:填写已有实验练习1:实现 first-fit 连续物理内存分配算法**算法介绍**算法实现练习二:实现寻找虚拟地址对应的页表项实现细节回答问题练习三:释放某虚地址所在的页并取消对应二级页表项的映射实现细节回答问题 练习0:填写已有实验 本处采用meld工具进行比较,使用方法: ①打开meld工具 ②选择需要比对的文件/文件夹 ③点击compare开始进行比较,不同的文件用星星标出 练习1:实现 first-fit 连续物理内存分配算法 算法介绍 该算法从空闲分区链首开始查找,直至找到一个能满

weixin_44959058的博客 527

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ucore物理内存管理

物理内存管理 (1)编译运行 uCore Lab2的工程代码 (2)完成uCore Lab2 练习 1-3的编程作业 思考如何实现Core Lab2扩展练习1-2 提交uCore Lab2实验报告的具体要求,包括必要的运行截图 实验目的: 理解基于段页式内存地址的转换机制 理解页表的建立和使用方法 理解物理内存的管理方法 实验内容: 了解如何发现系统中的物理内存 了解如何建立对物理内存的初步管理,即了解连续物理内存管理 了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式

m0_50488845的博客 1037

ucore lab2_report

Lab 2 Report 实验目的 理解基于段页式内存地址的转换机制 理解页表的建立和使用方法 理解物理内存的管理方法 实验内容 本次实验包含三个部分。首先了解如何发现系统中的物理内存;然后了解如何建立对物理内存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。本实验里面实现的内存管理还是非常...

Shine__Wong的博客 631

在Ubuntu 20.04上一步步搞定ucore Lab 2:物理内存管理实验避坑指南

本文详细介绍了在Ubuntu 20.04上完成ucore Lab 2物理内存管理实验的完整指南,包括环境配置、代码结构解析、First-Fit算法实现、页表项操作等关键步骤。通过实战案例和常见问题解决方案,帮助开发者高效完成操作系统内核开发中的物理内存管理实验,避免常见陷阱。

weixin_30613343的博客 361

ucore操作系统总结

lab1 BootLoader启动ucoreos 1、系统从一上电到加载完成的执行过程 2、中断机制 3、函数调用堆栈过程 lab2 物理内存管理 1、物理内存页分配算法first-fit(接下来要关注伙伴系统实现解决内存碎片问题) 2、二级页表映射的建立 lab3 虚拟内存管理 1、Page Fault页访问异常处理 2、页面置换机制 lab4 内核线程管理 1、第0个和第1个内核线程的创建 2、调度并执行第1个内核线程 lab5 用户进程管理 1、进程创建与执行 2、系统调用的实现 lab6 调度器 1

a284185006的博客 1041

深入 uCore 内存管理:First-Fit 算法实现与伙伴系统/SLUB 扩展挑战全解析

本文将带领已完成uCore Lab 2基础练习的读者,深入First-Fit算法的实现细节,并挑战实现更高级的伙伴系统(Buddy System)和SLUB分配器。First-Fit作为最简单的连续内存分配算法,其核心思想是维护一个按地址排序的空闲块链表,分配时从链表头部开始查找第一个足够大的空闲块。SLUB作为Linux默认的 slab分配器实现,其核心思想是通过对象缓存提高小内存分配效率。提示:在实现First-Fit时,特别要注意边界条件的处理,如分配最后一页或释放首尾页的情况。

weixin_32006655的博客 304

ucore lab2

练习1:实现 first-fit 连续物理内存分配算法(需要编程) 物理页面的结构体如下: /* * * 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 addr

void 355

从零到一:手把手教你实现 uCore Lab 2 物理内存管理(附避坑指南)

本文详细介绍了如何从零开始实现uCore Lab 2的物理内存管理功能,包括First-Fit算法的完整实现和页表映射机制。通过问题驱动和代码实战的方式,帮助开发者深入理解操作系统内存管理的核心概念,并提供环境搭建、算法实现、调试技巧等实用指南。

weixin_31742871的博客 274

在Ubuntu 20.04上从零搭建ucore Lab 2物理内存管理环境(附完整编译运行流程)

本文详细介绍了在Ubuntu 20.04系统上从零搭建ucore Lab 2物理内存管理实验环境的完整流程,包括环境准备、代码获取、编译运行及调试技巧。通过本指南,操作系统初学者可以深入理解物理内存管理机制,并顺利完成实验报告。

weixin_32667955的博客 235
上一篇: E. DFS Trees
下一篇: ucore 内核线程创建
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值