ARMv8 Load/store 지침 학습 중요 노트
5949 단어 【ARMv8】
STNP Xt1, Xt2, [base,#imm]
Store Non-temporal Pair (extended): stores two doublewords from Xt1 and Xt2 to memory addressed by
base+imm, with a non-temporal hint.
이 지령은 은밀한 의미(hint)를 가지고 있으며 외부 메모리를 직접 저장하고cache를 거치지 않으며 다른 지령은cache를 거친다.
이 명령은 이 주소가 한 번만 불러오는 것을 확인하고 캐시를 터치할 필요가 없으며 자료가 갱신되지 않도록 하고 성능을 최적화시키는 데 사용됩니다.
레지스터 --> 캐시 (1 레벨/2 레벨) --> 메모리
2、Load-Store Unprivileged
LDTRSB Xt, [base,#simm9]
Load Unprivileged Signed Byte (extended): loads a byte from memory addressed by base+simm9, then sign-extends it into Xt, using EL0 privileges when at EL1
EL0/EL1의 메모리에는 서로 다른 권한 제어가 있는데 이 명령은 EL0의 권한으로 접근하여 EL0의 행위를 모의하는 데 사용된다.
EL1과 EL0 사이의 상호 작용에는 사용해야 합니다.
3、Load-Store Single Register (unscaled offset)
LDUR Xt, [base, #simm9]//예를 들어 이것은 메모리 주소base+#simm9에서 두 글자 데이터를 Xt로 읽는 것이고 #simm9은 -256~+256의 직접적인 정수에 속한다.
본질은 하나의 상량을 곱하는지 여부이다. 왜냐하면scaled는 항상 하나의 상량을 곱해서 정렬할 수 있기 때문에unscaled는 필요없고 얼마든지 있으면 인류의 자연적인 이해에 더욱 부합된다.
4. Load-store Exclusive(독점)
STXP Ws, Xt, Xt2, [base{,#0}]
Store Exclusive Pair (extended): stores two doublewords from Xt and Xt2 to memory addressed by base, and sets Ws to the returned exclusive access status.
----두 글자 데이터 Xt, Xt2를 메모리 주소(base)에 쓰고 Ws를 되돌아오는 독점 접근 상태로 설정합니다
다중 핵 CPU에서 한 주소에 대한 접근은 충돌을 일으킬 수 있다. 이 지령은 충돌을 해결하고 원자성(원자 조작이란 중단될 수 없는 조작)을 확보한다. 이것은 여러 개의 CPU가 같은 메모리 주소에 접근하여 충돌을 초래하는 메커니즘을 해결하는 것이다.
예를 들어 두 개의 CPU가 동시에 쓰이면 그 중 하나인 Ws가 실패 값을 되돌려줍니다.
보통 자물쇠에 사용됩니다. 예를 들어spinlock,
다음 코드를 볼 수 있습니다:arch/arm64/include/asm/spinlock.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static
inline
void
arch_read_lock(arch_rwlock_t *rw)
{
unsigned
int
tmp, tmp2;
asm
volatile
(
" sevl
"
"1: wfe
"
"2:
ldaxr
%w0, %2
"
" add %w0, %w0, #1
"
" tbnz %w0, #31, 1b
"
"
stxr
%w1, %w0, %2
"
" cbnz %w1, 2b
"
:
"=&r"
(tmp),
"=&r"
(tmp2),
"+Q"
(rw->lock)
:
:
"cc"
,
"memory"
);
}
static
inline
void
arch_read_unlock(arch_rwlock_t *rw)
{
unsigned
int
tmp, tmp2;
asm
volatile
(
"1:
ldxr
%w0, %2
"
" sub %w0, %w0, #1
"
"
stlxr
%w1, %w0, %2
"
" cbnz %w1, 1b
"
:
"=&r"
(tmp),
"=&r"
(tmp2),
"+Q"
(rw->lock)
:
:
"cc"
,
"memory"
);
}
5、Load-Acquire/Store-Release
메모리 장벽:
1. Data Memory Barrier (DMB, non-blocking inst)
1.DMB는 이 명령 이전의 모든 메모리 접근이 끝날 것을 보증하며, 이 명령 이후에 발생하는 메모리 접근은 이 명령 실행이 끝난 후에만 시작할 수 있습니다
2.다른 비메모리 접근 명령은 무작위로 실행할 수 있습니다
2.
Load-Acquire (
함유
Acquire 의미 읽기 작업
)
1.단방향으로 뒤로 향하는 장벽과 같다(반 DMB)
▪이 명령이 끝난 후에만 메모리 접근을 시작할 수 있습니다
1.
Store-Release (
Release 의미가 있는 쓰기 작업
)
1.단방향으로 앞으로 향하는 장벽과 같다(반 DMB)
▪이 명령 이전의 모든 메모리 접근이 끝난 후에 실행될 것을 보장합니다
1.Load-Acquire/Store-Release 명령을 사용하면 DMB를 절약하고 코드를 최적화하는 데 도움이 됩니다.
1. Data synchronization Barrier (DSB, block inst)
1.DSB는 DMB보다 엄격하게 명령이 실행되기 전의 모든 명령이 종료됨을 보증합니다.
2. Instruction Synchronization Barrier (ISB, blocking inst)
1. Flush pipeline
• ISB 이후 명령 취소 cache/memory
• 이전 명령 실행 완료
1.ISB 이후에 context 전환 관련 작업이 적용될 수 있도록 보장
• ASID 수정
• TLB/branch predictor maintenance 작업 수행
• 기타 CP15 레지스터 변경 작업
-- 본질은 난서 집행 중 의존관계가 있는 지령이 정확한 논리에 따라 집행될 수 있는 메커니즘을 해결하기 위한 것이고 DMB, DSB, ISB의 강제성(권한)은 낮음에서 높음으로
DMB는 메모리 접근 명령 장벽만 사용합니다.
DSB관의 모든 명령 장벽
ISB 명령 이후의 pipeline은 모두 flush에 의해 떨어지고memory에서 다시 손가락을 뽑습니다.
DMB의 경우
ADD X1,X2,X3 -----(A)
LDR X4,addr -----(B)
STR X6,addr2
DMB -----(DMB)
LDR X5,addr3 -----(C)
STR X7,addr4
SUB X8,X9,#2
...
이상(C)은 반드시 (B) 집행이 완료된 후에야 집행할 수 있다. (DMB)의 장벽 작용이 있기 때문에 (A)는 메모리 접근 지령에 속하지 않고 다른 지령과 의존 관계가 없기 때문에 (DMB) 장벽을 넘어 순서대로 집행할 수 있다.
한편, load-acquire/store-release와 결합하면 반 개의 DMB 명령으로 이해할 수 있다.load-acquire는memory만 읽고store-release는memroy만 쓴다. 조합 사용은 코드의 유연성과 집행 효율을 높일 수 있다.