먼저, 이 글의 카테고리를 Linux로 할지, 아니면 ARM 으로 할지 고민이었다. 리눅스에서 제공하는 서비스이긴 하지만, 현재 내가 사용중인 Xilinx ZCU216 의 Cortex-R5 환경에서 적용할 수 있기 때문이다.

Xilinx Zync UltraScale+ RFSoC Block Digagram

 

그래도 리눅스의 기능 중 하나이니깐, 우선 Linux로 카테고리하자.

 

리눅스 커널 문서에서 Remote Processor Framework 에 대한 내용이다.

링크 -> https://docs.kernel.org/staging/remoteproc.html

 

주요 내용의 번역 내용은 다음과 같다.

remoteproc 프레임워크는 하드웨어 차이점을 추상화하면서 다양한 플랫폼/아키텍처가 원격 프로세서를 제어(전원 켜기, 펌웨어 로드, 전원 끄기)할 수 있도록 합니다. 이렇게 하면 전체 드라이버를 복제할 필요가 없습니다. 또한 이 프레임워크는 이러한 종류의 통신을 지원하는 원격 프로세서를 위해 rpmsg virtio 장치를 추가합니다. 이로써 플랫폼별 remoteproc 드라이버는 몇 가지 저수준 핸들러만 제공하면 되고, 모든 rpmsg 드라이버는 작동합니다(virtio 기반 rpmsg 버스 및 드라이버에 대한 자세한 내용은 Remote Processor Messaging(rpmsg) 프레임워크를 참조하십시오). 이제 다른 유형의 virtio 장치도 등록할 수 있습니다. 펌웨어는 지원하는 virtio 장치 유형을 게시하기만 하면, remoteproc이 해당 장치를 추가합니다. 이를 통해 최소한의 개발 비용으로 기존 virtio 드라이버를 원격 프로세서 백엔드와 재사용할 수 있습니다.

 

AMP Asymmetric Multiprocessing 환경 (ZCU216은 Cortex-A53 + Cortex-R5) 에서 원격 프로세서 Cortex-R5를 제어한다. 펌웨어 바이너리 파일 elf 를 로드할 수 있고, rpmsg 기능을 이용해 IPC (Inter-Processor Communication) 를 사용할 수 있다.

 

아래는 remoteproc에 대한 ChatGPT 가 정리한 내용이다.

 

Linux의 /sys/class/remoteproc 디렉터리는 Remote Processor Framework(Remoteproc)와 관련된 정보와 설정을 제공하는 가상 파일 시스템입니다. Remoteproc은 다중 코어 시스템에서 보조 프로세서(remote processor)를 관리하기 위한 Linux 커널 서브시스템입니다. 이를 통해 메인 프로세서(예: ARM Cortex-A53)가 보조 프로세서(예: ARM Cortex-R5, DSP 등)의 상태를 제어하거나 통신할 수 있습니다.


Remoteproc이란?

  • Remote Processor Framework는 메인 프로세서(주로 Linux가 실행 중인 코어)가 보조 프로세서를 부팅, 중지 및 관리할 수 있도록 도와주는 시스템입니다.
  • 주로 SoC(System on Chip) 환경에서 사용됩니다. 예: Xilinx Zynq UltraScale+ MPSoC.
  • 보조 프로세서에서 실행할 펌웨어를 관리하고, 필요하면 Inter-Processor Communication(IPC)을 통해 데이터 교환을 지원합니다.

/sys/class/remoteproc 디렉터리의 역할

  1. 보조 프로세서 상태 확인:
    • 현재 보조 프로세서의 실행 상태(부팅됨, 중지됨 등)를 확인할 수 있습니다.
  2. 보조 프로세서 관리:
    • 펌웨어를 로드하고 보조 프로세서를 시작하거나 정지시킬 수 있습니다.
  3. 디버깅 지원:
    • 보조 프로세서의 디버깅 정보를 제공.

주요 파일 및 디렉터리

/sys/class/remoteproc/ 내부에는 보조 프로세서를 나타내는 디렉터리(예: remoteproc0, remoteproc1)가 포함됩니다. 각 디렉터리에는 해당 보조 프로세서와 관련된 파일이 포함됩니다.

예: /sys/class/remoteproc/remoteproc0

파일 이름설명

state 보조 프로세서의 상태 (offline, running).
firmware 보조 프로세서에서 실행할 펌웨어 파일 이름 (*.elf, *.bin).
name 보조 프로세서의 이름.
trace 보조 프로세서의 트레이스 출력 (디버깅 시 사용).
recovery 오류 발생 시 복구 동작 여부 설정.
power/autosuspend_delay_ms 자동 정지 지연 시간(밀리초).

Remoteproc 동작 흐름

  1. 펌웨어 로드
    • /sys/class/remoteproc/remoteproc0/firmware에 보조 프로세서에서 실행할 펌웨어 이름을 설정합니다.
    • 펌웨어는 일반적으로 /lib/firmware/ 디렉터리에 저장됩니다.
  2. 보조 프로세서 시작
    • /sys/class/remoteproc/remoteproc0/state 파일에 start를 쓰면 보조 프로세서를 부팅합니다.
    echo start > /sys/class/remoteproc/remoteproc0/state
    
  3. 보조 프로세서 정지
    • /sys/class/remoteproc/remoteproc0/state 파일에 stop을 쓰면 보조 프로세서를 중지합니다.
    echo stop > /sys/class/remoteproc/remoteproc0/state
    
  4. 상태 확인
    • /sys/class/remoteproc/remoteproc0/state를 읽어서 현재 상태를 확인합니다.
    cat /sys/class/remoteproc/remoteproc0/state
    # 출력 예: running
    

Remoteproc 사용 예시

보조 프로세서 부팅

  1. 펌웨어 파일이 /lib/firmware/에 존재하는지 확인:
  2. ls /lib/firmware/ # 예: my_remoteproc_firmware.elf
  3. 펌웨어 이름 설정:
  4. echo "my_remoteproc_firmware.elf" > /sys/class/remoteproc/remoteproc0/firmware
  5. 보조 프로세서 시작:
  6. echo start > /sys/class/remoteproc/remoteproc0/state
  7. 상태 확인:
  8. cat /sys/class/remoteproc/remoteproc0/state # 출력: running
  9. 보조 프로세서 중지:
  10. echo stop > /sys/class/remoteproc/remoteproc0/state

Remoteproc과 VirtIO

Remoteproc은 보조 프로세서와 메인 프로세서 간 통신을 지원하기 위해 VirtIO 또는 RPMsg를 사용할 수 있습니다.

  • VirtIO: 메인 프로세서와 보조 프로세서 간의 데이터 교환을 가상화.
  • RPMsg: Remoteproc을 기반으로 보조 프로세서와 메시지를 교환.

디버깅

  • 보조 프로세서의 트레이스 로그를 확인하려면:
  • cat /sys/class/remoteproc/remoteproc0/trace
  • 커널 로그를 통해 Remoteproc의 상태를 확인:
  • dmesg | grep remoteproc

주의사항

  1. 펌웨어 호환성:
    • 보조 프로세서에서 실행할 펌웨어는 대상 아키텍처에 맞게 컴파일되어야 합니다.
    • 잘못된 펌웨어를 실행하면 오류가 발생할 수 있습니다.
  2. 펌웨어 파일 경로:
    • 펌웨어는 /lib/firmware/ 디렉터리에 있어야 합니다. 그렇지 않으면 Remoteproc이 펌웨어를 로드하지 못합니다.
  3. 상태 변경 시 권한:
    • /sys/class/remoteproc/ 파일에 값을 쓰기 위해 관리자 권한(sudo)이 필요합니다.

결론

  • /sys/class/remoteproc는 보조 프로세서의 부팅, 중지, 상태 확인을 제어하는 인터페이스를 제공합니다.
  • 이를 통해 멀티프로세서 환경에서 효율적으로 보조 프로세서를 관리하고 디버깅할 수 있습니다.
  • Remoteproc은 Xilinx ZCU216과 같은 SoC 플랫폼에서 실시간 프로세서(Cortex-R5)나 DSP 코어를 제어할 때 자주 사용됩니다.

'Linux' 카테고리의 다른 글

E: Unable to locate package lz4c  (0) 2025.04.18
Ubuntu 22.04 고정 IP 설정을 동적 IP 설정으로 변경  (0) 2025.04.11
my vimrc  (0) 2025.01.14
DTB 파일 이란?  (0) 2025.01.14
동적 IP 설정 & 네트워크 인터페이스 이름 변경  (0) 2025.01.02

+ Recent posts