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

计算机一次取数过程分析

计算机一次取数过程分析

1 取址过程

CPU由运算器和控制器组成,其中控制器中的程序计数器(PC)保存的是下一条指令的虚拟地址,经过内存管理单元(MMU),将虚拟地址转换为物理地址,之后交给主存地址寄存器(MAR),从主存中取出这条指令,通过主存数据寄存器(MDR)交给指令寄存器(IR),IR再将其转化成控制信号。

在这里插入图片描述

2 间址过程

一条指令由 <操作码,寻址方式,地址码> 几部分组成,寻址方式共有以下十种

  • 隐含寻址
  • 立即寻址
  • 直接寻址
  • 间接寻址
  • 寄存器寻址
  • 寄存器间接寻址
  • 相对寻址
  • 基址寻址
  • 变址寻址
  • 堆栈寻址

根据有效地址(EA)或立即数所处的位置,可以分为以下三类

在寄存器:隐含寻址、寄存器寻址

在立即数:立即寻址

在主存:直接寻址、间接寻址、寄存器间接寻址、相对寻址、基址寻址、变址寻址、堆栈寻址

而无论哪种方式得到的有效地址(EA)同样也是虚拟地址


接下来要解决以下两个问题

问题一:虚拟地址如何转为物理地址?

问题二:如何访问该物理地址?


3 虚拟地址转为物理地址

3.1 单级页表系统

在分页管理的操作系统中,将主存分为一个个页框,操作系统会建立页表这种数据结构,负责虚拟页号和主存页框号的映射。

在这里插入图片描述

虚拟地址由 <页号,页内偏移量> 两部分组成,根据页号去查询页表,然后将页表中的页框号和页内偏移量组成物理地址。

例如页表部分内容如下,虚拟地址为00123366H,按字节编址,虚拟地址格式为<页号12位,页内偏移量20位>

在这里插入图片描述

在这里插入图片描述

根据虚拟地址中的001H,找到1号页表项,其页框号为521H,拼接上页内偏移量后即可得到物理地址52123366H。

但是如果想要查询页表,也要知道页表的起始地址,页表的地址保存在进程控制块(PCB)中,当CPU调度该进程时,会将PCB中的页表起始地址放入页表基址寄存器中,页表起始地址为物理地址

同时,为了解决页表项过多导致一个页框中放不下的问题,引入了多级页表。为了减少访存次数引入了快表(TLB)。

3.2 二级页表系统

在使用多级页表的32位操作系统中(以二级页表为例),虚拟地址被分成了 <页目录号,页号,页内偏移量> 三部分,例如在下图虚拟地址格式下虚拟地址为10801008H,页目录项和页表项长度均为4字节,按字节编址。

在这里插入图片描述

在这里插入图片描述

10801008H,其页目录号是66,页号是1,因此根据页目录号为66找到页目录项,其中的页框号是00301H,找到对应的页表所在页框,然后拼接上页号找到页号页表项对应的物理地址00301004H(这里因为一个页目录项是4B),页表中的页框号是98521H,拼接上页内偏移量,最终的物理地址为98521008H。

3.3 二级页表系统+快表

快表的实现基于相联存储器,是一种静态随机存取存储器(SRAM),使用的存储元是双稳态触发器,存取速度快。

在使用TLB的系统中,虚拟地址向物理地址的转换一般先查询快表(或者快表慢表一起查询),如果快表命中,可以直接获得页框号,再和页内偏移量组合,得到物理地址。

快表的映射方式有两种,为全相联映射和组相联映射,至于为什么不使用直接映射,在讨论完全相联映射和组相联映射后再讨论。

全相联映射

使用全相联映射的TLB中

TLB的格式为 <标记位,有效位,页框号>

此处的标记位即虚拟页号,若虚拟地址格式为 <页目录号(10位),页号(10位),页内偏移量(12位)>

TLB的标记位是虚拟地址中的页目录号+页号组成的虚拟页号

在这里插入图片描述

因为TLB是使用硬件电路实现的,全部TLB标记可以并行对比。

