当执行汇编指令MOV [0001H] 01H时,CPU都做了什么?

今天和几位单位大佬聊天时,讨论到一个非常有趣的问题-当程序执行MOV [0001H], 01H计算机实际上都做了哪些工作?乍一看这个问题平平无奇,CPU只是把立即数01H放在了地址为0001的内存里,但仔细想想这个问题远没有那么简单,由于现代计算机体系中CPU速度比内存要快2到3个个数量级,因此从CPU执行MOV指令,到实际把01H写入内存之间,还有非常漫长而复杂的过程。

为了回答好这个问题,我翻阅了一些资料,发现不同时代的CPU在执行这个操作时,行为也不一样,下面分享一下我的成果。

一.386及之前的CPU

从现在的角度来看,386及以前的CPU完全是上古时期的物件,还没有指令流水线的概念,当CPU执行这条汇编指令时,会和我们的第一印象差不多,基本会是按照以下步骤进行工作:

1.取指、译码,简单说就是从可执行文件中把MOV的二进制表示100010翻译出来。

2. 取操作数,将立即数01H加载到内部寄存器。

3. 取内存地址,将内存地址0001H(地址为0001的内存单元,不考虑段寄存器加偏移量的形式)加载到内部寄存器。

4. 指令执行,将内存地址0001H所指向的内存单元与内部寄存器中的数据(即01H)进行写入操作,完成将01H写入到内存单元000H1的操作。

二.486与酷睿之前的CPU

这个阶段的CPU和386相比增加了指令流水线的概念,我们知道CPU的每个动作都需要用晶体震荡而触发,想完成一个最简单的指令也需要取指、译码、取操作数、执行以及获取操作结果等若干步骤,而每个步骤都需要一次晶体震荡才能推进,因此在流水线技术出现之前执行一条指令至少需要5到6次晶体震荡周期才能完成。

指令/时刻

T1

T2

T3

T4

T5

MOV

取指

译码

取操作数

执行

取结果

而流水线的思想就是将不同指令的译码、寻址、执行等操作,放在一个震荡周期中并发完成。

指令/时刻

T1

T2

T3

T4

T5

T6

T7

T8

指令1

取指

译码

取操作数

执行

取结果 

指令2

取指

译码

取操作数

执行

取结果 

指令3

取指

译码

取操作数

执行

取结果 

指令4

取指

译码

取操作数

执行

取结果 

指令5

取指

译码

取操作数

执行

指令6

取指

译码

取操作数

指令7

取指

译码

指令8

取指

但上述升级对于MOV [0001H] 01H指令的执行没有带来太多本质变化。

三、酷睿后的现代多核CPU

在2006年英特尔发布一代酷睿处理器之后,现代桌面CPU正式进入了多核时代,现代CPU在执行指令时会和内存交互,但CPU本身只是直接操作高速缓存而不会直接操作内存。

MESI协议简介

现代X86 CPU的高速缓存(Cache),包括多级缓存(L1、L2、L3)。高速缓存是位于CPU内部的一块快速访问的存储区域,用于临时存储从主内存中读取的指令和数据。当CPU需要访问内存时,它首先会检查高速缓存,如果所需数据已经存在于高速缓存中,CPU会直接从高速缓存中读取或写入数据,无需访问主内存。其中L1和L2为每个CPU核心的专属缓存,L3为各核心的共享使用。 CPU多核心之间的高速缓存同步一般按照MESI协议进行,即每个缓存行都有四个状态,分别是E(exclusive)、M(modified)、S(shared)、I(invalid),说明如下:

M:代表该缓存行中的内容被修改,并且该缓存行只被缓存在该CPU中。这个状态代表缓存行的数据和内存中的数据不同。

E:代表该缓存行对应内存中的内容只被该CPU缓存,其他CPU没有缓存该缓存对应内存行中的内容。这个状态的缓存行中的数据与内存的数据一致。

I:代表该缓存行中的内容无效。

:该状态意味着数不只存在在本地CPU缓存中,还存在其它CPU的缓存中。这个状态的数据和内存中的数据也是一致的。不过只要有CPU修改该缓存行都会使该行状态变成 I 。

四种状态的状态转移图如下:

 

​在初始执行MOV [0001H] 01H,实际执行这条语句的核心上会触发local write的动作,这实际会把内存地址对应的缓址行置为Modify状态,而Modify状态下内存和缓存的内容实际是不一致的。而01H到底会不会被写回内存也是需要讨论的。

 01H被显式写入内存0001H:这种情况也有其他其它核心也发起了对于0001H地址的读取操作,即发起remote read,在这种情况缓存的状态会从Modify迁移到Share状态,而Share状态下缓存中的数据会被显示的写回内存。也就是MOV [0001H] 01H被实际执行完成。

 01H未被写入内存0001H:这种情有其他其它核心发对于地于0001H的写操作,即发起remote wri,e,这种情况下,在这种情况缓存的状态会从Modify迁移到Invalid状态,而Invalid状态下的调整缓存数据不会再被写入内存了。

内存写入状态未知:如果0001H地址的读写一直由同一核心操作,那么这种情况下缓存的状态就一直是Modify,那么这时候01H是否被写入内存,就取决于0001H这个内存地址是否能始终处于热点访问状态了,如果该地址一直在缓存中不被换出的话,那么01H的值有可能不会被写入内存,只有当该地址从缓存中换出时才会触发内存的回写操作。

总之,现代的CPU在执行MOV [0001H] 01H这样一条平平无奇的指令时,其实背后也做了很多工作,甚至操作完成后01H的值到底有没有写入到内存地址0001H也是很不确定的,希望通过本文梳理各阶段CPU执行MOV [0001H] 01H指令的过程,可以帮助读者更好的理解现代CPU的工作原理。

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

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

相关文章

matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法

总结和记录一下matlab求解常微分方程常用的数值解法,本文先从欧拉法和改进的欧拉法讲起。 d x d t f ( x , t ) , x ( t 0 ) x 0 \frac{d x}{d t}f(x, t), \quad x\left(t_{0}\right)x_{0} dtdx​f(x,t),x(t0​)x0​ 1. 前向欧拉法 前向欧拉法使用了泰勒展开的第…

基于grpc从零开始搭建一个准生产分布式应用(2) - 工程构建

开始本章之前默认读者已经配置好了以下环境:Intellij IDEA 2022.1.2、JDK 1.8.0_144、Maven 3,另外也建议大家在一些免费代码托管平台开个帐号,这样就可以免费使用git做版本处理了,笔者自己私人使用的是阿里云的云效平台。因为此专…

Docker安装ElasticSearch/ES 7.4.0

目录 前言安装ElasticSearch/ES安装步骤1:准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 安装步骤2:拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 安装步骤3:创建容器创建容器方…

ESP8266(RTOS SDK)内嵌网页以实现WEB配网以及数据交互

【本文发布于https://blog.csdn.net/Stack_/article/details/131997098,未经允许不得转载,转载须注明出处】 1、执行make menuconfig,将http头由512改为更大的值,否则用电脑浏览器访问正常,但用手机浏览器访问会因为ht…

idea双击启动无效,idea卡顿问题

idea双击启动无效:大概率是关机时没有正确关闭idea,再次开机导致无法正常启动idea 1.通过任务管理器杀死idea进程后重启idea 2.需要修改配置 打开 (以各自电脑实际为准)C:\Program Files\JetBrains\IntelliJ IDEA 2020.3.1\bin&am…

ECS服务器安装docker

​ 为了安装并配置 Docker ,你的系统必须满足下列最低要求: 64 位 Linux 或 Windows 系统 如果使用 Linux ,内核版本必须不低于 3.10 能够使用 sudo 权限的用户 在你系统 BIOS 上启用了 VT(虚拟化技术)支持 on your s…

StarRocks企业级数据库

第1章 StarRocks简介 1.1 StarRocks介绍 StarRocks是新一代极速全场景MPP数据库 StraRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化、升级架构,并增添了众多全新功能&…

