디지털보드

프로세서의 메모리 맵 그리고 디바이스 트리

망고토마토 2023. 1. 14. 12:43
반응형

본 글은 ARM coretex A72 코어를 가지고 있는 프로세서의 메모리 맵에 대한 글이다.

 

보통 메모리 맵이라는 단어를 보면, 나는 프로세서에 연결된 SDRAM 메모리의 ?, 메모리의 주소를 떠올랐다.

 

하지만  프로세서는 SDRAM 뿐만 아니라, GPIO, PCIe, 메모리 컨트롤러, ROM 등 여러가지 모듈과 연결 될 수 있다.

 

프로세서 내부에는 다음과 같은 모듈들이 서로 연결되어 있다.

 

프로세서는 내부 모듈 뿐만 아니라 프로세서와 외부적으로 연결되는 모듈 또한 제어할 수 있어야 한다.

 

이를 위해 모듈에 대한 설정 또는 제어를 위해,  프로세서는 주소표를  가지고 있다. 

 

프로세서 내부 메모리에 모듈 또는 기능 별로 주소가 배정되어 있다.

 

주소표가 프로세서의 메모리 맵이다. 

 

다음 그림은 ARM coretex A72 코어를 가지고 있는 프로세서 데이터 시트에 적혀있는 메모리 맵이다.  

 

 

주소표 중 주목할 주소는 

1. CCSR (Internal Configuration, Control, and status register) 

2. DCSR(Internal Configuration, Control, and status register) 

3. External memory, I/O, configuration address spaces of the PCI Express links

이다. 

 

프로세서는 physical address(real)만 이용하여 모듈을 제어하는 것이 아니다. 

Logical address, Virtual address라는 개념을 이용하여 모듈을 제어 한다. 

cortex A72 코어 내부에는 MMU(Memory Management Unit)이 있다. 

MMU는 logical address를 virtual address로 변환, 그리고 최종적으로 physical address(for local address space)로 변환하는 역할을 한다. 

 

* local address 는 cortex A72 코어가 메모리나 I/O space를 접근할 때, 코어가 바라보는 physical address를 의미한다. 

 

◎ DDR Remapping , 프로세서 외부에 연결된 DDR SDRAM 저장공간의 주소에 대한 접근은 어떻게 하는가? 

프로세서 외부에 연결된 DDR(double datarate sdRAM) 메모리에, 프로세서의 어떤 모듈이 접근할까?

프로세서 내부의 DDR controller다. DDR controller는 DDR 메모리에 읽고 쓰기를 수행한다.

 
프로세서는 외부에 연결된 DDR 메모리의 접근을 대비하여 프로세서 내부 메모리에 DRAM용 주소표를 마련해 두었다.  

 

DDR controller DRAM용 주소표가
프로세서 외부에 연결된 DDR 메모리의 주소에 어떻게 연결되어 있는지를 알고 있다. 
프로세서 내부 메모리의 DRAM용 주소표는  다음과 같다. DRAM region1, 2,  3라고 표시된 부분이다.

cortex A72 코어의 경우  DRAM region1,2,3 주소는

프로세서 외부에 연결된  DDR SDRAM 메모리 주소에  다음과 같이 mapping이 된다.

 

Chip address가 DRAM용 주소표이며, 

Remmapped DRAM 주소가 DDR SDRAM 메모리의 주소이다. 프로세서 DRAM용 주소표에서 00_8000_0000 ~ 00_FFFF_FFFF가 DDRSDRAM의 00_0000_0000 ~ 00_7FFF_FFFF와 맵핑된다.  

 

◎ CCSR(Internal Configuration, Control, and Status Register) address map

cortex A72 코어는 CCSR 용도로 240MByte 크기의 주소를 배정하였다.
 
데이터 시트의 프로세서 메모리 맵 부분을 읽으면
 
처음에 DDR 메모리의 remappingCCSR address map에 대해서 먼저 언급한다.
 
데이터 시트는 왜?? 프로세서의 메모리 맵의 다양한 주소 중에 왜 하필 CCSR address map에 대해서
먼저 언급을 하였는가?란 의문이 들었다.   
 
CCSRInternal Configuration, Control, and Status Register를 의미한다.  
 
CCSR 주소를 통해 프로세서 내부에 있는 모듈을 주로 제어 할수 있기 때문에 데이트 시트에서도 CCSR 주소를 많이 언급하고 있는 것 같다.
 
