概述

Intel处理器支持对系统内存中的位置进行锁定原子操作,这些操作通常用于管理共享数据结构(例如信号量,段描述符,系统段或页表等),其中两个或多个处理器。可以同时尝试修改相同的数据,处理器提供机制保证访问的原子性。
Intel处理器使用三个相互依赖的机制来执行锁定的原子操作:

  • 受保障的原子操作:对于基本的内存事务(例如在系统内存中读取或写入一个字节)始终保证以原子方式处理。即一旦启动,处理器保证在允许另一个处理器或总线代理访问存储器位置之前完成操作
  • 总线锁定:处理器使用LOCK#信号和LOCK指令前缀对总线进行锁定,用于保证执行选定的一系列存储器操作,典型的操作时序如对存储器内的某个变量进行读取-修改-写入
  • 缓存一致性协议:确保可以对高速缓存中的数据结构执行原子操作,被称为缓存锁定(cache lock),此时则无需断言总线锁定

受保障的原子操作

Intel486及其后代处理器确保如下的基本操作总是自动原子性(即无需程序员编写任何指令)的:

  • 读/写单个字节
  • 读/写按16位对齐的单字
  • 读/写按32位对齐的双字

Pentium及其后代处理器确保如下的访存操作总是原子性的:

  • 读/写按64位对齐的四字
  • 访问非缓存类型存储器(uncached memory)中16位宽的数据且数据的16个比特位必须能够容纳在32位的数据总线中。

P6及其后代处理器确保如下的访存操作总是原子性的:

  • 访问缓存的存储器(cached memory)中非对齐的16-,32-,和64-位宽的数据且数据的比特位必须能够容纳在同一个缓存行中。

总线锁定

Intel 处理器(包括32位和64位)提供LOCK#信号,该信号在某些关键存储器操作期间自动置位,以锁定系统总线。当总线锁定时,来自其他处理器或总线代理的用于控制总线的请求会被阻止。软件可以指定在遵循LOCK语义的其他情况下将LOCK前缀添加到指令之前。

自动锁定

处理器自动遵循LOCK语义的操作如下:

  • 执行引用内存的XCHG指令时。

  • 设置TSS描述符的B(忙)标志时 - 处理器在切换到任务时测试并在TSS描述符的类型字段中设置忙标志。为确保两个处理器不会同时切换到同一任务,处理器在测试和设置此标志时遵循LOCK语义。

  • 更新段描述符时 - 加载段描述符时,如果标志清除,处理器将在段描述符中设置访问标志。在此操作期间,处理器遵循LOCK语义,以便在更新时,另一个处理器不会修改描述符。要使此操作生效,更新描述符的操作系统过程应使用以下步骤:

    • 使用锁定操作修改访问权限字节以指示不存在段描述符,并指定类型字段的值,该值指示正在更新描述符。
    • 更新段描述符的字段。 (此操作可能需要多次内存访问;因此,无法使用锁定操作。)
    • 使用锁定操作来修改访问权限字节,以指示段描述符有效并存在。
  • 无论是否清除,Intel386处理器始终更新段描述符中的已访问标志。Pentium 4,Intel Xeon,P6系列,Pentium和Intel486处理器仅在尚未设置时才更新此标志。

  • 更新页面目录和页表条目时 - 更新页面目录和页表条目时,处理器使用锁定周期来设置页面目录和页表条目中的已访问和脏标志。

  • 确认中断 - 中断请求后,中断控制器可以使用数据总线将中断向量发送到处理器。处理器在此期间遵循LOCK语义,以确保在传输向量时数据总线上不会出现其他数据。

软件控制总线锁定

