2/14/2022

ESP32 의 Memory 구성-3 (External Memory-1)

1. ESP32의 External Memroy 구성 


ESP32 System Map 구성 

ESP32의 System에서 봤듯이 각 CPU가 External Memory로 접근하기위해서는 Cache와 MMU를 걸쳐 함께동작한다. 

ESP32 Internal Memory 구성 

Manual을 읽다보면, 상위 Cache가 거의 External Memory MMU로 사용되어지는 것 같으며, 우선적으로 Cache 와 MMU에 대해 알아보자. 

1.1 ESP32 의 Cache 구조 

  • 2-way set associative Cache
ESP32 Core(Xtensa LX6 CPUs)가 Harvard Architecture로 구성되어 I/D Cache로 분리되어 구성 
Cache는 2-way set associative Cache 방식이며, Cache에서 IMMU 와 DMMU로  Mapping하는 구조로 파악(이부분은 확인)  

  • n-Way Set-Associative Cache 설명 
MMU를 걸쳐 Memory에서 직접 Mapping하여 사용하는 방법 

  • CPU와 Cache 구조 
각 CPU가 External Memory를 접근하기 위해서는 PRO/APP_CACHE_ENABLE의 설정필요하며,  
SRAM0의 POOL0/1(32KB/32KB) 연결되어 Cache 동작됨  



https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf


상위 Cache를 설정하는 Regstier로 각 CPU마다 존재 
  • DPORT_PRO_CACHE_CTRL_REG/DPORT_APP_CACHE_CTRL_REG
  1. DPORT_PRO_DRAM_HL :   External SRAM Virtual Address(R/W)
  2. DPORT_PRO_DRAM_SPLIT: External SRAM Virtual Address(R/W)
  3. DPORT_PRO_SINGLE_IRAM_ENA : External Flash(R/W) , XiP 사용할것으로 추측 
  4. DPORT_PRO_CACHE_ENABLE : 상위 Instruction BUS 이용 

https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf




각 독립적 구성도 가능하지만, 아래와 같이 MUX를 변경하여 Dual CPU의 Cache공유도 가능
CACHE_MUX_MODE
  1. SRAM의 Cache POOL0 (32kB)
  2. SRAM의 Cache POOL1 (32kB)
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf


상위 64KB는 PRO/APP MMU Cache 이며, Pool0/1 이며, SRAM0에 존재 
  1. SPI Flash의 경우 64KB가 필요 
  2. SPI RAM의 경우 32KB가 필요 

참고로, 개인적으로 이 Cache가 폰 노이만( Von Neumann architecture) 방식으로 생각되어지며, 하버드 아키텍쳐(harvard architecture) 방식은 아닌 것 같다.
이유는 ARM or Intel처럼 Harvard Architecture라면, 분명 Cache에 Pipeline과 Hit/Miss등 다양한 기능이 있어야 하고, 
HW Decoder도 Instruction에는 있어야 하는데?? 그래서 상위와 같이 용어도 PooL라고 한 것 같은데, 어쨋든 이건 나의 개인생각과 추측이다.
추후에 Xtensa에 대해 ABI와 각 ISA자료를 보면 알겠지?? 


SMP로 하려면 참 복잡하겠다고 생각되며, 각 MUX MODE가 중요할 것 같으며, PSRAM을 사용하면, Cache는 필수다. 


1.2. ESP32의 MMU 기능 및 비교  

  • ARM MMU의 구조와 비교 
Core(Cache) -> MMU의 TLB(Translation Lookaside Buffer) -> Memory 
거의 비슷하지만, ESP32의 경우는 Multilevel은 지원이 안되는 것 같다. 

  • MMU(Memory Management Unit)/MPU(Memory Protection Unit)
MMU의 기본기능은 Virtual Address를 도입하여, Address Mapping(virtual/physical address 변환)하여 
메모리에서 실행 가능한 코드 보다 더 큰 코드를 실행가능하게 하는 것이다. 
이외 MMU의 기능으로 Address Mapping을 하여, Memory Map IO 에서 주소변환 쉽게하여 주소확장, 이외 DRAM Contol 및 다른 부가 기능이 있지만,
ESP32의 경우 가장 기본기능만 갖추어지만, 기존과 좀 다르게 동작하므로 좀 세심하게 봐야할 것 같다. 

ESP32의 MMU/MPU에서 Page Mapping 까지 지원되며, 2/4/8KB 이며, Instruction/Data를 구분하여 지원하며, 추후 Linux도 사용가능할 것 같다  
ESP32의 경우, Linker Script에서 직접 Mapping하는 것으로 보임 

  • ESP32 Internal Memory 와 MMU/MPU 
Internal Memory를 위한 MMU 이며,아래와 같이 SRAM0/1 128KB로 제한적으로 사용되어진다.