데이트시트를 보는 사용자도 CCSR 주소를 많이 볼 것으로 예상된다.
 
커널의 디바이스 트리는 프로세서 내부모듈에 대한 설정을 적는 파일이다.
파일을 읽어보면 모듈 마다 주소값들이 적혀 있다.
 
이 주소 값이  데이터 시트의 CCSR에 배정된 주소 값들과 일치한다.
 
예를 들면
 
- DDR memory controller의 CCSR 주소표, 디바이스트리
 
 

ddr: memory-controller@1080000

{  compatible = "fsl,qoriq-memory-controller"; 

reg = <0x0 0x1080000 0x0 0x1000>;

  interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>; 

big-endian;  };

- SPI의 CCSR 주소표, 디바이스트리

  dspi: spi@2100000

{  compatible = "fsl,ls1021a-v1.0-dspi";

  #address-cells = <1>; 

#size-cells = <0>;  reg = <0x0 0x2100000 0x0 0x10000>; 

interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;  clock-names = "dspi";  clocks = <&clockgen 4 1>; 

spi-num-chipselects = <5>;  big-endian;  status = "disabled";  };

 

- I2C의 CCSR 주소표, 디바이스트리

i2c0: i2c@2180000 { 

compatible = "fsl,vf610-i2c", "fsl,ls1046a-vf610-i2c"; 

#address-cells = <1>; #size-cells = <0>; reg = <0x0 0x2180000 0x0 0x10000>; 

interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clockgen 4 1>; 

dmas = <&edma0 1 39>,  <&edma0 1 38>; dma-names = "tx", "rx"; 

scl-gpios = <&gpio3 12 0>; status = "disabled"; }; 

 

i2c1: i2c@2190000 { 

compatible = "fsl,vf610-i2c"; 

#address-cells = <1>; #size-cells = <0>; reg = <0x0 0x2190000 0x0 0x10000>;

interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clockgen 4 1>;

status = "disabled";  };

 

i2c2: i2c@21a0000 {

compatible = "fsl,vf610-i2c";#address-cells = <1>;#size-cells = <0>;

reg = <0x0 0x21a0000 0x0 0x10000>;interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;

clocks = <&clockgen 4 1>;status = "disabled";  };

 

i2c3: i2c@21b0000 { 

compatible = "fsl,vf610-i2c", "fsl,ls1046a-vf610-i2c"; #address-cells = <1>; 

#size-cells = <0>; reg = <0x0 0x21b0000 0x0 0x10000>;

interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;

clocks = <&clockgen 4 1>; scl-gpios = <&gpio3 12 0>; status = "disabled";  };

 

- GPIO의 CCSR 주소표, 디바이스트리

  gpio0: gpio@2300000

{  compatible = "fsl,qoriq-gpio";  reg = <0x0 0x2300000 0x0 0x10000>;  interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;  gpio-controller;  #gpio-cells = <2>;  interrupt-controller;  #interrupt-cells = <2>;  }; 

gpio1: gpio@2310000

{  compatible = "fsl,qoriq-gpio";  reg = <0x0 0x2310000 0x0 0x10000>;  interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;  gpio-controller;  #gpio-cells = <2>;  interrupt-controller;  #interrupt-cells = <2>;  }; 

gpio2: gpio@2320000

{  compatible = "fsl,qoriq-gpio";  reg = <0x0 0x2320000 0x0 0x10000>;  interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;  gpio-controller;  #gpio-cells = <2>;  interrupt-controller;  #interrupt-cells = <2>;  }; 

gpio3: gpio@2330000

{  compatible = "fsl,qoriq-gpio";  reg = <0x0 0x2330000 0x0 0x10000>;  interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;  gpio-controller;  #gpio-cells = <2>;  interrupt-controller;  #interrupt-cells = <2>;  };

 

- DUART의 CCSR 주소표, 디바이스트리

  duart0: serial@21c0500

{  compatible = "fsl,ns16550", "ns16550a";  reg = <0x00 0x21c0500 0x0 0x100>;  interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;  clocks = <&clockgen 4 1>;  status = "disabled";  }; 

duart1: serial@21c0600

{  compatible = "fsl,ns16550", "ns16550a";  reg = <0x00 0x21c0600 0x0 0x100>;  interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;  clocks = <&clockgen 4 1>;  status = "disabled";  };

 

# dmesg | grep tty

를 쳐보면

 

반응형