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, SelectorFlatRW
    mov ss, ax
  
    mov eax, LinearAddrDemo
    shr eax, 22
    mov ecx, eax
    shl ecx, 2
    add ecx, PageDirBase1
    mov eax, ss:[ecx]
    mov ebx, eax
    push ecx
    call DispInt
    pop ecx

    shr ebx, 12
    shl ebx, 12
    push ebx
    call DispInt
    pop ebx
  
    mov eax, LinearAddrDemo
    shl eax, 10
    shr eax, 22
    mov ecx, eax
    shl ecx, 2
    add ebx, ecx
    mov eax, ss:[ebx]
    shr eax, 12
    shl eax, 12
    push eax
    call DispInt
  
    push ProcBar
    call DispInt
    ret

效果展示:

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个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/302103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# OpenCvSharp DNN 部署yoloX

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN 部署yoloX 效果 模型信息 Inputs ------------------------- name:images tensor:Float[1, 3, 640, 640] --------------------------------------------------------------- Outputs ---…

Showroom Environment gallery

展示厅环境-画廊 PBR包中的所有纹理。它们适用于URP和内建。在标准状态下,所有内容都是在URP下配置的。如果你有整个场景“粉红色”,请更改渲染设置。 简单的画廊内部,配有用于照片和图片的画布。非常适合您的虚拟画廊或展厅。此套餐包含一个展厅,您可以在其中展示您的作品…

python总结-生成器与迭代器

生成器与迭代器 生成器生成器定义为什么要有生成器创建生成器的方式一(生成器表达式) 创建生成器的方式二(生成器函数)生成器函数的工作原理总结 迭代器概念可迭代对象和迭代器区别for循环的本质创建一个迭代器 动态添加属性和方法运行过程中给对象、类添加属性和方法types.Met…

我想从Spring Cloud Alibaba开始聊聊架构的本质?

另外我的新书RocketMQ消息中间件实战派上下册,在京东已经上架啦,目前都是5折,非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

【Helm 及 Chart 快速入门】01、Helm 基本概念及仓库管理

目录 一、为何需要 Helm 二、什么是 Helm 三、Helm 核⼼概念 四、Helm 架构 五、Helm 安装 六、Helm 仓库管理 6.1 查看仓库 6.2 添加仓库 6.3 更新仓库 6.4 删除仓库 一、为何需要 Helm 在早期的 Linux 系统中,维护和安装软件包是⼀件极其麻烦的…

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展,聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中,ChatGP…

Android系统的启动流程

Android系统启动流程大致可以概括为以下的几个步骤: 电源启动BootLoader启动Linux内核启动init进程启动Zygote进程启动SystemServer进程启动Launcher启动 关键的进程及其作用: init进程 init进程是Android系统中用户空间的第一个进程,进程号…

leetcode 每日一题 2023年12月28日 收集巧克力

题目 2735. 收集巧克力 给你一个长度为 n、下标从 0 开始的整数数组 nums,nums[i] 表示收集位于下标 i 处的巧克力成本。每个巧克力都对应一个不同的类型,最初,位于下标 i 的巧克力就对应第 i 个类型。 在一步操作中,你可以用成…

每个程序员都该学习的5种开发语言

我曾在某处读到过(可能在《代码大全》,但我不敢确定),程序员应该每年学习一门新的编程语言。但如果做不到,我建议,你至少学习以下5种开发语言,以便你在职业生涯有很好的表现。 每个公司都喜爱精…

【数据结构】数据结构中应用题大全(完结)

自己在学习过程中总结了DS中几乎所有的应用题,可以用于速通期末考/考研/各种考试。很多方法来源于B站大佬,底层原理本文不做过多介绍,建议自己研究。例题大部分选自紫皮严书。pdf版在主页资源 一、递归时间/空间分析 1.时间复杂度的分析 设…

润和软件HopeStage与永中Office完成产品兼容性互认证

近日,江苏润和软件股份有限公司(以下简称“润和软件”)HopeStage 操作系统与永中软件股份有限公司(以下简称“永中软件”)永中Office办公软件完成产品兼容性测试。 测试结果表明:企业级通用操作系统HopeSta…

2023量子科技十大人物(团队) | 光子盒年度系列

今年,是量子科学与技术的又一个丰收年,学术研究团体和科技公司纷纷庆祝在量子计算、量子通信和量子计量学以及基础量子科学方面取得的重大成就。面对如此多令人兴奋的进展,我们不能不为这些进展庆祝——而所有这些的一切,都离不开…

如何编写高效的正则表达式?

正则表达式(Regular Expression,简称regex)是一种强大的文本处理技术,广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践,帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…

为什么网络安全从业者都考CISP-PTE

网络an全从业者考取CISP-PTE证书的原因👇 1️⃣高度认可 💎CISP-PTE证书是中国信息an全测评中心认证颁发,是国家对信息an全人员资质的zui高认可,具有很高的含金量。 对于网络an全从业者来说,可以证明自己具备规划测试方…

【python、pytorch】

什么是Pytorch Pytorch是一个基于Numpy的科学计算包,向它的使用者提供了两大功能。作为Numpy的替代者,向用户提供使用GPU强大功能的能力。做为一款深度学习的平台,向用户提供最大的灵活性和速度。 基本元素操作 Tenors张量:张量…

企业如何选择可靠的文件传输软件?曝光6招内行方法

随着企业内部对于文件传输需求的增加,原先传统的传输方式逐渐不再适合传输要求,无论是内部协作还是外部合作,企业都需要高效、安全、稳定的文件传输软件来支持业务的顺利进行。 然而,市面上的文件传输软件众多,不同的软…

redis数据结构源码分析——string

前面的文章大体讲解了redis的几种数据类型,针对设计表巧妙的数据类型,后续会出几篇文章单独讲解下,那么本篇文章针对string的源码进行讲解。 文章目录 字符串的三种编码sds结构sds的设计思想和优势sds API解析sdsnewlen(创建字符…

Linux源码解读

Linux内核源码是一个开源的操作系统内核,由著名的开发者林纳斯托瓦兹(Linus Torvalds)于1991年在芬兰赫尔辛基大学发布。Linux内核的源代码由一系列的C语言程序文件组成,这些文件包含了操作系统内核所需的所有功能,包括内存管理、进程调度、文…

嘴尚绝:卤味市场未来发展潜力无限,谁将成为下一个风口?

随着人们生活水平的提高,卤味作为一种美味的小吃,越来越受到消费者的喜爱。在餐饮市场上,卤味市场也呈现出越来越繁荣的景象。那么,卤味市场未来发展如何呢?今天,我们就来探讨一下这个问题。 一、消费升级推…

【漏洞复现】Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895

漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版…
最新文章