STR learning

/*STR learninghtml

*write by chen00.xi @11.19linux

*/緩存

 

1.   involved Arm instructions:

MSR /MRS/CPS:app

 

程序狀態寄存器指令1ide

1.MRS 程序狀態寄存器到通用寄存器的數據傳送指令性能

格式:MRS{<cond>} <Rd>,CPSR/SPSR;編碼

功能:用於將程序狀態寄存器的內容傳送到目標寄存器Rd中。spa

當進入中斷服務程序或進程切換時,該指令可用來保存當前狀態寄存器的值。unix

例如:orm

MRS R0,CPSR

;狀態寄存器CPSR的值存入寄存器R0中

 

程序狀態寄存器指令2

2.MSR 通用寄存器到程序狀態寄存器的數據傳送指令

格式:MSR{<cond>} CPSR/SPSR_<field>,<op1>;

功能:用於將寄存器Rd的值傳送到程序狀態寄存器中。

當退出中斷服務程序或進程切換時,該指令可用來恢復狀態寄存器的值。

操做數op1能夠是通用寄存器或當即數。

<field>:用來設置狀態寄存器中須要操做的位。

32位的狀態寄存器能夠分爲4個域:

位[31:24]爲條件標誌位域,用f表示。

位[23:16]爲狀態位域,用s表示。

位[15:8]爲擴展位域,用x表示。

位[7:0]爲控制位域,用c表示。

例如:MSR CPSR_f,R0

;用R0的值修改CPSR的條件標誌域

MSR CPSR_fsxc,#5; CPSR的值修改成5

 

3.CPS

用於更改:

(1) One or more of the CPSR.{A,I,F} interrupt mask bits.

 (2) CPSR.M mode field.

