https://blog.csdn.net/xujianqun/article/details/80618499
arch/arm/include/asm/io.h
#define ioremap(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define ioremap_nocache(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define ioremap_wc(addr, size) __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
#define ioremap_wt(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define iounmap __iounmap
ioremap_nocache - 把內存映射到CPU空間
phys_addr 要映射的物理地址
size 要映射資源的大小
ioremap_nocache
平台相關的操作使得CPU可以通過readb/readw/readl/writeb/writew/writel等IO函數進行訪問。
返回的地址不保證可以作為虛擬地址直接訪問。
ioremap確保這些內存在CPU是不可緩沖的,如同PCI總線上現存的緩沖規則一樣。此時在很多總線上仍有其他的緩沖和緩存。ioremap_nocache用於確保每次數據都寫到內存中
版權聲明:本文為CSDN博主「JianqunXu」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xujianqun/java/article/details/80618499
https://www.cnblogs.com/-9-8/p/8427402.html
在armv8中,由於processor的預取,流水線, 以及多線程並行的執行方式,而且armv8-a中,使用的是一種weakly-ordered memory model,
不保證program order和execute order一致。
所以有時需要顯式的執行一些指令,來order自己的代碼。
armv8涉及到的優化包括:
1) multiple issue of instructions,超流水線技術,每個cycle,都會有多個issue和execute,保證不了各個指令的執行order。
2) out-of-order execution,很多processor,都會對non-dependent的指令,做out-of-order的執行,
3) Speculation,分組預測,在遇到conditional instruction時,判斷condition之前,就會執行之后的instruction。
4) Speculative loads,預取,在執行上一條指令的同時,將下一條指令的數據,預取到cache中。
5) Load and Store optimizations,由於寫主存的latency很大,processor可以做很多優化,write-merge,write-buffer等。
6) External memory systems,某些外部device,像DRAM,可以同時接受不同master的req,Transaction可能會被buffered,reordered。
7) Cache coherent multi-core,一個cluster中的各個core,對同一個cache的update,看到的順序不會是一致的。
8) Optimizing compilers,編譯器在編譯時的性能優化,可能打亂program order。
armv8支持的memory types:Normal memory和Device memory
Normal memory,主要指RAM,ROM,FLASH等memory,這類memory,processor以及compiler都可以對program做優化,
processor還可以增加repeate,reorder,merge的操作。
在需要固定memory order的情況下,需要顯式調用barrier operations,
還有一些存在address dependence的情況,processor必須能夠正確處理這些情況。
Device memory,通常都是peripheral對應的memory mapped。對於該memory type,processor的約束會很多;
1) write的次數,processor內部必須與program中的相同;
2) 不能將兩次的writes,reads,等效為一個;
3) 但是對於不同的device之間的memory access是不限制order的;
4) speculative是不允許的,對device的memory;
5) 在device memory中execute,也是不允許的;
Device memory的幾個attribute:
1) Gather或者non-Gather,多個memory access merge為同一個single transaction,如兩個byte write merge為一個halfword write
2) Reordering,同一個block中的access是否能夠reorder。
3) Early Write Ack,write不寫入device,通過中間buffer之后,即 return ack,是否可以。
四種device memory:
1) Device nGnRnE,最嚴的約束;
2) Device nGnRE,允許early
3) Device nGRE,允許reorder,early
4) Device GRE,允許gather,reorder,early
Memory attribute,arm系統中,memory都被分為各個region,每個region都有自己的privilege level,memory type,cache policy;
這部分的管理是由MMU,來實現的,各個region都對應其中的一個或幾個block、page。
對於normal memory,有shareable和cache property;
對於device memory,總是non-cacheable,outer-shareable,
shareable,用來指定這個location是否是與其他的core,共用的,share的。share的core之間需要保證coherency。
non-shareable,典型應用在AMP,有自己的獨自cache,
inner,主要指processor自己的cache,在big-little中,表現為一個cluster,(還是取決於具體實現)
outer,主要指processor外的cache,在big-little中,表現為兩個cluster,(還是取決於具體實現)
system,整個system的master,可能會包含GPU等
ARM架構中,包括幾個barrier instruction,用來force一定的memory order,但是這樣的指令,會減小一些軟件的優化性能;
所以最好在需要的時候,再加這樣的指令。
1) Instruction Synchronization Barrier(ISB),保證當前的pipeline中沒有數據,ISB指令之前的指令都已經執行結束;
多用在context-switching code,cache control等。
2) Data Memory Barrier(DMB),保證所有data access的指令,load,store,在DMB指令之前都已經執行結束。
並不妨礙instruction的fetch。
3) Data Synchronization Barrier(DSB),等待某一類的指令結束,包括data access,instruction fetch。還會等待所有的
由該processor發起的cache,tlb,BP maintenance操作都已經完成,
DSB指令會直接stall processor,DMB不會,instruction仍然是可以執行的。
DMB和DSB,都可以加params,指定某些domain,load/store,
store-store,load-load,any-any指相應的亂序類型。
one-way barriers,AARCH64提供了一組顯式指定before、after的指令,Load-Acquire,Store-Rlease,
Load-Acquire(LDAR),所有的load,store,完成之后,才開始執行,LDAR之后的指令開始執行。
Store-Release(STLR),所有的load,store,在STLR執行之后,才開始執行。