-
[컴퓨터구조] ARM - WFI & WFE공학/컴퓨터구조 2023. 9. 4. 17:40
글의 참고
- https://developer.arm.com/documentation/ka001283/latest/
- https://developer.arm.com/documentation/101051/0002/Signal-descriptions/Event-signals
- https://stackoverflow.com/questions/27188807/arm-sleep-mode-entry-and-exit-differences-wfe-wfi
- https://zenn.dev/junkawa/articles/fuchsia-zircon-spinlock-arm64
- https://blog.csdn.net/xy010902100449/article/details/126812552
- http://www.wowotech.net/armv8a_arch/wfe_wfi.html
- https://blog.csdn.net/wangquan1992/article/details/124837620
- https://tinylab.org/arm-wfe/
-
글의 전제
- 밑줄로 작성된 글은 강조 표시를 의미한다.
- 그림 출처는 항시 그림 아래에 표시했다.
글의 내용
- WFI 및 WFE
" ARM에서는 저전력 모드(`low-powe standby state`)를 지원하기 위해 `WFI`와 `WFE` 명령어를 지원한다. `low-powe standby state` 에서는 대부분의 clock들이 gate-off 되서 전력 소비를 줄인다. 두 명령어의 차이는 CPU가 STANDBY 모드에서 어떻게 탈출하는 조건이 다르다.
- WFI
" `Wat For Interrupt`의 약자로 해당 명령어를 실행하면, ARM 코어는 즉각적으로 STANDBY 모드로 들어가게 된다. 이 상태에서는 SoC에 wakeup interrupt 라고 설정된 인터럽트를 통해서만 wakeup 할 수 있다. `WFI` 명령어는 주로 `cpuidle` 에서 사용한다.
WFI is targeted at entering either standby, dormant or shutdown mode, where an interrupt is required to wake-up the processor.
- 참고 : https://developer.arm.com/documentation/ka001283/latest/- WFE
" `Wait For Event`의 약자로 멀티 프로세서에 최적화된 명령어다. 주로, 공유 자원에 대해 여러 CPU들이 접근하려고 할 때, spin-lock을 통해서 짧은 시간동안 `busy-waiting`을 하게된다. 근데, 사실 이건 리소스 낭비다. 이 때, 전력 소비를 줄이기 위해 자원을 기다려야 하는 CPU-B는 `WFE` 명령어를 실행해서 `STANDBYWFE` 상태로 진입시킨다.
" 시간이 흐르고, 자원을 점유하고 있던 CPU-A가 작업을 완료했다. 그러면, CPU-A는 자원을 다 사용했다는 것을 다른 모든 CPU 들에게 알리기 위해 `SEV` 명령어를 실행한다. `SEV` 명령어가 실행되면, 모든 `STANDBYWFE` 상태에 있던 CPU 들은 일제히 wakeup 해서 해당 공유 자원을 다시 경쟁하게 된다. 이 때, `SEV` 명령어를 실행한 CPU-A의 TXEV 라인이 CPU-B의 RXEV 라인과 하드웨어적으로 연결되어 있다. 그래서, CPU-A에서 `SEV` 명령어를 실행하면 `TXEV` 라인에 시그널이 발생해서 CPU-B의 `RXEV` 라인에 전달되는것이다.
A usage for WFE is to put it into a spinlock loop. Where a CPU wants to access a shared resource such as shared memory, we can use a semaphore flag location managed by exclusive load and store access. If multiple CPUs are trying to access the resource, one will get access and will start to use the resource while the other CPUs will be stuck in the spinlock loop. To save power, you can insert the WFE instruction into the loop so the CPUs instead of looping continuously will enter STANDBYWFE. Then the CPU who has been using the resource should execute SEV instruction after it has finished using the resource. This will wake up all other CPUs from STANDBYWFE and another CPU can then access the shared resource.
- 참고 : https://developer.arm.com/documentation/ka001283/latest/
The Send Event instruction, see SEV, causes an event to be signaled to all processors in a multiprocessor system. The mechanism used to signal the event to the processors is implementation defined. The Send Event instruction generates a wakeup event.
The Send Event instruction is available to both unprivileged and privileged code.
- 참고 : https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Wait-For-Event-and-Send-Event?lang=en#CIHHCDHG" 그리고, 각 CPU 코어는 싱글 비트로 구성된 `이벤트 레지스터`를 가지고 있다. 이벤트 레지스터의 비트가 SET 이면, 현재 자신에게 이벤트가 도착했다는 뜻이다. 그리고, 이 말은 해당 CPU 코어가 `WFE` 명령어를 실행했을 때, suspend 상태로 진입하지 못한다는 것이다. 이 때, 실행된 `WFE` 명령어는 이벤트 레지스터의 비트를 CLEAR 하고 즉각적으로 리턴된다.
" 만약, 이벤트 레지스터가 CLEAR 되어있다면, WFE 명령어를 실행했을 때 suspend 동작을 수행해서 `low-power-mode(STANDBYWFE)`로 들어갈 수 있다. 그리고, 이 상태는 CPU 코어가 WFE wakeup event 혹은 reset 을 감지하기 전까지 계속 유지된다.
https://developer.arm.com/documentation/ddi0433/c/signal-descriptions/signal-descriptions/standby-and-wait-for-event-signals" `WFE` 명령어는 arm64에서 주로 `spinlock`을 구현할 때 사용한다.
1. 공유 자원 FREE
2. Core-1 공유 자원에 접근 -> LOCK 획득 성공.
3. Core-2 공유 자원에 접근 -> LOCK 획득 실패 -> WFE 명령어 실행
4. Core-1 LOCK 해제 -> SEV 명령어 실행 -> Core-2 wakeup
5. Core-2 공유 자원에 접근 -> LOCK 획득 성공- SEVL [참고1 참고2]
" 위에서 SEV 는 모든 CPU 를 wakeup 한다고 했다. 그에 반해, SEVI 명령어는 `Send event locally` 의 약자로 Local CPU 에게만 Event 를 전달한다. event register 는 각 PE 에 대응하는 비트를 가지고 있다. 각 비트가 SET 될 경우, 그에 대응하는 PE 는 event 처리를 할 필요가 있다. SEV 및 SEVI 명령어는 event register 의 비트를 SET 한다.
'공학 > 컴퓨터구조' 카테고리의 다른 글
[ARM] sec - Trustzone (0) 2023.10.02 [컴퓨터 구조] ARM - Power Control System Architecture(PCSA) (0) 2023.09.20 [컴퓨터 구조] Soft(Warm) reset(reboot) vs Hard(Cold) reset(reboot) (1) 2023.08.15 Boot ROM (0) 2023.08.13 [컴퓨터 구조] Cache (0) 2023.08.12