函數解讀:ioremap / ioremap_nocache / ioremap_wc / ioremap_wt


 

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執行之后,才開始執行。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM