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을 사용하라.
'Embedded Linux' 카테고리의 다른 글
임베디드 리눅스 개발 환경 분석 (0) | 2015.12.21 |
---|---|
임베디드 리눅스 구성요소(BSP) (0) | 2015.12.21 |
임베디드 플랫폼<2> 운영체제 (0) | 2015.12.21 |
임베디드 플랫폼<1> 마이크로 프로세서 (0) | 2015.12.19 |
임베디드 플랫폼 (0) | 2015.12.19 |