1. ELF

ARM에서는 Linux 마찬가지로 ELF 파일을 실행파일로 간주하고 실행한다. Firmware 파일을 EFL파일로만들어서 ARM 위에서 실행할 있도록 만들어야 한다.

 

ELF파일을 만들기 위해서는 .c파일, 어셈블리파일을 gcc컴파일러를 통해 컴파일하고 .o파일을 만든다.

그리고 링커를 통해서 .o파일을 ELF파일로 만들면 된다. 이는 C코드 컴파일및 바이너리 파일을 생성하는 과정과 같다.

 

여기서 ELF 리눅스, ARM에서 모두 실행파일로써 역할을 진행할 있으나 ARM에서 실행하는 ELF 리눅스에서 실행할 수는 없다. 이러한 이유는 OS에서 ELF 구조 미리 정의된 라이브러리를 다르게 가지고있기 때문에 ARM target하여 만들어진 ELF 리눅스에서 분석 실행이 어렵다(안드로이드 실행파일이 리눅스에서 실행되지 않는 이유 하나일 )

 

결과적으로 정리하면 Firmware 만드는데있어 ARM에서 실행가능한 ELF파일의 생성이 필요하고 이를 위해서 어셈블리 혹은 C 만든 후에 gcc 컴파일 링커 스크립트 작성을 통한 ELF파일 생성 과정이 필요하다.

 

1) 링커

링커는 .o파일들을 모아서 바이너리 ELF파일을 생성하는 역할을 진행한다.

여기서 정상적인 실행파일이 되기 위해서는 각각의 메모리영역이 set되어야 한다. 예를들어 코드내용을 저장하는 .text, 그리고 초기화되지 않은 전역변수들을 저장한 .bss, data들을 저장한 .data

ELF 파일에는 위와같이 .text, .bss, .data 등의 메모리 영역이 구분되어져있다. 그리고 링커에서는 ELF파일을 만들기위해 메모리영역을 set해주도록 링커스크립트를 작성해야 한다.

 

2. ARM H/W 읽기

ARM H/W값은 SYS_ID 레지스터에 저장하며 해당 레지스트리 주소 값은 0x10000000이다.

해당 주소의 값을 읽으면 ARM H/W 고유값을 얻어올 있다.

SYS_ID 위와 같이 이루어진 레지스터이다. MSB부터 LSB까지 Rev부터 FPGA값을 나타내고 32bit 4byte 값을 나타낸다.

 

위 레지스터의 bit값이 의미하는바는 위와 같다.

 

  • ref

http://recipes.egloos.com/5011946

https://developer.arm.com/documentation/100122/0100/Programmers-Model/APB-system-registers/SYS-ID-Register

+ Recent posts