若是在 User Mode下執行,則不起做用,至關於NOP指令.

  指令格式:

         CPS<effect> <iflags>{,#<mode>}

         CPS #<mode>

   <effect> :

IE -> Enable Interrupt

ID -> Disable Interrupt

若是過<effect>域指定了,則影響的CPSR位,由<iflags>指定.

  <iflags> :

a -> 設置A bit

i  -> 設置I bit

f -> 設置F bit

      <mode> :指定目標Mode的編碼.

 

 

 

 

DMB/DSB/ISB:

DMB

數據內存屏障可做爲內存屏障使用。 它可確保會先檢測到程序中位於 DMB 指令

前的全部顯式內存訪問指令,而後再檢測到程序中位於 DMB 指令後的顯式內存

訪問指令。 它不影響其餘指令在處理器上的執行順序。

option 的容許值爲:

SY 完整的系統 DMB 操做。 這是缺省值,能夠省略。

ST 存儲完成後纔可執行的 DMB 操做。

ISH 僅對內部可共享域執行的 DMB 操做。

ISHST 只有當存儲完成後纔可執行的 DMB 操做,而且只對內部可共享域

執行。

NSH 只可完成於統一點的 DMB 操做。

 

DSB

數據同步屏障是一種特殊的內存屏障。 只有當此指令執行完畢後,纔會執行程

序中位於此指令後的指令。 當知足如下條件時,此指令纔會完成:

位於此指令前的全部顯式內存訪問均完成。

 位於此指令前的全部高速緩存、跳轉預測和 TLB 維護操做所有完成。

option 的容許值爲:

SY 完整的系統 DSB 操做。 這是缺省值,能夠省略。

ST 存儲完成後纔可執行的 DSB 操做。

ISH 僅對內部可共享域執行的 DSB 操做。

ISHST 只有當存儲完成後纔可執行的 DSB 操做,而且只對內部可共享域

執行。

NSH 只可完成於統一點的 DSB 操做。

NSHST 只有當存儲完成後纔可執行的 DSB 操做,而且只會完成於統一

點。

OSH 僅對外部可共享域執行的 DSB 操做。

OSHST 只有當存儲完成後纔可執行的 DSB 操做,而且只對外部可共享域

執行。

 

 

ISB

指令同步屏障可刷新處理器中的流水線,以便在 ISB 指令完成後,才從高速緩

存或內存中提取位於該指令後的全部其餘指令。 這可確保提取時間晚於 ISB 指

令的指令可以檢測到 ISB 指令執行前就已經執行的上下文更改操做(例如更改

ASID 或已完成的 TLB 維護操做、跳轉預測維護操做以及對 CP15 寄存器所作的

全部更改)的執行效果

 

此外,ISB 指令可確保程序中位於其後的全部跳轉指令總會被寫入跳轉預測邏

輯,其寫入上下文可確保 ISB 指令後的指令都可檢測到這些跳轉指令。 這是指

令流可以正確執行的前提條件。

option 的容許值爲:

SY 完整的系統 ISB 操做。 這是缺省設置,能夠省略。

 

 

總之:

DMB: 數據存儲器隔離;

DSB: 數據同步隔離,比DMB嚴格。

ISB: 指令同步隔離,最嚴格:會清洗流水線,以保證全部它前面的指令都執行完畢以後

 

WFE/WFI:

 

SDM/STM:

LDM 批量數據加載指令
格式:
LDM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:從一片連續的內存單元讀取數據到各個寄存器中,內存單元的起始地址爲基址寄存器Rn的值,各個寄存器由寄存器列表regs表示。
該指令通常用於多個寄存器數據的出棧。
type字段種類:
IA:每次傳送後地址加1。
IB:每次傳送前地址加1。
DA:每次傳送後地址減1。
DB:每次傳送前地址減1。
FD:滿遞減堆棧。
ED:空遞減堆棧。
FA:滿遞增堆棧。
EA:空遞增堆棧。
注意:有一個約定,編號低的寄存器在存儲數據或者加載數據時對應於存儲器的低地址。

                       

 

STM 批量數據存儲指令
格式:STM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:將各個寄存器的值存入一片連續的內存單元中,內存單元的起始地址爲基址寄存器Rn的值,各個寄存器由寄存器列表regs表示。
該指令通常用於多個寄存器數據的入棧。
{^}:指示指令所用的寄存器爲用戶模式下的寄存器。
其餘參數用法同LDM指令。
例如:
STMEA R13!,{R0-R12,PC}
;將寄存器R0~R12以及程序計數器PC的值保存到R13指示的堆棧中

 

 

總結:

 

 

stmdb   sp!, {fp, ip, lr, pc} //sp=sp-4,sp=pc;先壓PC

                               //sp=sp-4,sp=lr;再壓lr

                               //sp=sp-4,sp=ip;再壓ip

                               //sp=sp-4,sp=fp;再壓fp

 ldmia   sp, {fp, sp, pc}      //和stmdb成對使用,

                               //fp=sp,sp=sp+4;先彈fp

//sp=sp,sp=sp+4;先彈sp,此處的彈出不會影響sp,由於ldmia是一個機器週期執行完的。

                               //pc=sp,sp=sp+4;先彈pc

 

 

2.   involved register

secure cpu 和normal cpu,resume時恢復寄存器:

 

CPU0,2,3

CPU1

 

NSACR

 

SCR

 

SWD_CPSR

TTBR0

TTBR0

DACR

DACR

VBAR

VBAR

MVBAR

MVBAR

MONITOR_SP_OFF

MONITOR_SP_OFF

SVC_SP_OFF

SVC_SP_OFF

SCTLR

SCTLR

ACTLR

ACTLR

NWD_PC

NWD_PC

 

 

SCR 設置一次:

這樣作的緣由是由於, 當前只考慮了,只有cpu1才能進入到swd的狀況,resume以後,恢復cpu1的swd狀態,而並不須要考慮cpu0,2,3的swd狀態。

 

 

 

 

 

 

 

Banked 寄存器:

 

 

 

 

 

NSACR/ACTLR/SCR也是banked的????

 

 

3.   MMU/CACHE

TLB:

經過使用一個高速、容量相對較小的存儲器來存儲近期用到的頁表條目(段、大頁、小頁、極小頁描述符),避免每次地址轉換都到主存中查找,這樣就大幅提升性能。這個存儲器用來幫助快速地進行地址轉換,成爲轉譯查找緩存(Translation Lookaside Buffers, TLB)

當CPU發出一個虛擬地址時,MMU首先訪問TLB。若是TLB中含有能轉換這個虛擬地址的描述符,則直接利用此描述符進行地址轉換和權限檢查,不然MMU訪問頁表找到描述符後再進行地址轉換和權限檢查,並將這個描述符填入TLB中,下次再使用這個虛擬地址時就直接使用TLB用的描述符。

使用TLB須要保證TLB中的內容與頁表一致,在啓動MMU以前,頁表中的內容發生變化後,尤爲要注意。通常的作法是在啓動MMU以前使整個TLB無效,改變頁表時,使所涉及的虛擬地址對應的TLB中條目無效。

PS. 代碼中: invalidateUnifiedTLB

Cache

Cache有如下兩個操做:

②   」清空「(clean):把Cache或Write buffer中已經髒的(修改過,但未寫入主存)數據寫入主存

②」使無效「(Invalidate):使之不能再使用,並不將髒的數據寫入主存。

 

通常狀況下, 系統內置了指令Cache(ICaches)、數據Cache(DCaches)、寫緩存(Write buffer),須要用到描述符中的C位(Ctt)和B位(Btt)

1)指令Cache(ICaches)

