指令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中也保存最新的值。