Notice
Recent Posts
Recent Comments
Today
Total
05-02 20:39
Archives
관리 메뉴

Jeongchul Kim

임베디드 플랫폼<3> 개발 환경 본문

Embedded Linux

임베디드 플랫폼<3> 개발 환경

김 정출 2015. 12. 21. 18:27

4.1 Tool - Chain 이란?

1. Tool - Chain

리눅스에는 “gcc” 라는 C 컴파일러가 있다. 리눅스에서 gcc 컴파일러로 컴파일할 때 별도의 출력 파일 이름을 지정하지 않으면 a.out이라는 이름으로 생성된다. 생성된 파일은 “실행 가능한 ELF 파일” 타입으로 되어 있다. 즉, UNIX나 Linux에서 gcc로 컴파일하면 무조건 ELF 파일이 생성된다.




> 컴파일 과정(Compile)

텍스트로 되어 있는 소스 코드 파일을 이진 바이너리(Binary) 코드로 변환하는 과정

가장 먼저 실제 컴파일을 진행하기 전에 소스 코드 상에 “#”(전처리기, Preprocessor)으로 처리되어

있는 부분들을 먼저 처리한다.

이후에 처리가 끝나면 C 문법 검사를 하게 된다. 오류가 없다면 이진 바이너리 코드로 변환을 하게
되고 이 때 생성되는 파일이 ELF 타입이다.


  • Relocatable ELF 타입은 스스로 실행이 불가능한 바이너리 파일로 누군가 실행을 시켜줘야 되는
    (= 그래서 메모리에 올라가는(loading) 주소가 재배치(relocatable)되는) 파일이다.
     -> 디바이스 드라이버(Device Driver)가 대표적인 예

  • Executable ELF 타입은 자기 스스로 실행 가능한 파일이다.
     -> PC Windows 상에서의 “Hello.exe” 파일


 > 링킹 과정(Linking)

컴파일 과정을 통해 생성된 Relocatable ELF 파일로는 실행될 수 없으니, 실행되기 위해 필요한

정보들이 여기에 추가되어야 한다는 점. 이 추가 과정을 링킹 이라 한다.

- 링커(Linker) : 링킹 과정에서 자동적으로 정보를 제공.

프로그램이 실행되기 위해서 최소한으로 필요한 메모리 용량까지 알아서 계산해 해당 정보를
CPU 정보와 함께 “어딘가”에 저장 시켜준다.

- 로더(Loader) : 프로그램이 실행될 때 OS에서 사용자 응용 프로그램을 실행시켜 주며, “어딘가”에서
CPU, 메모리 등의 정보를 읽어서 프로그램이 요구한 메모리 용량을 할당 받아

메모리 적재(Loading) 시켜 준다.

- “어딘가” -> “ELF Header”이다.    ELF = ELF Header + ELF Body


main()함수가 사용자 응용 프로그램마다 별도로 있는 Non-RTOS에서 실행되는 파일은 모두 Header+Body의 구성으로 되어 있으며, 로더(Loader)가 Header 정보들을 읽어와 Body 부분을 메모리에 적재 시켜 주는 것이다.


이에 비해 Non-RTOS와 Firmware, RTOS에서 User Applicaton 실행 방식이 다르다.

Non-RTOS(Linux, Windows)는 OS가 먼저 시스템 메모리에 적재되어 실행된 이후 OS가 각 User Application 들을 실행시켜 주게 된다.


그러나 Firmware와 RTOS는 User Application 이 먼저 실행된다. 따라서 컴파일러가 자동적으로 만들어주는 Header 부분은 필요 없으며, 작성한 소스 코드가 변환된 Body만 필요할 뿐이다.


그렇다 해서 Firmware와 RTOS 에서의 컴파일 과정은 다르지 않다.


패키지 종류

설명

Tool - Chain

Compiler

소스 코드를 컴파일하는 역할을 담당.

System Library

링킹 과정에 필요한 라이브러리를 제공.

Binutils

컴파일이 끝난 이진 바이너리(Binary) 파일에 대해 후 처리 작업 담당.


어떤 종류의 소프트웨어이든지 소프트웨어를 개발하기 위해서는 공통적으로 세 가지 종류의 툴(Tool)이 필요하게 되며, 이를 바로 Tool-Chain이라고 한다.


“User Level” -> CPU의 User Mode / “Kernel Level” -> CPU의 Supervisor Mode


두 모드 간 전환은 “소프트웨어 인터럽트(Software Interrupt)에서 일어난다.

시스템 라이브러리(System Library)는 User Application과 Kernel 사이에 위치하여 Application의

요청이 Kernel에게 전달될 수 있도록 도와주는 역할.    ex) Low-Level 함수 : open(), socket()


C 언어 함수 호출 순서 : 선언 -> 정의 -> 호출


Wrapping 함수들은 모두 바이너리-파일 타입으로 되어 있는 System Library 에 정의.


Binutils = Bin + utils 특별한 목적을 위해 컴파일 끝난 실행 파일에 부가적인 처리를 하는 유틸리티들

ex) strip : 불필요한 심볼들을 삭제해주는 유틸리티 / 메모리 용량을 차지하는 불필요한 심볼 제거

   objcopy: 파일의 타입을 변경하는데 사용되는 유틸리티.

4.2 Firmware, RTOS, Non-RTOS

Tool-chain 종류는 매우 다양하다.

Linux에서는 gcc, glibc, binutils (오픈 소스) / Windows에서는 Visual Studio (상용화된 제품)


임베디드 리눅스가 올라가는 CPU인 32비트 ARM 프로세서의 경우 ARM Core 로직(logic)을 개발한 ARM사에서 개발 및 판매하고 있는 RVDS(RealView Development Suite) 제품 사용(상용)


> Tool-Chain 중 어떤 기준으로 선택해야 하는가?

1) 대기업이나 국가 연구소처럼 한 업체(혹은 기관)에서 다루어야 할 CPU 종류가 많을 때에는

  상용 Tool-Chain 제품을 선택하는 게 좋다. 다양한 Tool-Chain 만큼 알아야 할 것(헤더 파일,

  함수 매크로)이 많아 생산성이 떨어진다.

2) CPU 제조사에서 개발한 Tool-Chain 이 있다면 해당하는 Tool-Chain을 선택하는 게 좋다.

3) 기술 지원이 반드시 필요한 경우에는 가급적 상용 Tool-Chain 을 사용하는 것이 좋다.

   공개용 Tool-Chain의 장점은 별도의 구매 비용이 발생하지 않는다. 그로 인해 별도의 기술 지원

   역시 받을 수 없다.

4) 특별한 기준이 없을 때는 가급적 사용자가 많이 선택한 Tool-Chain을 사용하라.


Comments