빌드 중 제목과 같은 메시지의 에러가 발생했다. 에러메시지의 전체 라인은 다음과 같다.

/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ./scripts/corstone1000_m3.ld:169 cannot move location counter backwards (from 000000002000d324 to 0000000020004000)

이 에러에 대해 ChatGPT에 물어보니 문제는 다음과 같았다.

링커 스크립트에서 메모리 주소를 잘못 설정

좀더 자세히 살펴보자.

먼저, location counter라고 하는 변수가 있다. 이 변수의 역할은 링커가 메모리 상에서 섹션들이 배치되는 위치를 추적한다. 링커는 링커 스크립트에 나와있는 대로 섹션들을 배치하려고 한다. 여기서 메모리 주소 문제가 발생했는데, 이미 배치되어 있는 섹션에서 다음 주소로 location counter가 이동해서 배치해야 되는데 다시 뒤로 이동한게 문제였던 것이다.

문제가 된 코드는 다음과 같다.

    .privileged_data :
    {
        . = ALIGN(4);       /* 4byte align */
        _sdata = .;        /* Create a global symbol at data start. */
        *(privileged_data)
        . = ALIGN(4);
        FILL(0xDEAD);
        /* Ensure that un-privileged data is placed after the region reserved
            * for privileged kernel data. */
        /* Note that dot (.) actually refers to the byte offset from the start
            * * of the current section (.privileged_data in this case). As a result,
            * * setting dot (.) to a value sets the size of the section. */
        . = __privileged_data_region_size__;
    } >RAM AT> FLASH /* 이 섹션의 실제 위치는 RAM, but 초기값을 flash에 저장, 실행 시 starup 코드에서 RAM으로 복사  */

여기서 링커는 privileged_data 섹션을 배치했고, 에러 메시지와 같이 주소 000000002000d324 를 location counter가 가리키게 된다. 그럼 다음 섹션은 000000002000d324 이후에 배치해야되는 것이 맞는데, 다시 0000000020004000으로 이동하라는 스크립트가 있다. 이 부분이다.

. = __privileged_data_region_size__; /* __privileged_data_region_size__ = 16K; */

location counter는 위 스크립트에 따라 0000000020004000 으로 이동하고, 결국 에러가 발생했다.

해결방법은 간단하다.

privileged_data_region_size 사이즈를 좀 더 늘리는 것이다. 그럼 섹션 배치 이후 location counter가 다시 뒤로 돌아가지 않아도 된다.

# ifconfig 설치
리눅스를 설치하고 ifconfig 를 실행하면 아래와 같이 에러 메시지가 출력된다.

실행 환경: Ubuntu 22.04

```
Command 'ifconfig' not found, but can be installed with:
sudo apt install net-tools
```
아, 그럼 net-tools 패키지를 설치하면 되겠거니 하고, 설치 명령어를 실행한다.
```
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package net-tools is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'net-tools' has no installation candidate
```

해결 방법은 apt (Advanced Package Tool) 의 DB를 업데이트 하는 것이다.

