当前位置: 首页 > news >正文

OS_lab——分页机制与内存管理

认真阅读章节资料,掌握什么是分页机制

调试代码,掌握分页机制基本方法与思路

  • 代码pmtest6.asm中,212行~237行,设置断点调试这几个循环,分析究竟在这里做了什么

掌握PDE,PTE的计算方法

  • 动手画一画这个映射图
  • 为什么代码3.22里面,PDE初始化添加了一个PageTblBase(Line 212),而PTE初始化时候没有类似的基地址呢(Line224)?

熟悉如何获取当前系统内存布局的方法

掌握内存地址映射关系的切换

  • 画出流程图

基础题:依据实验的代码,

  • 自定义一个函数,给定一个虚拟地址,能够返回该地址从虚拟地址到物理地址的计算过程,如果该地址不存在,则返回一个错误提示。
  • 完善分页管理功能,补充alloc_pages, free_pages两个函数功能,试试你能一次分配的最大空间有多大,如果超出了有什么办法解决呢?

进阶题(选做)

  • 设计一个内存管理器,选择其一实现:首次适应算法、最佳适应算法、伙伴算法,要求实现内存的分配与回收。(提示,均按照页为最小单位进行分配、对于空闲空间管理可采用位图法或者双向链表法管理)


什么是分页机制

分页机制就是通过页目录和页表将物理地址与线性地址进行映射

页就是指一块内存,一般来说大小在4 KB。

分页机制使进程运行在线性地址上,不必关注物理地址的情况,提供了虚拟内存和隔离机制,是内存的调度完全由操作系统负责。

分页机制实现的基本方法

分页机制使用二级页表实现

第一级叫页目录:大小4 KB,共1024表项(PDE),表项对应一个二级页表

第二级页表:1024个表项(PTE),每个表项对应一个物理页

线性地址转换时,

  • 寄存器cr3指定页目录
  • 线性地址高十位为页目录索引
  • 线性地址第二个十位为二级页表索引

注:PDE,PTE,cr3寄存器都由高二十位进行寻址,这是因为页表地址都是4 KB对齐的。

分页机制的标志

cr0寄存器 的 最高位 PG位,PG位为1表示分页机制生效

调试 pmtest6.asm

212行----237行

分析:

.1 部分是在初始化目录页,大小为4096,将目录页首地址存在目录页的第一个表项中

.2部分实在初始化其他页表,一共1024个页表,需要1024 x 1024。

.3预备阶段将目录页基地址赋给cr3,将cr0的PG位置1,启动分页机制。

magic break断点调试

PDE和PTE的计算方法

映射图

为什么PDE添加了基地址,PTE不添加基地址

???不清楚,可能PDE是指向页表的映射,而页目录本身也是一个页表。PTE是指向物理页的映射,所以不存自己页表的地址。

也可能cr3不存页目录基地址,只能页目录自己来存,而PTE所在页表的基地址在页目录中存放,不需要自己额外存。

如何获取当前系统内存布局

使用中断15 h

参数:

eax:获取内存信息,ax赋值0E820h

ebx:放置着“后续值continuation value”第一次调用时ebx必须为0。

es : di :指向一个地址范围描述符结构ARDS (Address Range Descriptor Structure), BIOS将会填充此结构。

ecx : es : di所指向的地址范围描述符结构的大小以字节为单位。无论es: di所指向的结构如何设置BIOS最多将会填充ecx个字节。不过通常情况下无论ecx为多大BIOS只填充20字节有些BIOS忽略ecx的值总是填充20字节。

edx :0534D4150h('SMAP')──BIOS将会使用此标志对调用者将要请求的系统映像信息进行校验这些信息会被BIOS放置到es :di所指向的结构中。

结果:

CF :CF = 0表示没有错误

eax :0534D4150h('SMAP')

es: di :返回的地址范围描述符结构指针,与输入值相同

ecx :BIOS填充在地址范围描述符中的字节数量,一般是20字节

ebx : 下次迭代时原封不动放入ebx,就可以通过它获取下一个地址范围描述符,如果ebx值为0,且CF没有进位,表示是最后一个地址描述符

地址描述符结构(ARDS)20个字节

注:调用int 15 h时返回的地址描述符需要存放在一个缓冲区中,我们要事先定义一个缓冲区

pmtest7.asm分析

定义256字节的缓冲区,es: di指向缓冲区

CF被置位或ebx为0,循环结束。

di每次增20字节,存一个描述符

内存地址映射关系的切换

6.1 线性地址到物理地址

代码如下:

; 显示地址计算过程并进行检查 -----------------------------------------
AddressCheck:mov ax, SelectorFlatRWmov ss, axmov eax, LinearAddrDemoshr eax, 22mov ecx, eaxshl ecx, 2add ecx, PageDirBase1mov eax, ss:[ecx]mov ebx, eaxpush ecxcall DispIntpop ecxshr ebx, 12shl ebx, 12push ebxcall DispIntpop ebxmov eax, LinearAddrDemoshl eax, 10shr eax, 22mov ecx, eaxshl ecx, 2add ebx, ecxmov eax, ss:[ebx]shr eax, 12shl eax, 12push eaxcall DispIntpush ProcBarcall DispIntret

效果展示:

6.2 分页管理功能完善

alloc_pages的实现

alloc_pages用于连续物理内存的分配: struct page *alloc_pages(gft_t gfp, unsigned int order) alloc_pages函数用于分配2^order个 连续 的物理页。分配失败返回NULL。

free_pages的实现

void free_pages(unsigned long addr, unsigned int order) 功能:释放逻辑地址addr开始的页面2^order次方个
addr: 页面开始的逻辑地址
order: 释放页面的个数2^order个

实验结果总结

  1. 分页和分段有何区别?在本次实验中,段页机制是怎么搭配工作 的?
  2. PDE、PTE是什么?例程中如何进行初始化?CPU是怎样访问 到PDE、PTE,从而计算出物理地址的?
  3. 开启分页机制之后,在GDT表中、在PDE、PTE中存的地址是物理地址、线性地址,还是逻辑地址,为什么?
  4. 为什么PageTblBase初始值为2M+4K?能不能比这个值小?
  5. 怎么读取本机的实际物理内存信息?
  6. 如何进行地址映射与切换?
  7. 如何实现alloc_pages, free_pages

1.分页和分段有何区别?在本次实验中,段页机制是怎么搭配工作的?

区别在于:1、从功能上看,页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外碎片,提高内存的利用率,即满足系统管理的需要,而不是用户的需要;而段是信息的逻辑单位,它含有一组其意义相对完整的信息,目的是为了能更好地满足用户的需要。2、页的大小固定且由系统确定,而段的长度却不固定,决定于用户所编写的程序。3、分页的作业地址空间是一维的,而分段的作业地址空间是二维的。

在本次实验中,未打开分页机制时,线性地址等同于物理地址,即逻辑地址通过分段机制直接转化为物理地址(由SEG找到对应Descriptor定义的段+OFFSET);启动了分页机制后,要先通过分段机制将逻辑地址转化为线性地址,在通过分页机制将线性地址转化为物理地址。首先,将页目录的段首地址设置为PageDirBase,再将页表的段首地址设置为PageTblBase,在页目录中每个表项都指向一个页表,而每个页表的表项都指向一个物理地址,从而实现了从线性地址到物理地址的映射以及离散分配。

2. PDE、PTE,是什么?例程中如何进行初始化?CPU是怎样访问到PDE、PTE,从而计算出物理地址的?

PDE(Page Directory Entry)是页目录表的表项,PTE(Page Table Entry)是页表的表项。例程中初始化的方式是通过循环将每一个PDE初始化成存在的可读可写可执行的用户级别页表,其中第一个PDE对应的页表首地址是PageDirBase。类似的,页表中每个PTE都被初始化为可读可写可执行的用户级别页表,其中第一个页表的首地址是PageTblBase。CPU首先根据分段机制,找到描述符所对应的段并加上偏移得到线性地址,得到线性地址之后,CPU会借助cr3在指定的目录页中根据线性地址的高十位得到页表地址,然后再根据线性地址的第二十一位到第十二位在页表中得到物理页首地址,最后加上第十二位偏移,从而计算出物理地址。

3. 开启分页机制之后,在GDT表中、在PDE、PTE中存的地址是物理地址、线性地址,还是逻辑地址,为什么?

在查询GDT表后得到线性地址,首先通过选择子确定对应描述符是GDT表中的第几项,然后取出段首地址加上逻辑地址的偏移,最终得到线性地址。PDE和PTE存放的都是物理地址,分别指向页表和真实地址。

4. 为什么PageTblBase初始值为2M+4K?能不能比这个值小?

因为设置页目录表起始位置为2M,而页目录表占4K,且页目录表与页表在内存中相邻,所以是2M+4K。在保证寻址大小为4G不变的情况下减小初始值,可以选择前移页目录表的起始位置。

5. 怎么读取本机的实际物理内存信息

