지식 노리터/코딩 삽질하기

COFF 란 무엇인가?

노리터 곰집사 2010. 2. 3. 12:01
반응형
프로그래머블한 반도체를 사용하여 간단한 프로그램을 돌려보기 위해서는
그 프로그램을 어셈블 하여 오브젝트 파일을 만든 다음
실행 가능한 파일로 만드는 단계를 거쳐야만 한다.(프로그램이라기 보다 펌웨어라고 하는게 맞겠다)

실제로 프로그램을 실행 시키는 과정에서의 COFF와 링커에 대해 알아보자.

COFF(Common Object File Format)는 수많은 프로그램들을 하나로 합쳐 메모리에 옮기는 과정에서
매우 복잡하고 많은 시간을 요구하는 등의 문제점을 개선하기 위해 미국 AT&T사에서 고안해 낸
규칙이다. 즉, 어셈블러를 거쳐서 만들어진 오브젝트 파일에서 공통된 성질의 것들만을 따로 모아서
관리하는 포맷이라 할 수 있다.
여기서 공통된 성질의 것들은 섹션이라 부르는데, 어셈블리와 c 언어가 사용하는 섹션이 따로 정해져 있다.
각각의 섹션에 따라 프로그램 메모리 혹은 데이터 메모리에 저장된다.
프로그램 명령어 코드나 상수처럼 시스템에 전원이 인가되지 않은 상태에서도 값을 보존해야 하는 섹션들은
비휘발성 메모리인 플래시 메모리에, 변수는 휘발성 메모리인 RAM에 위치하게 된다.
사용자가 임의로 정한 섹션을 사용자 정의 섹션이라고 하는데, 초기화 된 섹션은 플래시 메모리에.
초기화 되지 않은 섹션은 RAM에 저장한다.

또 C2XX 코어에서는 프로그램 메모리상의 0x0000~0x003F 영역에 특정 위치에 존재하는 분기구문인 인터럽트 벡터를 저장하고 있다.
예를들어 ‘B START’와 같은 분기 구문이 있다면 이것이 리셋 벡터로, 인터럽트 벡터의 종류 중 하나 이다.
그러나 TMS320C2000에서 24계열에는 칩 내부에 데이터 메모리로 할당 된 플래시 메모리가 없으므로,
프로그램 메모리에 있는 플래시 메모리에 저장한 다음 리셋 직후 플래시 메모리에서 데이터 메모리에 있는 RAM으로 복사하는 방식으로 동작하게 된다.

COFF 규칙은 프로그램 개수에 상관없이 프로그램을 몇 개의 섹션으로 구분하는 것이기 때문에,
프로그램이 수천개라 할지라도 공통된 섹션으로 분류하면 대 여섯 개에 불과해져 프로그램의 구성 요소 측면에서 본다면 간단해진다.

다음으로, 오브젝트 파일을 실행 가능한 파일로 만드는 것이 링커이다.
COFF 규칙으로 만들어진 오브젝트 파일의 주소를 메모리에 배치시켜 실행 가능한 COFF 형태의 파일로 만드는 것인데, 링커의동작을 위해서는 링커 커맨더 파일이 필요하다.
링커 커맨더 파일은 메모리 자원 정의, 섹션의 배치와 방법 기술. 이렇게 두 개의 부분으로 구성되어 있다. ‘PAGE 0’은 프로그램 메모리를, ‘PAGE 1’은 데이터 메모리임을 알려주며,
각 섹션이 배치된 메모리의 영역과 크기도 알 수 있다. 링커는 오브젝트 파일과 링커 커맨더 파일을 입력 받아서 출력으로 .out 파일을 만들어 내고, 옵션으로 .map 을 만들어 낸다. 링커의 동작에서는 메모리의 위치 정보가 가장 중요한 내용이므로, 작성된 프로그램이 어셈블리인가 아니면 c 언어인가에 따른 링커 옵션 설정 또한 중요한 부분이다.


반응형