NEMU PA 3-2 实验报告
一、实验目的
在上一章节我们完成了Cache的实现,但是这只是在速度上提高了取指和存取操作数的效率,而在访问的安全性上没有得到有效提升。
在PA3-2中我们要完成的,就是在NEMU中实现分段机制。
二、实验任务
首先老规矩,我们来了解一下分段机制是啥,以及它的作用:
为啥需要“分段机制”?
代码、数据都放在内存里,没有任何限制和保护。会导致很多问题,如数组越界覆盖了代码,恶意程序故意修改代码和数据。也就是说我们如果不做对代码的分段,不把它分开一个个段并明确每个段的作用的话,那么我随便改了改EIP,就可以跳转到任意我想要跳转的地方去执行。内存可以随意读写是非常危险的。
分段机制的直接阐释:将内存划分为具有不同功能的内存区域,把同一种功能和访问控制类型的数据归类放在一起,统一提供保护,为不同的程序规定不同的访问权限
分段机制的实现需要:段表(GDT和LDT),NEMU中指的是全局描述符表GDT。

好了,我们了解了分段机制,那么回到访存机制上,我们要把访存和分段机制结合起来,就需要在访存时提供三个信息,以及要怎么得到这些信息:
- 要访问内存的哪个段:要先从段表那里查询得到段基址
- 访问的数据相对段基址的偏移量是多少:用来检查越界情况
- 程序自身的权限等级是多少:用来检查权限是否满足
要实现这一套保护的机制,需要操作系统和计算机双方的配合。其中,各个段的段基址,界限和权限要求等信息,由操作系统(即NEMU中的kernel)初始化并保存在内存中一个特别的称为全局描述符表,简称GDT,的数据结构中。GDT中的每一行对应一个表项,称为段描述符。
我们来看看NEMU是怎么具体实现的:
首先,启动时NEMU的访存方式是类似实地址模式,即当前的
vaddr和最后的paddr一模一样,没有经过任何的权限检查和转换;(注意这和i386的实地址模式是不同的,区别如下)
x86的机器开机后首先进入实模式,加载操作系统,操作系统初始化段表,拨动一个‘开关’,从实模式切换到保护模式(开启分段机制);
进入保护模式后,程序给出48位虚拟地址
vaddr(16位段选择符 + 32位有效地址),使用段选择符来查段表,然后根据段表信息进行段级地址转换得到线性(现在就是物理)地址laddr。
好的,这就是分段机制开启的大体流程。我们来细看几个要点:
“开关”是什么?
这个开关是CPU中CR0寄存器中的PE位。它控制着实模式和保护模式的转换,当PE置为0时,采用实地址模式;当PE置为1时,采用保护地址模式。
段选择符怎么得到?
段选择符是存储在16bit的段寄存器中的index信息。有六个不同的段寄存器,即CS, SS, DS, ES, FS, GS六个段寄存器,每个寄存器指向某个段描述符,段寄存器的实现格式如下:

段描述符又是啥样子?
一个个64位的段描述符组成了GDT:

为什么描述段基地址的Base以及段大小的Limit字段会被拆成这种丑陋的结构?
因为需要兼容286架构...要怎么找到GDT?
通过CPU中的
GDTR寄存器来找到GDT的首地址和界限,然后根据段寄存器给出的段选择符来找GDT表项(段描述符)。
总体的思路如图:

好,我们现在在NEMU中要做的是:
在
include/config.h头文件中添加宏定义IA32_SEG并make clean;在
CPU_STATE中添加对GDTR、CR0的模拟以及在init_cpu()中进行初始化为0;在
CPU_STATE中添加对6个段寄存器的模拟在init_cpu()中进行初始化为0,注意除了要模拟其16位的可见部分,还要模拟其隐藏部分,顺序不能有错;实现包括
lgdt、针对控制寄存器和段寄存器的特殊mov以及ljmp指令;实现
segment_translate()、loag_sreg()函数,并在vaddr_read()和vaddr_write()函数中添加保护模式下的虚拟地址向线性地址转换的过程;通过
make test_pa-3-2执行并通过各测试用例。
三、思考题
我们在实现NEMU的分段机制前观察了开启SEG宏后kernel的变化。其中有两条语句的意义要了解的:
lgdt va_to_pa(gdtdesc)在干什莫?va_to_pa是一个地址转换的宏,lgdt指令是“Load Global Descriptor Table Register”,即装载GDTR。
ljmp $GDT_ENTRY(1), $va_to_pa(start_cond)又在干什莫?GDT_ENTRY也是一个宏:
而
ljmp指令的意义在于装载CS和EIP寄存器。要注意的一个点是,汇编中的
ljmp指令是AT&T的格式,在i386手册上是找不到这条指令的。而用objdump反汇编出来对照后看,ljmp对应的指令是JMP ptr16:16即一个far jump。(详细看博文:https://blog.csdn.net/weixin_39677203/article/details/111268072)
NEMU PA 3-2 实验报告的更多相关文章
- ucoreOS_lab3 实验报告
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
- ucoreOS_lab2 实验报告
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
- JAVA实验报告及第七周总结
JAVA第六周作业 实验报告五 第一题 1.设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法. 继承该抽象类定义三角型.矩形.圆. 分别创建一个三角形.矩形.圆存对象,将各类图 ...
- 第五次java实验报告
Java实验报告 班级 计科二班 学号 20188437 姓名 何磊 完成时间2019/10/10 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实 ...
- 第七周总结&第五次实验报告
学习总结 这周我们加深了对抽象类与接口的学习,获得的知识点也比上周多了许多,抽象类与接口很相似,就比如别人还没有做完的是交给你来做,而他那些样式都做好了,你只需要完善即可 但也有不同点. 区别点 抽象 ...
- 第七周课程总结 & 实验报告(五)
第七周课程总结 一.抽象类与接口的应用 1.实例化 2.实际应用 ---模板设计(抽象类) ---制定标准(接口) 3.设计模式 ---工厂设计 ---代理设计 ---适配器设计 二.抽象类与接口之间 ...
- 第七周&实验报告五
实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...
- 2019JAVA第五次实验报告
Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间2019/10/11 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. ...
- 实验报告5&第七周课程总结
实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...
- 北京电子科技学院(BESTI)实验报告5
北京电子科技学院(BESTI)实验报告5 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名) 郑凯杰.周恩德 学号:(按贡献大小排名) 20145314.20145217 ...
随机推荐
- VirtualBox 设置开机自动在后台启动虚拟机
打开 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 新建文件 virtualbox.bat 编写脚本 "C:\Pr ...
- C#对象二进制序列化优化:位域技术实现极限压缩
目录 1. 引言 2. 优化过程 2.1. 进程对象定义与初步分析 2.2. 排除Json序列化 2.3. 使用BinaryWriter进行二进制序列化 2.4. 数据类型调整 2.5. 再次数据类型 ...
- Vue事件方法中this.属性名
vue事件方法中访问data对象中的成员 : this.属性名 注意: 如果事件处理代码没有写到methods中,而是写在行内则不需要this.
- 【Git】用法小记
解决windows环境下的CRLF与unix环境下的LF问题,windows提交时CRLF=>LF,签出时LF=>CRLF,unix环境保留 git config --global cor ...
- Python学习之十五_不同类型数据库表内容比较
Python学习只十五_不同类型数据库表内容比较 前言 最近学习力总结了很多Python相关的内容 本次想继续学习一下不同数据库之间的数据比较. 这样理论上可以极大的缩减不同数据库测试成本. 感谢Py ...
- SQLServer 执行计划的简单学习和与类型转换的影响
SQLServer 执行计划的简单学习和与类型转换的影响 背景 最近一直在看SQLServer数据库 索引.存储.还有profiler的使用 并且用到了 deadlock graph 但是感觉还是不太 ...
- [转帖]PD 配置文件描述
https://docs.pingcap.com/zh/tidb/stable/pd-configuration-file PD 配置文件比命令行参数支持更多的选项.你可以在 conf/config. ...
- [转帖]如何通过JMeter测试金仓数据库KingbaseES并搭建环境
1.安装JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具,主要用于对软件的压力测试,它最初被设计用于Web应用测试,但后来扩展到其它测试领域.它可测试静态.动 ...
- Windows 修改时间提示: 某些设置已隐藏或由你的组织管理 的解决方案
最近公司的一台生产服务器时间不对. 因为机器有域控的需求, 所以加入了域, 想改时间时有这样的提示信息: 某些设置已隐藏或由你的组织管理 百度了很久发现没有解决方法.. 但是突然发现可以使用 运行-& ...
- [转帖]jar启动指定JDK/JRE 安装路径教程
https://blog.csdn.net/weixin_40986713/article/details/128136777 前言 因为疫情在家办公的缘故,有个老项目,需要改个接口,然后需要前端联调 ...