利用中断15h,后循环读取ARDS结构。先填充如下寄存器:eax int 15h可完成许多工作,主要由ax的值决定,要获取内存信息,需要将ax赋值为0E820h,ebx寄存器放置着后续值,第一次调用时ebx必须为0。es: di 指向一个地址范围描述符结构ARDS,而BIOS将会填充此结构。ecx,es:di所指向的地址范围描述符结构的大小,以字节为单位。无论es:di所指向的结构如何设置,BIOS最多将会填充ecx个字节。edx 0534D4150h('SMAP')──BIOS将会使用此标志,对调用者将要请求的系统映像信息进行校验,这些信息会被 BIOS放置到es:di所指向的结构中。

中断调用之后,结果存放于下列寄存器之中。CF CF=0表示没有错误,否则存在错误。eax 0534D4150h('SMAP')。es: di 返回的地址范围描述符结构指针,和输入值相同。ecx BIOS填充在地址范围描述符中的字节数量,被BIOS所返回的最小值是20字节。ebx 这里放置着为等到下一个地址描述符所需要的后续值,如果 它的值为0,并且CF没有进位,表示它是最后一个地址范围描述符。

6. 如何进行地址映射与切换

通过改变cr3来转换地址映射。改变cr3从而切换页目录表,从而切换页表,从而使得同一个线性地址映射到不同的物理地址。

7. 如何实现alloc_pages,free_pages

alloc_pages的实现

alloc_pages用于连续物理内存的分配: struct page *alloc_pages(gft_t gfp, unsigned int order) alloc_pages函数用于分配2^order个 连续 的物理页。分配失败返回NULL。

free_pages的实现

void free_pages(unsigned long addr, unsigned int order) 功能:释放逻辑地址addr开始的页面2^order次方个
addr: 页面开始的逻辑地址
order: 释放页面的个数2^order个

相关文章:

OS_lab——分页机制与内存管理

认真阅读章节资料,掌握什么是分页机制 调试代码,掌握分页机制基本方法与思路 代码pmtest6.asm中,212行~237行,设置断点调试这几个循环,分析究竟在这里做了什么 掌握PDE,PTE的计算方法 动手画一画这个映…...

【面试】Redis基础知识

题目 为什么Redis是单线程却性能很高? Redis是一个高性能的基于内存的键值存储系统。它之所以能够达到高性能,主要有以下几个原因: 基于内存:Redis将数据存储在内存中,而不是硬盘上,这使得数据的读写速度…...

CentOS 9 (stream) 安装 Docker

1. Docker 简介 Docker 是一个开源的容器化平台,可帮助开发者轻松地创建、部署和运行应用程序。Docker 使开发人员能够在一个独立的容器中打包应用程序及其依赖项,这样他们就可以轻松地将应用程序移植到任何其他环境中。 Docker 主要由以下几个组件组成…...

vite中配置服务代理