例如虚拟地址为10801008H,TLB使用全相联映射,虚拟地址格式为<页目录号(10位),页号(10位),页内偏移量(12位)>,TLB部分内容如下图所示

在这里插入图片描述

查询TLB表,10801H与虚拟页号一致,且有效位为1,因此可以直接得到页框号00001H,与页内偏移量008H拼接得到物理地址为00001008H,若未命中则回到上文中的查询二级页表的过程,且更新快表。

组相联映射

使用组相联映射的TLB格式如为 <标记位,有效位,页框号>,虚拟地址格式为 <标记位,组号,页内偏移量>,标记位+组号就是虚拟页号,同页目录号+页表号

例如二路组相联的TLB,其中共有32行,分成16组(用4位二进制表示),若虚拟地址为10801008H,虚拟地址格式为<标记位(16位),组号(4位),页内偏移量(12位)>,则查找1号分组,标记位为1080H

在这里插入图片描述

第一组标记位为1080H命中,其有效位为1,直接得到页框号为00002H,拼接上页内偏移量得到物理地址为00002008H,若未命中则回到上文中的查询二级页表的过程,且更新快表。

直接映射

TLB一项的大小很小,而且直接映射冲突率高,为了实现高命中率和低冲突率,因此TLB不使用直接映射。

而cache按照块大小,将主存一块数据(主存的一块和内存管理的一页没有关系,通常一页的大小比一块的大小要更大)读入cache行中,冲突率相比TLB会小一些,在部分场景下可以接受这种冲突的成本。

4.访问物理地址

得到物理地址后,会先访问cache,如果cache未命中访问主存,并将该物理地址所在块调入cache中(或者同时访问cache和主存)。

cache和TLB都是基于SRAM的相联存储器,不同的是cache的映射方式有三种,分别是直接映射,全相联映射,组相联映射。

在这里插入图片描述

直接映射

物理地址格式为 <Tag,行号,块内地址>

cache行内格式为 <Tag,有效位,脏位等其他数据,块数据>

全相联映射

物理地址为 <Tag,块内地址>

cache行内格式为 <Tag,有效位,脏位等其他数据,块数据>

组相联映射

物理地址格式为 <Tag,组号,块内地址>

cache行内格式为 <Tag,有效位,脏位等其他数据,块数据>

因为和TLB的过程没有太大区别,此处不再详细讨论。

不过值得注意的是,当TLB和cache未命中要更新TLB和cache时候需要使用置换算法,置换算法此处也不再讨论。

相关文章:

  • Error: Flash Download failed - Could not load file “xxx.axf“
  • 【Golang进阶】第七章:错误处理与defer——从优雅回收到异常恢复
  • CQF预备知识:Python相关库 -- NumPy 基础知识 - 结构化数组
  • 编码总结如下
  • ssm 学习笔记 day02
  • 【Linux】环境变量完全解析
  • 相机--RGBD相机
  • 【Linux】vim编辑器
  • git查看commit属于那个tag
  • Day 40
  • IM系统的负载均衡
  • windows-cmd 如何查询cpu、内存、磁盘的使用情况
  • Spring Web高保真Axure动态交互元件库
  • 每日Prompt:指尖做画
  • 【论文解读】CVPR2023 PoseFormerV2:3D人体姿态估计(附论文地址)
  • 在Babylon.js中创建3D文字:简单而强大的方法
  • Git的简单介绍分析及常用使用方法
  • CentOS7.9环境离线部署docker和docker-compose的两种方式
  • Express教程【003】:Express获取查询参数
  • 低碳理念在道路工程中的应用-预制路面
  • 广东省优质高职院校建设网站/线上推广方式有哪些
  • 国外色情 网站 推荐/社会新闻最新消息
  • 响应式网站建设企业/steam交易链接在哪
  • 有没有做的很炫的科技型网站/网店代运营公司哪家好
  • 模板网站做外贸好不好/中国十大广告公司排行榜
  • 用jsp做的网站代码/太原网站推广排名