要明确强制LOCK语义,软件可以在用于修改内存位置时使用LOCK前缀和以下说明。 当LOCK前缀与任何其他指令一起使用时或者当没有对存储器进行写操作时(即,当目标操作数在寄存器中时),将生成无效操作码异常(#UD)。

  • 位测试和修改指令(BTS,BTR和BTC)。
  • 交换指令(XADD,CMPXCHG和CMPXCHG8B)。
  • XCHG指令自动采用LOCK前缀。
  • 以下单操作数算术和逻辑指令:INC,DEC,NOT和NEG。
  • 以下双操作数算术和逻辑指令:ADD,ADC,SUB,SBB,AND,OR和XOR。

锁定指令保证仅锁定目标操作数定义的内存区域,但可以被系统解释为更大内存区域的锁定。软件应使用相同的地址和操作数长度访问信号量(用于多个处理器之间的信令的共享存储器)。 例如,如果一个处理器使用字访问访问信号量,则其他处理器不应使用字节访问来访问信号量。

总线锁的完整性不受存储器字段对齐的影响。遵循LOCK语义会获得更新整个操作数所需的多个总线周期。但是,建议锁定访问在其自然边界上对齐,以获得更好的系统性能:

  • 8位访问的任何边界(锁定或其他)。
  • 锁定字访问的16位边界。
  • 锁定双字访问的32位边界。
  • 锁定四字访问的64位边界。

锁定操作相对于所有其他内存操作和所有外部可见事件都是原子操作。只有指令获取和页表访问才能传递锁定的指令。锁定指令可用于同步由一个处理器写入并由另一个处理器读取的数据。

LOCK操作对内部处理器缓存的影响

对于Intel486和Pentium处理器,LOCK#信号在LOCK操作期间始终在总线上置位,即使被锁定的内存区域缓存在处理器中也是如此。

对于P6和更新的处理器系列,如果在LOCK操作期间被锁定的存储器区域被高速缓存在执行LOCK操作作为回写存储器并且完全包含在高速缓存行中的处理器中,则处理器可能不会断言 总线上的LOCK#信号。 相反,它将在内部修改内存位置并允许其缓存一致性机制,以确保以原子方式执行操作。 此操作称为“缓存锁定”。缓存一致性机制自动防止缓存相同内存区域的两个或多个处理器同时修改该区域中的数据。

相关参考

  • 《Intel处理器手册》

Intel处理器原子操作支持相关推荐

  1. Windows 11 支持的 Intel 处理器

    Windows 11 支持的 Intel 处理器 原始设备制造商 (OEM) 可对新的 Windows 11 设备使用以下 CPU. 新的 Windows 11 设备必须使用已通过针对 Windows ...

  2. linux C语言调用Intel处理器CPUID指令的实例

    在之前写的文章中,仅简单讲了一下CPUID指令,通过该指令可以获取很多和处理器相关的信息,如处理器的系列.型号.内存地址是多少位,等等.本文在Linux环境下,使用C语言内嵌汇编的手段使用CPUID指 ...

  3. Intel处理器CPUID指令学习

    前文<Intel处理器Family.Model.Stepping等的学习>只是简单讲了CPU的标识等内容(仅针对Intel,本文也是),但其读取方法未涉及.本文就此未完事宜来了解读取的方法 ...

  4. 此计算机没有Intel处理器,而加速Android仿真器需要该处理器

    在Visual Studio中通过Xamarin进行安卓App开发,启动Android Emulator时提示:pixel_2将以不加速的方式运行.此计算机没有Intel处理器,而加速Android仿 ...

  5. Intel 处理器模型

    <深入理解计算机系统> 龚奕利 雷迎春 译 P130 Intel 处理器系列俗称 x86. 8086 -- 1978 29K 个晶体管 第一代单芯片.16 位微处理器之一. 8088 在 ...

  6. Intel处理器分类规则

    Intel处理器分类规则 Intel处理器往往分系列,例如Celeron.Celeron D.Pentium 4.Pentium D等等,同系列的各个型号用频率.数字.字母等来加以区分,其命名有一定规 ...

  7. 【国产化系列】龙芯平台指令集简介及现有处理器的支持特性

    DATE: 2021.10.27 文章目录 1.转载参考 2.龙芯平台指令集简介 3.编译参数 4.查找热点函数进行代码优化 1.转载参考 龙芯平台指令集简介及现有处理器的支持特性 2.龙芯平台指令集 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配...

    第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...

  9. amd860k能装黑苹果吗_如何知道自己的AMD处理器是否支持安装黑苹果?

    目前所有使用AMD处理器来安装黑苹果的,实际上都是通过使用内核补丁的方法去仿冒Intel处理器(因为它们都是x86架构),以达到欺骗mac系统,从而达到"兼容"的目的. 所以,相比 ...

  10. 浅析Intel处理器体系结构:CPU运行模式

    文章目录 CPU运行模式 模式转换示意 系统上电时的模式切换 从实模式切换到保护模式 A20功能 开启A20功能 系统数据准备 模式切换流程 从保护模式切换到长模式 系统数据准备 模式切换流程 相关参 ...

最新文章

  1. LVM逻辑卷创建管理
  2. c++几种STL比较
  3. 关于ssl免费证书设置
  4. Libra白皮书解读
  5. 判断字符串出栈合法性
  6. ZooKeeper分布式应用程序的分布式协调服务:概述,入门,发布版本
  7. python九九乘法表矩形_用Python实现九九乘法表
  8. 实验5 数独游戏界面设计
  9. Win11硬盘安装方法介绍 Win11系统硬盘安装教程
  10. Java:三角函数计算器!
  11. 双系统Linux(centos\redhat)和window的安装
  12. The summary of Java
  13. [conda报错 已解决]An unexpected error has occurred. Conda has prepared the above report.
  14. 广东第一高中生_广东高中排行榜TOP10,有你的母校吗?
  15. matlab的上机报告,数理统计和Matlab上机报告.doc
  16. python求三位数的最大公约数和最小公倍数(3种算法)
  17. PDPS软件:机器人最佳布局位置自动选择功能介绍与使用方法
  18. 数据查询(sql运算符)
  19. 介绍 Q_DECLARE_PRIVATE与Q_DECLARE_PUBLIC
  20. 2014年珠宝行业下半年电商分析报告及双11销售排名

热门文章

  1. 新高考如何选科?职引教你一招简单又直接的方法
  2. python进行图像的风格转换
  3. C语言分支/顺序作业总结
  4. 如何在liunx上搭建服务器资源监控平台
  5. HTML+CSS美食静态网页设计
  6. MySQL倒计时查询剩余时间xx年xx月xx天
  7. 【Linux】shell脚本实战-使用shell进行数学运算
  8. html5按钮超链接一个文本文档,怎么做word文档超链接
  9. WIN10重置网络后网络适配器不见了并且适配器驱动感叹号
  10. 联想笔记本电脑连不上wifi,网络适配器显示黄色感叹号,错误代码56