操作系统真象还原_访问vaddr对应的pte

须知:
只要开启了分页机制,不管物理地址还是虚拟地址在CPU面前都按照分页处理,也就是即便给出物理地址CPU也按虚拟地址对待。

为什么没有出现页目录表结构体,也没有页目录项结构体。页目录表在某一块内存中,页表也在某一块内存中。只要用指针指向这些内存块中的某一个地址就能操控页目录表项和页表项,并不需要一个专门的的数据结构来定义页目录表和页表。
## 代码 \boot\loader6_3.s ``` ;第二步: ;将页目录表物理地址赋值给cr3寄存器,分页机制打开前要将页表地址加载到控制寄存器cr3中 mov eax, PAGE_DIR_TABLE_POS ; PAGE_DIR_TABLE_POS = 0x100000 mov cr3, eax ```

\kernel\memory.c

/** * 功能:*      得到参数vaddr所在的pte指针,指针的值也就是虚拟地址。*      通过vaddr构造一个新的虚拟地址new_vaddr,该新地址能够访问到vaddr所在pte。* 参数:*      vaddr   虚拟地址,分为三个部分,0000_0000_00|0000_0000_00|0000_0000_0000*                                      pde_num      pte_num      p_add* 说明:*      处理器第一次当成页目录表处理,第二次当成页表处理,第三次当成普通页处理* *      分三步:*          第一步,CPU将页目录表当成页目录表*          第二步,CPU将页目录表当成页表*          第三步,CPU将页目录表当成页(也就是页帧)*/
uint31_t *pte_ptr(uint32_t vaddr)
{// 0xffc00000 = 1111 1111 1100 0000 0000 0000 0000 0000 // 1111_1111_11b=0x3ff=1023 uint32_t *pte = (uint32_t *)(0xffc00000  // new_vaddr的页目录项下标,只是为了获得页目录表的物理地址+ ((vaddr & 0xffc00000) >> 10)  // 真正的页目录项下标,在cpu眼里是页表项下标+ PTE_IDX(vaddr) * 4);  // 真正页表项下标,在cpu眼里是普通页中的地址// 得到一个新的地址,新地址高10位必定是0xffc;中间10位是vaddr的高10位;低12位中的高10位是vaddr的中间10位。return pte;
}/** * 功能:*      根据vaddr来构造一个新的32位地址new_vaddr。* 参数:*      vaddr                   虚拟地址                * 说明:*      new_vaddr为虚拟地址vaddr对应的pde的指针得到虚拟地址vaddr所在pde的指针,也就*      是返回能够访问该pde的虚拟地址。*/
uint32_t *pde_ptr(uint32_t vaddr)
{/* 0xfffff是用来访问到页表本身所在的地址,如果new_vaddr的低12位为0,则访问到的是页表的起始虚拟地址 */uint32_t *pde = (uint32_t *)((0xfffff000) + PDE_IDX(vaddr) * 4);return pde;
}

MMU机制

页目录表物理地址已经存放在cr3寄存器,只要开启了分页机制,任何地址在CPU眼里都要cr3+pde_num*4找到页目录项,从页目录项中取出页表的地址;再用页表地址+pte_num*4找到页表项,再从页表项中找到页框地址;再用p_add在该页框中定位具体地址。

正常虚拟地址访问

假如vaddr = 0x7ffdac7f = (0111 1111 11)(11 1101 1010) 1100 0111 1111
             pde_num   pte_num   p_add

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=vim_md_image%2F%E6%99%AE%E9%80%9A%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84.png&pos_id=img-cap8xNr1e5c702f.png5

  • 第一步:
    • 1:MMU从cr3中取出页目录表的物理地址。
    • 2:MMU用cr3中的页目录表的物理地址+511*4定位到页目录项的物理地址。
  • 第二步:
    • 1:MMU从下标为511的页目录项中取出页表的物理地址。
    • 2:MMU用页表的物理地址+986*4,定位到对应的页表项的物理地址。
  • 第三步:
    • 1:MMU从下标为986的页表项中取出普通页框的物理地址。
    • 2:MMU用普通页框的物理地址+ 3199,从而定位到了真正的物理地址。

为什么要构造虚拟地址vaddr对应的pte指针

虚拟地址vaddr从虚拟地址池分配出来后,是无法访问的,因为没有建立物理地址映射。为此需要在页目录表中建立所在的页目录项和页表项。

虚拟地址范围与页目录项是一一对应的关系的,同样与页表项也一一对应,这种对应关系是固定的。4G范围的虚拟地址空间对应1024个页目录项,同样4M范围的虚拟地址对应1024个页表项。

虚拟地址空间与页表项、页目录项对于关系

请添加图片描述

虚拟地址vaddr = 0x7ffdac7 f对应页目录项下标为511,对应的页表项下标为986。也就是访问vaddr必须通过下标为511页目录项和下标为986页表项中转。因此,要将下标为986的页表项所在页表的物理地址存入下标为511页目录项中,要将普通页框的物理地址下标为986页表项中。

这就是函数pde_ptr()和pte_ptr()存在的意义。利用vaddr与页目录项和页表项一一对应的关系,计算出要操作哪个页目录项和页表项,从而改写目录项与页表项中的内容,建立物理地址与虚拟地址的映射关系。

构造虚拟地址vaddr对应的pte指针

要构造一个新的虚拟地址new_vaddr,该新地址要能够访问到vaddr所在pte。也就是得到虚拟地址 vaddr 对应的 pte 指针。

将vaddr作为参数,调用pte_ptr()得到:

*pte = (uint32_t *)(0xffc00000 + ((0x7ffdac7f & 0xffc00000) >> 10) + ((0x7ffdac7f & 0x003ff000) >> 12) * 4); 

0x7ffdac7f = 0111 1111 1111 1101 1010 1100 0111 1111
0xffc00000 = 1111 1111 1100 0000 0000 0000 0000 0000

(0x7ffdac7f & 0xffc00000) = 0x7fc00000 = 0111 1111 1100 0000 0000 0000 0000 0000
= (uint32_t *)(0xffc00000 + (0x7fc00000 >> 10) + ((0x7ffdac7f & 0x003ff000) >> 12) * 4)

0x7fc00000 >> 10 = 0111 1111 1100 0000 0000 00 = 0x1ff000
= (uint32_t *)(0xffc00000 + 0x1ff000 + ((0x7ffdac7f & 0x003ff000) >> 12) * 4)

(0x7ffdac7f & 0x003ff000) = 0x3DA000 = 0011 1101 1010 0000 0000 0000
= (uint32_t *)(0xffc00000 + 0x1ff000 + (0x3DA000 >> 12) * 4)

0x3DA000 >> 12 = 0011 1101 1010 00 = 0x3da
0x3da * 4 = 0xf68

= (uint32_t *)(0xffc00000 + 0x1ff000 + 0xf68)

0xffc00000 = 1111 1111 1100 0000 0000 0000 0000 0000
0x1ff000 = 0000 0000 0001 1111 1111 0000 0000 0000
0xf68 = 0000 0000 0000 0000 0000 1111 0110 1000

0xffc00000 + 0x1ff000 + 0xf68 = 0xFFDFFF68
= (1111 1111 11)(01 1111 1111) (1111 0110 1000)
pde_num    pte_num    p_add

= (uint32_t *)(0xFFDFFF68)

因此得到:

  • pde_num = 0x3ff
  • pte_num = 0x1ff
  • p_add = 0xf68

访问vaddr对应的pte

由于页目录表中的最后一个页目录项(也就是下标为1023的页目录项)中存储的是页目录表的物理地址,所以只要给出的虚拟地址new_vaddr的高十位是0x3ff,那么,原本new_vaddr的中间10位访问的是别的页表中的页表项就不会发生,相反,new_vaddr的中间10位(原本作为页表项的下标)仍然访问的页目录项的物理地址。new_vaddr的低12位访问的才是别的页表的页表项。

  • 第一步:
    • 1:MMU从cr3中取出页目录表的物理地址。
    • 2:MMU用cr3中的页目录表的物理地址+1023*4定位到页目录项的物理地址。
  • 第二步:
    • 1:MMU从下标为1023的页目录项中再次取出页目录表的物理地址。
    • 2:MMU用下标为1023的页目录项中存储的页目录表的物理地址+511*4,再次定位到对应页目录项的物理地址。
  • 第三步:
    • 1:MMU从下标为511的页目录项中取出页表的物理地址。
    • 2:MMU用下标为511的页目录项中存储的页表的物理地址+3944,从而定位到vaddr对应的pte的物理地址。

总结

当正常访问vaddr时,页目录表访问一次,页表访问一次,普通页框访问一次。
当访问vaddr对应的pte时,页目录表访问次,页表访问一次。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存储管理详解

目录 存储管理(1) 第一节 存储管理概述(内存管理) 一、存储体系 二、存储管理的任务 三、地址转换 存储管理(2) 第二节 分区管理方案 一、固定分区 二、可变分区 三、分区管理方案的优缺点 第…

docker openjdk:8-jdk-alpine 修改时区、添加字体

新建Dockerfile文件,制作新镜像 FROM openjdk:8-jdk-alpine 1、解决字体问题 RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/* 2、解决时差问题 # 解决时差8小时问题ENV TZAsia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /et…

Docker部署Nacos注册中心

文章目录 一、部署MySQL数据库并导入Nacos初始化SQL二、部署Nacos注册中心三、验证Nacos 一、部署MySQL数据库并导入Nacos初始化SQL 1、准备工作 docker pull mysql:8.0.27 Pwd"/data/software/mysql" mkdir ${Pwd}/{data,logs} -p chmod 777 ${Pwd}/logs2、添加配…

metinfo_5.0.4 EXP Python脚本编写

文章目录 metinfo_5.0.4EXP编写SQL注入漏洞 metinfo_5.0.4EXP编写 SQL注入漏洞 漏洞点:/about/show.php?langcn&id22 http://10.9.75.142/metInfo_5.0.4/about/show.php?langcn&id22验证漏洞(数字型注入) 状态码区分正确与错误 做比较的时候不能采用…

【计算机网络笔记二】网络层

IP 地址分类和子网掩码 IPv4 地址—简称 IP 地址,IP 地址由 32 位比特组成 IP地址现在由因特网名字和数字分配机构 ICANN(Internet Corporation for Assigned Names and Numbers)进行分配,IP地址的作用:用于网络寻址&…

猴赛雷 ! 上次我见过这么厉害的安全测试实战演练还是上次!

01、概念介绍 1.1 xss XSS 攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、Acti…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色(漫反射和环境反射同时存在时)计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ(以便…

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1

hadoop测试环境sqoop使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Sqoop看这篇文章就够了_must contain $conditions in where clause._SoWhat1412的博客-CSDN博客 大数据环境 C:\Windows\System32\drivers\etc 修改ip和hostname的对应关系 1…

第75步 时间序列建模实战:多步滚动预测 vol-3(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上两期,我们讲了多步滚动预测的第两种策略: 对于重复的预测值,取平均处理。例如,(1,2,3)预测出3.9和4.5,(2,3,4)预测出5.2和6.…

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝(一)使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中…

工具及方法 - 二进制编辑软件

之前介绍过用Notepad和VSCode进行二进制文件编辑。 很多通用型的文本编辑器都会集成二进制文件编辑功能,或者使用插件等形式扩展此项功能。比如vi/vim等工具。 而且,作为文本编辑、二进制文件编辑一类的工具,数量众多,各有特色。…

面试官:为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

公众号 小册 这是我整理的学习资料,非常系统和完善,欢迎一起学习 现代JavaScript高级小册 深入浅出Dart 现代TypeScript高级小册 linwu的算法笔记📒 一、安全特性 在前文中,我们已经了解到HTTP在通信过程中存在以下问题&…

STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案

第 1 章 概述  技术特点  支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出(RJ45 接口),支持多组动态 PDO 分组和对象字典的自动映射,支持站 号 ID 的自动设置与保存,支持 SDO 的…

zemaxMIF曲线图

调制传递函数( Modulation Transfer Function,MTF )是用来形容光学系统成像质量的重要指标。 通过对光学系统像空间进行傅里叶变换,可以得到一张分析图表,来描述像面上对比度和空间频率之间的对应关系。 对比度&…

相机有俯仰角时如何将像素坐标正确转换到其他坐标系

一般像素坐标系转相机坐标系都是默认相机是水平的,没有考虑相机有俯仰角的情况,大致的过程是:像素坐标系统-->图像坐标系-->相机坐标系 ->世界坐标系或雷达坐标系: 像素坐标系 像素坐标系(u,v)是…

R语言贝叶斯MCMC:GLM逻辑回归、Rstan线性回归、Metropolis Hastings与Gibbs采样算法实例...

原文链接:http://tecdat.cn/?p23236 在频率学派中,观察样本是随机的,而参数是固定的、未知的数量(点击文末“阅读原文”获取完整代码数据)。 相关视频 什么是频率学派? 概率被解释为一个随机过程的许多观测…

Spring Cloud Gateway快速入门(一)——网关简介

文章目录 前言一、什么是网关1.1 gateway的特点1.2 为什么要使用gateway 二、使用 Nginx 实现网关服务什么是网关服务?为什么选择 Nginx 作为网关服务?如何使用 Nginx 实现网关服务?1. 安装 Nginx2. 配置 Nginx3. 启动 Nginx4. 测试网关服务 …

Windows11 手把手教授开放端口

首先在控制面板点击“系统与安全”,找到防火墙 然后点击“windows defender”打开防火墙 点击左侧目录栏中“高级设置” 点击“入站规则”,再点击新建入站规则(开放端口有开放入站端口与开放出站端口之分,这里讲入站端口的开放…

精品Python宠物领养网站系统失物招领

《[含文档PPT源码等]精品基于Python实现的宠物网系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术:JavaScript、VUE.js&…