https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf



  • MMU와 MPU
  1. SRAM0 MMUInstruction /128KB = 8KB x 16 Pages
  2. SRAM2 MMUData /128KB = 8KB x 16 Pages
  3. Static MPU:  Memory Protection (PID 0/1 즉 Core만 접근가능)
  4. RTC FAST MPU: MPU기능 (PID0~7 가능) 
  5. RTC SLOW MPU: MPU기능 (PID0~7 가능) 
 
** RTC FAST 경우 Aliases는, RTC FAST 8KB인데, 이를 IRAM/DRAM Address Map확장.
** SRAM1 경우 Aliases  SRAM0/2에서 Address Map을 확장용도.(아래에서 다시설명)  




2. ESP32 MMU for Internal Memory 


SRAM0/2 중 128KB식 Bus Type으로 IRAM/DRAM 구분되어 구성 각 MMU는 전체 16Page로 구성하고 있다.  
Virtual 과 Physical을 아래와 같이 각 Page 단위 직접 Mapping하는 방식

SRAM2의 DRAM용 D-MMU의 예제 
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf


  • SRAM0/2 MMU의 Size 와 Page 구성 
  1. SRAM0 I-MMU:  전체 사이즈 128KB = 16Page x 8K 설정시 최대사용 (2/4/8KB) 
  2. SRAM2 D-MMU:  전체 사이즈 128KB = 16Page x 8K 설정시 최대사용 (2/4/8KB) 

  • SRAM0/2 MMU의 Address Map (PageSize:2/4/8KB)
  1. SRAM0 I-MMU: 0x40080000 + (pagesize ∗ n) to 0x40080000 + (pagesize ∗ (n + 1) − 1)
  2. SRAM2 D-MMU: 0x3FFC0000 + (pagesize ∗ n) to 0x3FFC0000 + (pagesize ∗ (n + 1) − 1)

  • 실제 적용되는 것은 아래 Register 들
  1. DPORT_DMMU_TABLEn_REG 
  2. DPORT_IMMU_TABLEn_REG

  • SRAM0/2 MMU for Internal Memory 사용목적
내 개인생각으로 보면, 사용목적은 지금까지 두가지 추측하지만 실제 왜 사용하는지 궁금하다. 

SRAM1의 확장사용방법 (추측-1) 
SRAM0/2에서 SRAM1을 확장하여 사용할때 사용할 것 같다.  
그 근거로 상위 SRAM0 MMU 와 SRAM2 MMU의 위치가 뒷 부분에 위치해서 그렇게 생각하는데, 아닌것 같기도 하다.  
  1. SRAM0은 Instruction Bus 용이므로 SRAM1(128KB) Mapping하여 확장
  2. SRAM2은 Data Bus용이므로 SRAM1(128KB) Mapping하여 확장 

SRAM0/2의 효율적인 Memory사용(추측-2) 
효율적인 SRAM0/2의 사용목적으로 예를들면, Memory 공간낭비를 최소화하고, Page 교환방식을 적용하여, SRAM에서의 크기 보다 더 큰 프로그램 실행목적 
혹은 효율적으로 Memory를 사용  


3. ESP32 MMU for External Memory

Cache MMU와 연결되어 동작되어진다고 하며, 상위의 Internal MMU 비슷하게 동작한다고 한다. 
다만 차이는 아래와 같이 Page Size가 각각 고정되어 사용되어진다.
 
  • Cache MMU (External Memory)의 Page Size
  1. SPI-Flash의 Page Size:  64KB (상위 2개 Cache 사용할것 같음)
  2. SPI-RAM의 Page Size:  32KB (상위 1개 Cache 사용할것 같음)

  • External Memory의 Range
  1. SPI-Flash의 Range:  4MB = 64KB  x  64  (Page quantity)
  2. SPI-RAM의 Range:  4MB = 32KB  x  128 (Page quantity) 
SPI-RAM의 경우 256으로 확장하여 8MB 까지 가능한걸로 보인다. 

  • Cache/Cache MMU의 역할 
상위 Page Size는 Cache MMU 즉, Cache Size 기반으로 어떻게 Mapping하느냐가 될 것 같다.

  • External Memory의 Virtual Address
MMU 의 Virtual Address 라고하는데, 그냥 Mapping 수준으로 보이며, 다만 Core가 두개이다 보니 각각 나누어서 접근하도록 설계를 했다. 
V Addr RAM을 보면, 사용법이 복잡하며, 대충 이해하기로만 했다. 
  1. V Addr 0~1: SPI Flash 이지만, PID0/1 , 즉 두개 Core만 접근허용 
  2. V Addr 2~3: SPI Flash 이지만, PID 2~7, 주로 DAM와 다른 디바이스들 
  3. V Addr RAM: SPI RAM의 경우 Cache 설정에 따라 다양하게 사용가능 (Manual 참조)

https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf