임베디드에서 ARM 빌드하는 경우 자주 사용하는 scatter file에 대해서 간단하게 알아보도록 하겠습니다.
ARM Scatter file의 목적과 예제, scatter-loading
Scatter File이란?
Scatter file은 ARM 컴파일러에서 메모리 배치를 정의하는 파일입니다. 임베디드 시스템 개발에서는 제한된 메모리 자원을 효율적으로 활용하기 위해 코드와 데이터를 특정 메모리 영역에 배치해야 하는 경우가 많습니다. Scatter file은 이러한 메모리 배치를 설정하는 데 사용됩니다.
ARM Linker는 scatter file에 정의된 지침을 따라 코드, 데이터, 스택, 힙 등을 적절한 메모리 영역에 배치합니다. 이를 통해 개발자는 하드웨어 특성에 맞는 메모리 관리와 성능 최적화를 수행할 수 있습니다.
아래는 ARM 공식 사이트에서 제공하는 Load and execution memory maps입니다.
아래와 같이 load과 실제 execution 메모리맵을 구성하도록 도와주는 파일이 scatter file입니다.
Scatter File의 주요 구성 요소
Scatter file의 문법은 간단하며, 주로 아래와 같은 요소로 구성됩니다. ; 표시는 주석 처리로 무시하게 됩니다.
- Load Region: 데이터를 어디에 로드할지 지정합니다.
- Execution Region: 실행 중에 데이터를 어디에서 접근할지 정의합니다.
- Section: 코드와 데이터를 분류합니다.
LOAD_ROM 0x0000 0x8000 ; Name of load region (LOAD_ROM),
; Start address for load region (0x0000),
; Maximum size of load region (0x8000)
{
EXEC_ROM 0x0000 0x8000 ; Name of first exec region (EXEC_ROM),
; Start address for exec region (0x0000),
; Maximum size of first exec region (0x8000)
{
* (+RO) ; Place all code and RO data into
; this exec region
}
SRAM 0x10000 0x6000 ; Name of second exec region (RAM),
; Start address of second exec region (0x10000),
; Maximum size of second exec region (0x6000)
{
* (+RW, +ZI) ; Place all RW and ZI data into
; this exec region
}
}
1. LOAD_ROM
- 역할: 메모리 로드 영역.
- 시작 주소: 0x0000.
- 크기: 0x8000 (32KB).
- 설명: 실행 영역(EXEC_ROM과 SRAM)을 포함하는 최상위 로드 영역입니다.
2. EXEC_ROM
- 역할: 실행 영역으로 실행 코드와 읽기 전용(RO) 데이터를 포함.
- 시작 주소: 0x0000.
- 크기: 0x8000 (32KB).
- 섹션: * (+RO) — 모든 읽기 전용 섹션(. text,. rodata 등)이 배치됨.
3. SRAM
- 역할: 실행 중 데이터가 배치되는 영역. 읽기/쓰기 데이터(RW)와 초기화되지 않은 데이터(ZI)를 포함.
- 시작 주소: 0x10000.
- 크기: 0x6000 (24KB).
- 섹션: * (+RW, +ZI) — 쓰기 가능한 전역/정적 변수(.data)와 초기화되지 않은 변수(.bss) 섹션이 배치됨.
Scatter file의 활용
일반적으로 scatter file은 아래와 같은 목적으로 활용하기 위해 정의해서 사용합니다.
- 메모리 최적화: 제한된 메모리 공간을 효과적으로 분배하여 안정성을 높일 수 있습니다.
- 특정 메모리 영역 제어: 외부 장치와의 통신이나 특수 목적 메모리를 활용할 때 유용합니다.
- 보안: 민감한 데이터를 별도 메모리 영역에 배치하여 접근을 제어할 수 있습니다.
또한 이렇게 배치된 결과를 map 파일로 출력해서 확인해 볼 수 있습니다.
결론
오늘은 ARM 컴파일러에서 빌드 시 사용할 수 있는 scatter file에 대해서 알아보았습니다.
다양한 사용방법과 규칙이 정해져 있지만 사실 그렇게 복잡하게 사용하는 경우는 많이 없습니다. 따라서 기본적인 룰과 개념에 대해서 이해하신 다음 실제 구현되어 있는 예제들을 몇 번 찾아보시면 충분하고, 각자 개발하시는 환경에 맞게 수정해서 사용하시면 될 것 같습니다.
아래 사이트를 주로 참고하시면 도움이 될 것 같습니다.
https://developer.arm.com/documentation/dui0474/f/using-scatter-files?lang=en
'개발 > 개발 공통' 카테고리의 다른 글
포트 포워딩(Port Forwarding)에 대해서 (0) | 2024.11.22 |
---|---|
[LLM] LangChain, RAG를 위한 유용한 프레임워크 (1) | 2024.11.21 |
[LLM] ChatGPT와 프롬프트 엔지니어링 (1) | 2024.11.20 |
[LLM] LLM의 문제점과 극복하기 위한 RAG에 대해서 (21) | 2024.11.20 |
[데이터베이스] SQL과 NoSQL의 차이에 대해서 (1) | 2024.11.18 |