0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ARM架构和总线协议如何支持Linux原子操作?

Linux阅码场 来源:未知 作者:易水寒 2018-08-18 10:57 次阅读

这篇文章探讨ARM架构和总线协议如何来支持的。对于某款ARM处理器和总线CCI,CCN和CMN产品的具体实现,属于实现层面的微架构,一般需要NDA,这里不予讨论。

顺便提一下,在ARMv8 架构下对应的是LDXR (load exclusive register 和STXR (store exclusiveregister)及其变种指令,另外,在ARMv8.1架构中引入atomic instruction, 例如LDADD (Atomic add),CAS(Compare and Swap)等。

Exclusive monitor

首先,作为一个爱问为什么的工程师,一定会想到LDXR/ STXR和一般的LDR/STR有什么区别。这个区别就在于LDXR除了向memory发起load请求外,还会记录该memory所在地址的状态(一般ARM处理器在同一个cache line大小,也就是64 byte的地址范围内共用一个状态),那就是Open和Exclusive。

我们可以认为一个叫做exclusive monitor的模块来记录。根据CPU访问内存地址的属性(在页表里面定义),这个组件可能在处理器 L1 memory system, 处理器cluster level, 或者总线,DDR controller上。

下面是Arm ARM架构 [1] 文档定义的状态转换图

实例说明:

1)CPU1发起了一个LDXR的读操作,记录当前的状态为Exclusive

2)CPU2发起了一个LDXR的读操作,当前的状态为Exclusive,保持不变

3)CPU2发起了一个STXR的写操作,状态从Exclusive变成Open,同时数据回写到DDR

4)CPU1发起了一个STXR的写操作,因为当前的exclusive monitor状态为Open,写失败(假如程序这时用STR操作来写,写会成功,但是这个不是原子操作函数的本意,属于编程错误)

假如有多个CPU,同时对一个处于Exclusive的memory region来进行写,CPU有内部逻辑来保证串行化。

Monitor的状态除了STXR会清掉,从Exclusive变成Open之外,还有其他因素也可以导致monitor的状态被清掉,所以软件在实现spinlock的时候,一般会用一个loop循环来实现,所谓“spin”。

Exclusive monitor实现所处的位置

根据LDXR/STXR 访问的memory的属性,需要的monitor可以在CPU内部,总线,也可以DDR controller(例如ARM DMC-400 [2]在每个memory interface 支持8个 exclusive access monitors)。

一般Memory属性配置为 normal cacheable, shareable,这种情形下,CPU发起的exclusive access会终结在CPU cluster内部,对外的表现,比如cacheline fill和line eviction和正常的读写操作产生的外部行为是一样的。具体实现上,需要结合local monitor的状态管理和cache coherency 的处理逻辑,比如MESI/MOESI的cacheline的状态管理来。

为方便大家理解,下面划出一个monitor在一个假象SOC里面的逻辑图(在一个真实芯片里面,不是所有monitor都会实现,需要和SOC vendor确认)

External exclusive monitor

对于normal non-cacheable,或者Device类型的memory属性的memory地址,cpu会发出exclusive access的AXI 访问(AxLOCK signals )到总线上去,总线需要有对应的External exclusive monitor支持,否则会返回错误。例如, 假如某个SOC不支持外部global exclusivemonitor,软件把MMU disabled的情况下,启动SMP Linux,系统是没法启动起来的,在spinlock处会挂掉。

AMBA AXI/ACE 规范

The exclusive access mechanism can provide semaphore-type operations without requiring the bus to remain dedicated to a particular master for the duration of the operation. This means the semaphore-type operations do not impact either the bus access latency or the maximum achievable bandwidth.

The AxLOCK signals select exclusive access, and the RRESP and BRESP signals indicate the success or failure of the exclusive access read or write respectively.

The slave requires additional logic to support exclusive access. The AXI protocol provides a mechanism to indicate when a master attempts an exclusive access to a slave that does not support it.

Atomic指令的支持

处理器,支持cache coherency协议的总线,或者DDR controller可以增加了一些简单的运算,比如,在读写指令产生的memory访问的过程中一并把简单的运算给做了。

AMBA 5 [3] 里面增加了对Atomic transactions的支持:

AMBA 5 introduces Atomic transactions, which perform more than just a single access, and have some form of operation that is associated with the transaction.

Atomic transactions are suited to situations where the data is located a significant distance from the agent that must perform the operation. Previously, performing an operation that is atomically required pulling the data towards the agent, performing the operation, and then pushing the result back.

Atomic transactions enable sending the operation to the data, permitting the operation to be performed closer to where the data is located.

The key advantage of this approach is that it reduces the amount of time during which the data must be made inaccessible to other agents in the system.

支持4种Atomic transaction:AtomicStore ,AtomicLoad,AtomicSwap 和AtomicCompare

QA

1) Local monitor和Global monitor的使用场景

* Local monitor适用于访问的memory属为normal cacheable, shareable或者non-shareable的情况.

* Global monitor ,准确来说,external global exclusive monitor (处理器之外,在外部总线上)用于normal noncacheable或者device memory类型。比如可以用于一个Cortex-A处理器和一个Cortex-M 处理器(没有内部cache)之间的同步。

2)多CPU下,多个LDREX,和STREX的排他性实现

* 各个处理器和总线的实现不同,可以从软件上理解为和data coherency实现相结合,比如M(O)ESI协议[5],这是一种Invalidate-basedcache coherence protocol, 其中的key point就是当多个CPU在读同一个cacheline的时候,在每个CPU的内部cache里面都有cacheline allocation, cacheline的状态会变成Shared;但是当某个CPU做写的时候,会把其它CPU里面的cacheline数据给invalidate掉,然后写自己的cacheline数据,同时设置为Modified状态,从而保证了数据的一致性。

* LDREX,本质上是一个LDR,CPU1做cache linefill,然后设置该line为E状态(Exclusive),额外的一个作用是设置exclusive monitor的状态为Exclusive;其他cpu做LDREX,该line也会分配到它的内部cache里面,状态都设置为Shared ,也会设置本CPU的monitor的状态。当一个CPU 做STREX时候,这个Write操作会把其它CPU里面的cacheline数据给invalidate掉。同时也把monitor的状态清掉,从Exclusive变成Open的状态,这个MESI协议导致cachline的状态在多CPU的变化,是执行Write操作一次性改变的。这样在保证数据一致性的同时,也保证了montitor的状态更新同步改变。

3)比如举一个多核的场景,一个核ldrex了,如果本核的local monitor会发生什么,外部的global monitor发生什么,开不开mmu,cache不cache,区别和影响是什么。

Ldrex/strex本来就是针对多核的场景来设计的,local monitor的状态发生改变,不会影响外部的global monitor状态。但是external global monitor的状态发生改变,可以告诉处理器,把local monitor的状态清掉。

Data coherency是通过硬件来支持的。对于normal cacheable类型的memory, MMU和DCache必须使能,否则CPU会把exclusive类型的数据请求发出处理器,这时需要外部monitor的支持。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8639

    浏览量

    361641
  • Linux
    +关注

    关注

    87

    文章

    10978

    浏览量

    206672
  • 总线
    +关注

    关注

    10

    文章

    2695

    浏览量

    87156