前言 在vite中配置服务代理和webpack中大差不差,不过有些写法会有些不同 具体配置:配置 Vite {#configuring-vite} | Vite中文网 这里我写了一个demo,如下所示 开启node服务 我用express启动了一个服务,分别暴露两个接口 进行相关配置 在vite.config.ts文件中进行配置 e…...

kotlin 中 any, all , none

any 如果至少有一个元素匹配给定谓词,那么 any() 返回 true。 all 如果没有元素与给定谓词匹配,那么 none() 返回 true。 none 如果所有元素都匹配给定谓词,那么 all() 返回 true。 请注意,在一个空集合上使用任何有效的谓词去…...

如何使用 Python、Node.js 和 Go 创建基于 YOLOv8 的对象检测 Web 服务

1. 介绍 这是有关 YOLOv8 系列文章的第二篇。在上一篇文章中我们介绍了YOLOv8以及如何使用它,然后展示了如何使用 Python 和基于 PyTorch 的官方 YOLOv8 库创建一个 Web 服务来检测图像上的对象。 在本文中,将展示如何在不需要PyTorch和官方API的情况下…...

pod节点jar包替换流程

1、查找到该docker容器 docker ps | grep backend # ./entrypoint.sh文件启动的那个容器2、替换jar 包 mv xxx.jar app.jar docker cp app.jar 66bc6fea9fb5:/home/aimind/3、重启容器 docker restart 66bc6fea9fb5 4、重启容器后进行功能验证 功能验证没问题了,再…...

Pytorch:torch.nn.Module

torch.nn.Module 是 PyTorch 中神经网络模型的基类,它提供了模型定义、参数管理和其他相关功能。 以下是关于 torch.nn.Module 的详细说明: 1. torch.nn.Module 的定义: torch.nn.Module 是 PyTorch 中所有神经网络模型的基类,…...

传统图像处理学习笔记更新中

文章目录 传统图像处理颜色空间高斯滤波腐蚀和膨胀开运算和闭运算如何求一张图片的均值?线性插值双线性插值仿射变换透视变换常见的边缘检测算子Sobel 算法Canny 算法Hough 变换原理(直线和圆检测)找轮廓(findCountours)单应性(homography)原理...

Hyperledger Fabric Java App Demo

编写一个应用程序来连接到 fabrc 网络中,通过调用智能合约来访问账本. fabric gateway fabric gateway 有两个项目,一个是 fabric-gateway-java , 一个是 fabric-gateway。 fabric-gateway-java 是比较早的项目,使用起来较为麻烦需要提供一…...

Doris 在工商信息商业查询平台的湖仓一体建设实践(02)

信息服务行业可以提供多样化、便捷、高效、安全的信息化服务,为个人及商业决策提供了重要支撑与参考。本文以某工商信息商业查询平台为例,介绍其从传统 Lambda 架构到基于 Doris Multi-Catalog 的湖仓一体架构演进历程。同时通过一系列实践,展示了如何保证数据的准确性和实时…...

218.【2023年华为OD机试真题(C卷)】攀登者2(动态规划-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-攀登者2二.解题思路三.题解代码Python题解代码…...

【精通C语言】:分支结构switch语句的灵活运用

🎥 屿小夏 : 个人主页 🔥个人专栏 : C语言详解 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、switch语句1.1 语法1.2 代码示例 二、switch的控制语句2.1 break2.2 defualt子句 三、…...

数据结构和算法-数据结构的基本概念和三要素和数据类型和抽象数据类型

文章目录 总览数据结构的基本概念总览数据早期和现代的计算机处理的数据数据元素-描述一个个体数据对象-一类数据元素什么是数据结构小结 数据结构的三要素总览逻辑结构-集合结构逻辑结构-线性结构逻辑结构-树形结构逻辑结构-图形结构逻辑结构-小结数据的运算物理结构&#xff…...

LeetCode 2353. 设计食物评分系统【设计,哈希表,有序集合;堆+懒删除】1781

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

Redis (三)

1、redis复制 简单的概括就是主从复制,master以写为主,Slave以读为主,当master数据发生变化的时候,自动将更新的数据异步同步到其他的slave是数据库。 使用这种机制的话,可以做到读写分离,可以减轻主机负担…...

CompletableFuture超详解与实践

0.背景 一个接口可能需要调用 N 个其他服务的接口,这在项目开发中还是挺常见的。举个例子:用户请求获取订单信息,可能需要调用用户信息、商品详情、物流信息、商品推荐等接口,最后再汇总数据统一返回。 如果是串行(按…...

Maven之私服

1 介绍 团队开发现状分析私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题Nexus Sonatype公司的一款maven私服产品 下载地址:https://help.sonatype.com/repomanager3/download win版安装包:https://pan.baidu.com/s/1wk…...

#define宏定义的初探

前言&#xff1a; 最基本的#define定义方式 #define可以定义宏&#xff0c;这点相信大家并不陌生&#xff0c;其定义的方式十分简单&#xff0c;给大家随便来一个最简单、最基础的定义方式看看&#xff1a; #include<stdio.h> #define a 3 int main() { printf(&quo…...

机器学习 -决策树的案例

场景 我们对决策树的基本概念和算法其实已经有过了解&#xff0c;那我们如何利用决策树解决问题呢&#xff1f; 构建决策树 数据准备 我们准备了一些数据如下&#xff1a; # 定义新的数据集 new_dataSet [[晴朗, 是, 高, 是],[雨天, 否, 低, 否],[阴天, 是, 中, 是],[晴朗…...

04、Kafka ------ 各个功能的作用解释(Cluster、集群、Broker、位移主题、复制因子、领导者副本、主题)

目录 启动命令&#xff1a;CMAK的用法★ 在CMAK中添加 Cluster★ 在CMAK中查看指定集群★ 在CMAK中查看 Broker★ 位移主题★ 复制因子★ 领导者副本和追随者副本★ 查看主题 启动命令&#xff1a; 1、启动 zookeeper 服务器端 小黑窗输入命令&#xff1a; zkServer 2、启动 …...

1、C语言:数据类型/运算符与表达式

数据类型/运算符/表达式 1.数据类型与长度2.常量3.声明4. 运算符5. 表达式 1.数据类型与长度 基本数据类型 类型说明char字符型&#xff0c;占用一个字节&#xff0c;可以存放本地字符集中的一个字符int整型&#xff0c;通常反映了所有机器中整数的最自然长度float单精度浮点…...

[ffmpeg系列 03] 文件、流地址(视频)解码为YUV

一 代码 ffmpeg版本5.1.2&#xff0c;dll是&#xff1a;ffmpeg-5.1.2-full_build-shared。x64的。 文件、流地址对使用者来说是一样。 流地址(RTMP、HTTP-FLV、RTSP等)&#xff1a;信令完成后&#xff0c;才进行音视频传输。信令包括音视频格式、参数等协商。 接流的在实际…...

python算法每日一练:连续子数组的最大和

这是一道关于动态规划的算法题&#xff1a; 题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;请找出该数组中连续子数组的最大和&#xff0c;并返回这个最大和。 示例&#xff1a; 输入&#xff1a;[-2, 1, -3, 4, -1, 2, 1, -5, 4] 输出&#xff1a;6 解释&#xff…...

一个vue3的tree组件

https://download.csdn.net/download/weixin_41012767/88709466...

新手练习项目 4:简易2048游戏的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…...

2023年度总结:技术沉淀、持续学习

2023年度总结&#xff1a;技术沉淀、持续学习 一、引言 今年是我毕业的第二个年头&#xff0c;也是完整的一年&#xff0c;到了做年终总结的时候了 这一年谈了女朋友&#xff0c;学习了不少技术&#xff0c;是充实且美好的一年&#xff01; 首先先看年初定的小目标&#xf…...

Unity 利用UGUI之Slider制作进度条

在Unity中使用Slider和Text组件可以制作简单的进度条。 首先在场景中右键->UI->Slider&#xff0c;新建一个Slider组件&#xff1a; 同样方法新建一个Text组件&#xff0c;最终如图&#xff1a; 创建一个进度模拟脚本&#xff0c;Slider_Progressbar.cs using System.C…...

OCS2 入门教程(四)- 机器人示例

系列文章目录 前言 OCS2 包含多个机器人示例。我们在此简要讨论每个示例的主要特点。 System State Dim. Input Dim. Constrained Caching Double Integrator 2 1 No No Cartpole 4 1 Yes No Ballbot 10 3 No No Quadrotor 12 4 No No Mobile Manipul…...

FreeRTOS学习第6篇–任务状态挂起恢复删除等操作

目录 FreeRTOS学习第6篇--任务状态挂起恢复删除等操作任务的状态设计实验IRReceiver_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第6篇–任务状态挂起恢复删除等操作 本文目标&#xff1a;学习与使用FreeRTOS中的几项操作&#xff0c;有挂起恢复删除等操作…...

caddy wordpress/seo搜索优化公司排名

分享下篮球比赛动画直播api数据接口代码示例&#xff0c;详细了解请查看接口文档&#xff0c;需注册下package com.huaying.demo.basketball;import javax.xml.bind.JAXBContext;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlElement;import javax…...

wordpress the simple/windows优化大师在哪里

词云是文本可视化的重要方式&#xff0c;可将大段文本中的关键语句和词汇高亮展示&#xff0c; 本篇文章先介绍几种制作词云的 Python 库&#xff0c;分别是 WordCloud、StyleCloud、Pyecharts&#xff1b;再加一个在线词云制作网站&#xff1b;最后通过代码实操和可视化效果对…...

做网站的上海市哪家技术好/网络营销企业有哪些公司

6号团队 &#xff08;依曼团队&#xff09; 开发软件&#xff1a;2048小游戏 整理人&#xff1a;王诗佳&#xff08;2017035107035&#xff09;&#xff08;项目经理 产品经理&#xff09; 主仓库地址&#xff1a;https://gitee.com/lleVn/Team6/tree/%E9%A1%B9%E7%9B%AE%E7%B…...

漂亮企业网站源码/重庆网站快速排名优化

前面的两周&#xff0c;我用连续两篇文章拆解了思科扔下的数颗物联网重磅炸弹。其中第一篇文章揭示的趋势是“实时物联网”&#xff0c;第二篇文章谈到的概念是“基于意图的网络&#xff08;IBNS&#xff09;”。 从反馈来看&#xff0c;基于意图的网络&#xff08;IBNS&#x…...

世界500强企业愿景/广告优化师

...

建设部网站企业资质/2022近期时事热点素材

Linq支持主要的查询&#xff1a; 1、对象集合&#xff08;IEnumerable或者IEnumerable<T>&#xff09; 2、SQL数据库 3、XML文档 先对对象集合做一个解释&#xff1a; 查询的是集合&#xff0c;包括List<T>&#xff0c;Dictionay<T,K>&#xff0c;HashTable&…...