系統剛上電或復位時,ICaches中的內容是無效的,而且ICaches功能關閉。往Icr位(CP15協處理器中寄存器1的第12位)寫1能夠啓動ICaches,寫0中止ICaches

ICaches通常在MMU開啓後使用,此時描述符的C位用來表示一段內存是否能夠被Cache。若Ctt=1,容許Cache,不然不容許。若是MMU沒有開啓,ICaches也能夠被使用,此時CPU讀取指令時所涉及的內存都被當作容許Cache

ICaches關閉時,CPU每次取指都要讀取主存,性能低,因此一般儘早啓動ICaches

ICaches開啓後,CPU每次取指時都會先在ICaches中查看是否能找到所用指令,而無論Ctt是0仍是1。若是找到成爲Cache命中,找不到稱爲Cache丟失,ICaches被開啓後,CPU的取指有以下三種狀況:

①Cache命中且Ctt爲1時,從ICaches中取指,返回CPU

②Cache丟失且Ctt爲1時,CPU從主存中取指,而且把指令緩存到Cache中

③Ctt爲0時,CPU從主存中取指

2)數據Cache(DCaches)

與ICaches類似,系統剛上電或復位時,DCaches中的內容無效,而且DCaches功能關閉,Write buffer中的內容也是被廢棄不用的。往Ccr位(CP15協處理器 中寄存器1的第二位)寫1啓動DCaches,寫0中止DCaches。Write buffer和DCaches緊密結合,額米有專門的控制來開啓和中止它

與ICaches不一樣,DCaches功能必須在MMU開啓以後才能被使用。

DCaches被關閉時,CPU每次都去內存取數據。

DCaches被開啓後,CPU每次讀寫數據時都會先在DCaches中查看是否能找到所要的數據,無論Ctt是0仍是1,找到了成爲Cache命中,找不到成爲Cache丟失。

經過下表可知DCaches和Write buffer在Ccr,Ctt,Btt各類取值下,如何工做,Ctt and Ccr 意爲 Ctt與Ccr進行邏輯與後的值

 

使用Cache時須要保證CacheWrite buffer的內容和主存內容一致,保證下面兩個原則:

①清空DCaches,使主存數據獲得更新

②使無效ICaches,使CPU取指時從新讀取主存

在實際編寫程序時,要注意以下幾點:

①   開啓MMU前,使無效ICaches,DCaches和Write buffer

②關閉MMU前,清空ICaches、DCaches,即將」髒「數據寫到主存上

③若是代碼有變,使無效ICaches,這樣CPU取指時會重新讀取主存

④使用DMA操做能夠被Cache的內存時,將內存的數據發送出去時,要清空Cache;將內存的數據讀入時,要使無效Cache

⑤改變頁表中地址映射關係時也要慎重考慮

⑥開啓ICaches或DCaches時,要考慮ICaches或DCaches中的內容是否與主存保持一致

⑦對於I/O地址空間,不使用Cache和Write buffer

 

 

http://www.cnblogs.com/hpunix/articles/98635.html

http://www.linuxidc.com/Linux/2011-09/43526p4.htm

 

 

 

 

 

 

 

8.Other

 

Changing from Secure to Non-secure state

Monitor mode is provided to support switching between Secure and Non-secure states. Except in Monitor mode and

Hyp mode, the security state is controlled by the SCR.NS bit. Software executing in a Secure PL1 mode can change

the SCR, but ARM strongly recommends that software obeys the following rules for changing SCR.NS:

• To avoid security holes, software must not:

— Change from Secure to Non-secure state by using an MSR or CPS instruction to switch from Monitor

mode to some other mode while SCR.NS is 1.

— Use an MCR instruction that writes SCR.NS to change from Secure to Non-secure state. This means

ARM recommends that software does not alter SCR.NS in any mode except Monitor mode. ARM

deprecates changing SCR.NS in any other mode.

• The usual mechanism for changing from Secure to Non-secure state is an exception return.To return to

Non-secure state, software executing in Monitor mode sets SCR.NS to 1 and then performs the exception

return.

相關文章
相關標籤/搜索