原文标题:罗玉平: 关于ARM Linux原子操作的底层支持

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    X86和ARM中的指令集支持原子操作

    裸机开发与RTOS开发一个非常重要的区别在于多线程之间的消息传递和数据共享问题,然而在这中间变量的原子操作是一个非常重要的话题,不同的处理器架构和编译选项都可能生成不同的指令,从而影响到变量的
    发表于 07-06 16:10 1106次阅读
    X86和<b class='flag-5'>ARM</b>中的指令集<b class='flag-5'>支持</b><b class='flag-5'>原子</b><b class='flag-5'>操作</b>

    工程师深谈ARM+FPGA的设计架构

    控制器等,在ARM端直接对相关的SPI通信控制器操作就可以了。而FPGA这一端可作为SPI从,按照SPI协议的时序写好从设备接口,这个工作量没有多大,所以相对都比较容易。[/url]另一种是数据量
    发表于 01-12 19:00

    ARM架构是什么

    从单片机转到ARM,主要需要学习ARM架构ARM相比单片机多了一些外设和总线。在仅仅是裸奔的情况下,如果熟悉了
    发表于 07-01 09:23

    ARM架构简单介绍

    ARM架构简单介绍市场上成百上千种的 ARM 芯片,如果我们去看它们的内核,却只有不多的几种。从时间上来看,从1985年设计的 26 位地址总线的 ARMv1, 到 ARMv2, 一直
    发表于 12-06 07:29

    ARM架构基础知识点汇总

    从单片机转到ARM,主要需要学习ARM架构ARM相比单片机多了一些外设和总线。在仅仅是裸奔的情况下,如果熟悉了
    发表于 12-13 06:26

    介绍一款支持Vulkan的Arm平台Linux操作系统

    介绍一款支持Vulkan的Arm平台Linux操作系统
    发表于 03-03 06:41

    Arm A-profile架构对不可屏蔽中断 (NMI) 的支持

    Arm 正在增加对 NMI 的 CPU 和通用中断控制器 (GIC) 架构支持。但是究竟什么是 NMI,操作系统软件如何使用这些功能,以及当有多种方法可以屏蔽它们时,为什么它们被
    发表于 06-02 18:05

    SOC芯片之互联总线协议相关资料分享

    1、对APB总线的理解之前,说了片上互联总线,但是光有总线可是不行的,还需要片上总线协议支持才行
    发表于 07-18 16:26

    设备仿真模拟软件 QEMU 8.0 发布:改进对 ARM / RISC-V 架构支持

    和 HPPA 平台带来各种新功能和改进。 QEMU (Quick Emulator)是业界主流的设备仿真模拟软件之一,可以在一种架构(如 X86 PC)的物理机上运行支持其它架构操作
    发表于 05-05 09:48

    基于嵌入式系统异构总线原子协议锥匹配

    针对异构总线嵌入系统难以进行部件移植和接口互换问题,提出基于嵌入系统异构总线原子协议锥匹配方法,分析接口协议
    发表于 04-20 08:50 15次下载

    ARM+Linux设计的CAN总线和MiniGUI的虚拟仪表

    ARM+Linux设计的CAN总线和MiniGUI的虚拟仪表技术 摘  要: 基于ARM+Linux架构,通过CAN总线获得数
    发表于 05-06 17:24 1646次阅读

    ARM架构应用实例_操作系统

    ARM嵌入式应用程序架构设计实例精讲--ARM架构应用实例03操作系统
    发表于 07-08 11:08 0次下载

    浅谈鸿蒙内核源码的原子操作

    ARMv6架构引入了LDREX和STREX指令,以支持对共享存储器更缜密的非阻塞同步。由此实现的原子操作能确保对同一数据的“读取-修改-写入”操作
    的头像 发表于 04-25 16:05 1090次阅读
    浅谈鸿蒙内核源码的<b class='flag-5'>原子</b><b class='flag-5'>操作</b>

    什么指令集支持原子操作

    这个是在面试的时候遇到的问题,当时没有答出来。回到家以后查了查,整理记录下来。 原问题:什么指令集支持原子操作?其原理是什么?
    的头像 发表于 08-02 11:48 1162次阅读

    使用Linux原子操作实现互斥点灯

    Linux原子操作是指不能再进一步分割的操作,一般原子操作用于变量或者位
    的头像 发表于 04-13 15:07 639次阅读
    使用<b class='flag-5'>Linux</b><b class='flag-5'>原子</b><b class='flag-5'>操作</b>实现互斥点灯