首页 > 系统相关 >05_实验五_物理存储器与进程逻辑地址空间管理

05_实验五_物理存储器与进程逻辑地址空间管理

时间:2023-12-07 23:35:55浏览次数:56  
标签:调用 函数 05 存储器 地址 整型 分配 变量 物理

物理存储器与进程逻辑地址空间管理

实验目的

  • 通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。

  • 通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。

预备知识

物理存储器的管理方式

EOS使用分页式存储管理方式,由页框号数据库PFN Database进行管理。其实质是一个数组,长度与页数量一致。定义如下

typedef struct _MMPFN
{
	ULONG Unused : 9;		// 未使用
	ULONG PageState : 3;	// 页状态
	ULONG Next : 20;		// 下一个框号
}MMPFN, *PMMPFN;

物理页目前有三种状态,定义如下

typedef enum _PAGE_STATE {
	ZEROED_PAGE,	// 0 零页,空闲,已0初始化
	FREE_PAGE,		// 1 自由页,空闲,未0初始化
	BUSY_PAGE,		// 2 占用页,被占用
} PAGE_STATE;

ZEROED_PAGEFREE_PAGE的数据库构成链表,分配时只需要移除首部即可

MiAllocateAnyPagesMiAllocateZeroedPages两个函数分别负责优先从空闲分配空间和优先从零页分配空间。

同时还可以为EOS增加零页线程进行零初始化

实验内容

任务(一):练习分配和释放物理页以及在系统进程中分配和释放虚拟页

阅读控制台命令“pm”相关的源代码,并查看其执行的结果

分配物理页和释放物理页

阅读控制台命令“vm”相关的源代码,并查看其执行结果

任务(二):在应用程序进程中分配和释放虚拟页

本练习要求读者首先创建一个 EOS 应用程序,然后编写代码完成下列功能:

  1. 调用 API 函数 VirtualAlloc,分配 一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。

  2. 修改整型变量的值为 0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输出整型变量的值。

  3. 调用 API 函数 Sleep,等待 10 秒钟。

  4. 调用 API 函数 VirtualFree,释放之前分配的整型变量的空间。

  5. 进入死循环,这样应用程序就不会结束。

实验步骤

本实验仔细阅读代码过程未来得及及时记录,详见实验报告

EOSApp代码如下:

#include "EOSApp.h"
int main(int argc, char* argv[])
{
	// 1. 调用API函数`VirtualAlloc`,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
	PINT space = VirtualAlloc(0, sizeof(INT), MEM_RESERVE|MEM_COMMIT);
	// 2. 修改整型变量的值为`0xFFFFFFFF`。在修改前输出整型变量的值,在修改后再输出整型变量的值。
	printf("Before: 0x%X\n", *space);
	*space = 0xFFFFFFFF;
	printf("After: 0x%X", *space);
	// 3. 调用API函数`Sleep`,等待10秒钟。
	Sleep(1000);
	// 4. 调用API函数`VirtualFree`,释放之前分配的整型变量的空间。
	VirtualFree(space, 0, MEM_RELEASE);
	// 5. 进入死循环,这样应用程序就不会结束。
	while(1);
	return 0;
}

思考与练习:

1、如果分配了物理页后,没有回收,会对EOS操作系统造成什么样的影响?目前EOS 操作系统内核函数 MiAllocateAnyPages能处理所有物理页被分配完毕的情况吗?例如在没有可分配的物理页的情况下调用该内核函数,是否会返回失败?

操作系统将不能再使用未回收的物理页,如果分配的物理页没有回收,会造成自由页链表和零链表不断减少甚至为空,此时EOS可能会没有可用的物理页。

目前EOS操作系统内核函数 MiAllocateAnyPages不能处理物理页分配完毕的这种情况,调用该函数会返回失败。

2、尝试从性能的角度分析内核函数MiAllocateAnyPages和MiAllocateZeroedPages。尝试从安全性的角度分析分配零页的必要性。

性能上:调用MiAllocateAnyPages在某些情况下比调用MiAllocateZeroedPages更快速。

安全性上:分配零页更安全。如果一个物理页被操作系统存储过重要的信息后被释放,如果没有清零就分配给用户程序,则用户程序就可能从这个页中获取其重要信息。

3、尝试结合虚拟页的分配和释放说明产生空隙的原因。

产生空隙是由于虚拟页被释放造成的。在启动时会有一个初始化线程,初始化结束后就退出了,线程堆栈所分配的虚拟页也就被释放了。

4、调用MmAllocateVirtualMemory函数分配虚拟页时只使用了MEM_RESERVE标志,没有使用MEM_COMMIT标志,尝试说明这两个标志的区别。