进程间通信(IPC)的几种方式

进程间通信(IPC) 1.常见的通信方式2.低级IPC方法文件 3.常用于本机的IPC机制3.1无名管道pipe3.2命名管道FIFO3.3消息队列MessageQueue3.4共享内存SharedMemory3.5信号量Semaphore3.6信号Signal3.7unix域套接字 4.不同计算机上的IPC机制5.IPC机制的数据拷…

用友-NC-Cloud远程代码执行漏洞[2023-HW]

用友-NC-Cloud远程代码执行漏洞[2023-HW] 一、漏洞介绍二、资产搜索三、漏洞复现PoC小龙POC检测脚本: 四、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

网络防御之SSL VPN

1. SSL工作过程是什么? 第一阶段: 客户端发送client hello消息到服务端,服务端收到client hello消息后,再发送server hello消息到客户端。 第二阶段: 服务器的证书,用于客户端给客户端发送信息时加密 serv…

最新智能AI系统+ChatGPT源码搭建部署详细教程+知识库+附程序源码

近期有网友问宝塔如何搭建部署AI创作ChatGPT,小编这里写一个详细图文教程吧。 使用Nestjs和Vue3框架技术,持续集成AI能力到AIGC系统! 增加手机端签到功能、优化后台总计绘画数量逻辑!新增 MJ 官方图片重新生成指令功能同步官方 …

Apollo让自动驾驶如此简单

前言: 最近被新能源的电价闹的不行,买了电车的直呼上当了、不香了。但电车吸引人不只是公里油耗低,还有良好的驾车使用感。比如辅助驾驶、甚至是自动驾驶。今天来介绍一个头部自动驾驶平台Apollo,Apollo是一个开源的、自动驾驶的软…

mac安装vscode 配置git

1、安装vscode 官网地址 下载mac稳定版安装很慢的解决办法 (转自) mac电脑如何解决下载vscode慢的问题 选择谷歌浏览器右上角的3个点,选择下载内容,右键选择复制链接地址,在新窗口粘贴地址, 把地址中的一段替换成下面的vscode.cd…

06_Hudi案例实战

本文来自"黑马程序员"hudi课程 6.第六章 Hudi案例实战 6.1 案例架构 6.2 业务数据 6.2.1 消息数据格式 6.2.2 数据生成 6.3 七陌数据采集 6.3.1 Apache Flume 是什么 6.3.2 Apache Flume 运行机制 6.3.3 Apache Flume 安装部署 6.3.4 Apache Flume 入门程序 6.3.5 七…

Linux 终端命令之文件浏览(3) less

Linux 文件浏览命令 cat, more, less, head, tail,此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

linux I/O性能优化

Linux 文件系统 磁盘和文件系统的关系: 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。 文件系统工作原理 索引节点和目录项 文件系统,本身是对存储设备上的文件,进行组织…

cesium学习记录07-实体(Entity)

在学习记录05中,我们将了如何在 Cesium 中加载各种数据,包括矢量数据、影像图层、地形和 3D 模型。这些数据为我们构建了一个基础的场景和背景。特别是在加载 3D 模型时,我们采用了 viewer.scene.primitives.add 方法将模型作为一个原始对象添…

chatGPT小白快速入门-002:一文看懂什么是chatGPT

一、前言 本文是《chatGPT小白快速入门培训课程》的第002篇文章:一文看懂什么是chatGPT,全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见:《chatGPT小白快速入门课程大纲》。 本系列文章,参与: AIGC…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列(queue) 队列是一种用于实现任务与任务之间,任务与中断之间消息交流的机制。 注意:1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验:创建一个消息队列…

阿里云弹性裸金属服务器详细介绍(原神龙)

阿里云弹性裸金属服务器(ECS Bare Metal Server)是一种可弹性伸缩的高性能计算服务,原神龙服务器,计算性能与传统物理机无差别,具有安全物理隔离的特点,裸金属服务器分钟级的交付周期。阿里云服务器网分享阿…