Bus,Exclusive access,memory attribute

指令LDREX,STREX是在armv6中新加的指令,配合AMBA3--AXI中的lock[1:0]信号。

在Atomic Access一节中是这么规定的:ARLOCK[1:0]/AWLOCK[1:0]信号为2'b00-------Normal access

                                                    ARLOCK[1:0]/AWLOCK[1:0]信号为2'b01-------Exclusive access

                                                    ARLOCK[1:0]/AWLOCK[1:0]信号为2'b10-------Locked access   

exclusive的操作相对于lock操作的优点是:只根据返回的resp来确定原子操作是否正确,不会影响interconnect的性能。

对于Exclusive access,从slave的角度来看,首先slave必须支持Exclusive的访问,具体slave必须有一些monitors 来记录收到exclusive访问时的,

                               ARID/AWID,ARADDR/AWADDR,ARSIZE/AWSIZE,ARLEN/AWLEN。总之必须保证访问的master和地址完全的一致。

                                其中的ARID/AWID由arm core来决定,如果是core0,ARID/AWID一般就是0。

从master的角度来看,master要发出一个exclusive的访问必须,先发出exclusive read后再发出exclusive write来完成一次exclusive的访问。

                               1)对于exclusive访问,正确的response是EXOKAY。而由于有的slave不支持exclusive的访问后直接忽视掉lock信号,此时就会

                                  返回OKAY信号。

                               2)在exclusive read之后,slave仍可在该地址接收normal write,此时如果exclusive指定的地址中的数据已经改变,则slave不

                                 会再下次exclusive write的时候,返回EXOKAY,取而代之会返回OKAY,表示出错了,此时write的值也不会写入。

                               3)在一次exclusive read会后,可以不等exclusive write,直接再发出exclusive read,这样slave monitor的地址就会改变,

                                 相当于发起一个新的exclusive操作。

exclusive的操作,不能是cache的属性。

在slave端,monitor的最小的地址是length*size,同样也可以monitor一个比这个乘机更大的地址空间,但是这样可能会使本来正确的

exclusive access却报出了错误。

对于lock操作,主要需要interconnect保证只有特定ID的master可以访问一个特定的slave地址,直到同一ID的master发出一个unlock的操作接收到。

                    一个master可以开始一个read/write的lock sequence,但这时必须保证没有其他的outstanding的transaction等待完成。

                    当一个master开始一个lock的transaction时,必须保证没有其他的locked的transaction还没有完成。  

                    master必须保证一个locked transaction sequences中,最多只有两个transaction,同时在lock操作的过程中,

                    所有的transaction都必须是同样的ID,一个lock的sequence,以最后一个unlock的transaction结束。ARLOCK/AWLOCK信号无效。

              

LDREX和STREX指令可以用在多个处理器和共享内存系统之间,实现进程间的通信。

LDREX表示从储存器加载数据,相当于读操作,

                    如果该物理地址有共享TLB属性,则LDREX会将该物理地址标记为由当前处理器独占访问,并且清除该处理器对其他任何物理地址的任何独

                                                              占访问标志。然后将该物理地址标记为一个未完成的exclusive访问。

                    如果该物理地址没有共享TLB属性,直接将该物理地址标记为一个未完成的exclusive的访问。        

                          void ldrex32(WORD addr, WORD *data)

                             {   asm("ldrex r2, [r0]");     asm("str  r2, [r1]");   }

STREX表示向存储器储存数据,相当于写操作,

                    如果该物理地址没有共享TLB属性,如果该执行处理器中有一个已标记未访问完成的exclusive操作时,STREX会进行储存,result返回0。

                                                                 如果该执行处理器无一个已标记未访问完成的exclusive操作时,STREX不会进行储存,result返回1。

                    如果该物理地址有共享TLB属性,如果该执行处理器中有一个已标记独占访问的未访问完成的exclusive操作时,STREX会进行储存,

                                                                 result返回0。

                                                              如果该执行处理器中无一个已标记独占访问的未访问完成的exclusive操作时,STREX不会进行储存,

                                                                 result返回1。

                          void strex32(WORD addr, HALF data, WORD *result)

                             {   asm("strex r3, r1, [r0]");     asm("str  r3, [r2]");   }

                                      

AXI中的memory attribute属性,由AxCache信号来指定,0-3bit分别代表Bufferable,Cacheable,Read Allocate,Write Allocate。

    AxCache[0],Bufferable,只针对写操作,表示interconnect,或者其他类似component,可以先返回resp,之后再

        写向final distination。

    AxCache[1],1) 与RA,WA配合,控制cache;

           2) 表示transaction的属性,可以在中间被更改,对于write操作,很多的write操作可以进行merge。

                                对于read操作,表示该地址可以被prefetch。       

    AxCache[2],Read之后更新到cache line中。

    AxCache[3],Write的时候,cache line中也保存最新的值。            

原文地址:https://www.cnblogs.com/-9-8/p/4654294.html