使用MEM_RESERVE标志分配虚拟页时,没有为其映射实际的物理页。用MEM_COMMIT分配虚拟页时,会为其映射实际的物理页。

标签:调用,函数,05,存储器,地址,整型,分配,变量,物理
From: https://www.cnblogs.com/binbinzhidao/p/17884251.html

相关文章

  • 常用软件的官方下载地址
    VS下载VisualStudio2013 Downloads&Keys-VisualStudioSubscriptions一个强大的代码编辑器VisualStudio2015 Downloads&Keys-VisualStudioSubscriptions一个强大的代码编辑器VisualStudio2017 Downloads&Keys-VisualStudioSubscriptions一个强大......
  • 无类别域间路由 、无分类域间路由 (CIDR)IP地址简介
    一、原始的IP地址表示方法及其分类(近几年慢慢淘汰)IP地址是由4字节,32位表示的,为了表示方便,通常用点分十进制表示法,例如大家常见的:192.168.0.52,四个字节,通过点进行分隔,看起来十分清晰。IP地址的32位是由网络号+主机号组成的,也就是说这32位中,左边的某些连续位表示网络号,右边的某些连......
  • 8051微控制器的程序用于控制LED的闪烁
    这段代码是一个基于8051微控制器的程序,用于控制LED的闪烁。程序使用了定时器中断来实现LED的闪烁效果。首先,定义了一个全局变量`TimerTick`来计数中断次数,以及一个标志位`TimeOver`用于在主函数中切换端口引脚的状态。然后,定义了一个名为`timer0`的中断服务例程,该例程在定时器0中......
  • 云课五分钟-05一段代码修改-AI修改C++
    前篇:云课五分钟-04一段代码学习-大模型分析C++在前一节,使用大模型工具文心一言等可以帮助分析代码,加快理解。信息时代→智能时代,系统学习转为碎片学习。发散思维的能力在智能时代尤为重要。 同样我们也可以借助智能化工具修改代码,提出自己的需求。所有的云课五分钟,不仅演示可行案......
  • 【题解】LibreOJ #3051「十二省联考 2019」皮配
    传送门:https://loj.ac/p/3051  首先,对于这样“少部分个体有特殊要求”的题目,我们先考虑,如果没有任何个体有特殊要求怎么做,然后再考虑怎么加上特殊要求;对于这道题,如果$k=0$,即没有学校有不喜欢的导师,那么,设总人数为$al$,城市$i$的人数和为$cit_i$、选择的阵营为$zy_i=0/......
  • P3205 [HNOI2010] 合唱队
    原题链接导入1.对于一个给定的序列,最后一个加进来的元素不是最左端就是最右端,如果是最左端,那么代表去掉最左端的序列中最后一个加进来的元素比最左端小,最右端同理。2.对于一个给定的序列,可能的排序结果无非两类,一类是以最左端的元素结尾的,一类是以最右端的元素结尾的。因此设\(......
  • 在MySql一个数据源的所有数据库中根据数据表注释查询数据表所属数据库以及表名_根据某
    Selecttable_schema'数据库名',table_name表名,TABLE_COMMENT'表注解'fromINFORMATION_SCHEMA.TABLESWhereTABLE_COMMENTLIKE'%环境监测%';selectTABLE_SCHEMA'数据库名',TABLE_NAME'表名',COLUMN_NAME'列名',CO......
  • 67.redis批量写入ip地址脚本
    #要使用Python脚本连接到Redis主机、选择数据库、并执行设置操作,你可以使用redis库。请确保在运行脚本之前安装了该库(可以通过运行pipinstallredis安装)。importredisimportre#Redis连接信息redis_host='hostname'redis_port=6379redis_password='passwd'redi......
  • 全球互联网络穿透:BGP对接助力您的IP地址段无障碍访问
    在当今互联网高速发展的时代,网络覆盖范围不断扩大,但同时也面临着境外网络互联的难题。为了解决这一难题,我们提供了IPTransit服务,以AS4837/AS10099网络平台为基础,通过BGP对接技术,为您的自有IP地址段提供全球互联网络穿透服务。什么是BGP对接?BGP(BorderGatewayProtocol)是一种互......
  • 关于Windows更新失败(0x80070005)
    记录一下近几日关于Windows更新失败的处理(0x80070005)我的台式机配置:系统:Win10专业版(安装有半年多,前几天更新了系统盘,通过diskgenius克隆硬盘后可以正常使用)处理器  英特尔[email protected]四核主板  华硕PRIMEZ270-A内存  48GB(金士顿DDR42400......