( 아래 링크 참고 -> https://askubuntu.com/questions/14685/what-does-package-package-has-no-installation-candidate-mean)

```
$ sudo apt-get update
```

다시 net-tools 를 설치하면 잘 설치된다.

Error

python3-distutils 를 설치하려고 하니, 유효하지 않은 패키지라는 메시지가 출력된다.

Package python3-distutils is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source

해당 패키지는 deprecated됐고, 다른 패키지로 대체가 가능하다.
출처는 다음과 같다.
출처: https://stackoverflow.com/questions/78438738/how-to-install-python3-distutils-on-ubuntu-24-04

Solution

Ubuntu 24.04 기준 아래 명령어를 실행해보자.

sudo apt install python3-setuptools

다행히 정상적으로 설치가 잘 진행된다.

Error

뭐, 에러까진 아닌 것 같고, en_US.UTF-8 에 종속적인 무언가를 설치하려고 할 때 나오는 메시지같다.

Please make sure locale 'en_US.UTF-8' is available on your system

해결방법은 생각보다 간단하다.

Solution

Ubuntu 24.04 에서 작업 중 위와 같은 에러 메시지가 나오면 간단하게 language-pack-en-base 을 설치한다.

$ sudo apt install language-pack-en-base

Error

python package 관리 툴인 pip3로 install 하려고 하니, 제목과 같은 에러가 발생했다.

뭔가 화려하면서 원색적인 색들로 error에 대한 가이드를 해주는 것 같은데..

뭔가 큰 도움은 안되는 것 같다.

Solution

일단 구글링을 해보면.. 가장 쉽게 따라해볼 만한 방법이 아래 명령어를 실행하는 것이다.

$ python3 -m pip config set global.break-system-packages true

위 출처는 네이버 블로그의 엎질 님의 글인데, 기가 막히게 동작한다.

출처 -> https://blog.naver.com/b14nc4/223418048502

엎질 님께 감사드리며..

Build 하다 혹시 제목처럼 lz4c 패키지를 찾을 수 없다는 메시지가 출력된다면 아래 패키지로 설치를 시도해보자.

lz4

아래 링크를 보면 Ubuntu에서 제공하는 lz4 패키지는 다음과 같다.

링크 -> https://launchpad.net/ubuntu/+source/lz4

  • liblz4-1: Fast LZ compression algorithm library - runtime
  • liblz4-1-dbgsym: debug symbols for liblz4-1
  • liblz4-dev: Fast LZ compression algorithm library - development files
  • lz4: Fast LZ compression algorithm library - tool
  • lz4-dbgsym: debug symbols for lz4

lz4c 패키지 대신 lz4 로 대신 설치를 진행하지 잘 된다.

기존에 설정되어 있는 netplan은 다음가 같다.

 

위 설정을 아래와 같이 작성하여 동적 IP 네트워크를 구성한다.

 

작성한 후 $ sudo netplan try 를 실행하고 변경된 내용을 적용한다.

 

$ ifconfig 를 실행하면 사설 ip 주소로 변경되어 있음을 확인할 수 있다.

 

'Linux' 카테고리의 다른 글

error: externally-managed-environment  (0) 2025.04.21
E: Unable to locate package lz4c  (0) 2025.04.18
Remote Processor Framework  (0) 2025.02.01
my vimrc  (0) 2025.01.14
DTB 파일 이란?  (0) 2025.01.14

먼저, 이 글의 카테고리를 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

내가 사용하는 vim의 설정파일이다.

개인 저장용으로 업로드 함.

 

여기서 vimrc 설명도 적고, 좀 더 수정해야 할 부분이 있으면 수정해보자.

 

일단 ver 0.1 이다.

vimrc
0.00MB

 

Cortex-R5 를 QEMU로 에뮬레이션 하려고 자료를 찾는 도중, DTB 파일이란 내용이 있어 기록한다.

 

DTB(Device Tree Blob) 파일은 디바이스 트리(Device Tree) 데이터를 바이너리 형식으로 저장한 파일입니다. 디바이스 트리는 하드웨어 구성을 설명하는 데이터 구조로, 특히 임베디드 시스템 Linux 커널에서 널리 사용됩니다. DTB 파일은 운영 체제 또는 부트로더가 하드웨어 정보를 동적으로 읽을 수 있도록 설계되었습니다.


디바이스 트리(Device Tree)란?

디바이스 트리는 하드웨어의 구성 요소와 연결 관계를 설명하는 데이터 구조입니다. 하드웨어 정보를 소스 코드에 직접 하드코딩하는 대신, 별도의 데이터 파일로 관리하여 더 유연한 하드웨어 지원을 제공합니다.

디바이스 트리의 역할

  1. 하드웨어 정보 제공:
    • CPU, 메모리, 인터럽트 컨트롤러, 타이머, GPIO, I2C, SPI 등의 구성 정보를 포함.
  2. 커널과 하드웨어 분리:
    • 디바이스 트리를 사용하면 커널을 수정하지 않고도 하드웨어 구성을 변경할 수 있습니다.
  3. 운영 체제 초기화 지원:
    • 커널이 부팅 시 하드웨어 구성을 동적으로 읽어 초기화에 사용.

DTB 파일의 특징

1. DTB 형식

  • **DTB(Device Tree Blob)**는 DTS(Device Tree Source) 파일을 바이너리 형식으로 컴파일한 파일입니다.
  • dtc(Device Tree Compiler)를 사용하여 DTS를 DTB로 변환합니다.

2. DTB 구조

DTB 파일은 트리 형태로 구성되며, 각 노드가 하드웨어 구성 요소를 나타냅니다.

  • 노드(Node):
    • 하드웨어 장치를 나타냅니다.
    • 예: CPU, 메모리, 버스.
  • 속성(Property):
    • 노드에 대한 세부 정보를 정의합니다.
    • 예: 주소, 인터럽트 번호, 클럭 속도.

DTB 파일 생성 과정

  1. DTS 파일 작성:
    • 텍스트 형식의 디바이스 트리 소스 파일을 작성.
    • 예:
      / {
          model = "My Embedded Board";
          compatible = "myboard,v1";
          memory {
              device_type = "ram";
              reg = <0x80000000 0x20000000>;
          };
          cpus {
              cpu@0 {
                  compatible = "arm,cortex-a53";
              };
          };
      };
      
  2. DTC 컴파일:
    • dtc 명령어를 사용해 DTS 파일을 DTB로 컴파일.
    • 예:
      dtc -I dts -O dtb -o myboard.dtb myboard.dts
      
  3. DTB 파일 생성:
    • myboard.dtb 파일이 생성되며, 이를 부트로더 또는 커널에서 사용.

DTB 파일의 사용

1. 부트로더에서 사용

  • U-Boot:
    • U-Boot는 부팅 시 DTB 파일을 로드하여 하드웨어 초기화 정보를 커널에 전달.
    • 명령어 예:
      bootm 0x8000 - 0x10000
      
      • 0x10000: DTB 파일의 메모리 주소.

2. 커널에서 사용

  • Linux 커널은 DTB 파일을 읽어 하드웨어를 초기화.
  • 커널 명령줄에서 DTB 파일 지정:
    bootargs ... dtb=myboard.dtb
    

DTB의 주요 이점

  1. 하드웨어-소프트웨어 분리
    • 디바이스 트리와 커널 코드를 분리하여 유지보수가 쉬움.
  2. 다양한 하드웨어 지원
    • 하나의 커널 이미지로 다양한 하드웨어를 지원 가능.
  3. 동적 하드웨어 초기화
    • 런타임에 필요한 하드웨어 정보를 동적으로 제공.
  4. 커뮤니티 표준
    • ARM 및 RISC-V 아키텍처에서 널리 사용되는 표준.

DTB와 관련된 파일 및 도구

  1. DTS(Device Tree Source):
    • 텍스트 기반 디바이스 트리 파일.
  2. DTB(Device Tree Blob):
    • DTS를 컴파일한 바이너리 파일.
  3. DTC(Device Tree Compiler):
    • DTS 파일을 DTB로 컴파일하거나, DTB 파일을 DTS로 디컴파일.
    dtc -I dtb -O dts -o myboard.dts myboard.dtb
    

결론

DTB 파일은 디바이스 트리를 바이너리 형식으로 저장한 파일로, 임베디드 시스템과 Linux 커널에서 하드웨어 초기화 및 지원을 위한 핵심 역할을 합니다.
이를 통해 커널과 하드웨어 구성을 분리하여 유지보수와 확장성을 크게 향상시킬 수 있습니다. 

+ Recent posts