티스토리 뷰

프로젝트/Bootloader

Bootloader - Hex 파일

Just4Fun 2016. 8. 24. 22:13

앞에서 설명한 내용처럼 bootloader 프로그램이 실행되는 CPU의 종류와 상세정보를 획득하였으면, 그 CPU에 맞게 만들어진 실행파일을 UART를 통하여 전달하는 단계를 수행하는 것이 다음 순서이다.

이때 사용되는 파일이 intel사에서 만든 규격인 hex 파일 포맷이다.

Hex 파일은 다음과 같은 모양으로 만들어져 있다.



이러한 hex 파일 포맷 규격은 'Hexadecimal Object File Format Specification'이라는 문서에 자세하게 나와 있다.


위의 표는 문서에서 설명하는 hex 파일 record 포맷에 대한 내용이다.

Hex 파일에 나오는 한줄을 'record'라고 부른다.  이 record가 어떻게 생겼는지 설명해 주고 있는것이다.


Hex 파일을 열어보면 알겠지만 모든 줄의 시작은 ':'로 시작되도록 되어 있다.  그 다음에 나오는 글자 2개, 즉 16진수 1바이트에 해당되는 내용은 record의 길이가 얼마인지 알려준다.  그 다음에 나오는 2바이트 길이의 내용은 Offset 주소값이다.  2바이트 크기이므로 최대 64KB까지의 주소값을 가질 수 있게 된다.

그 다음에 나오는 1바이트 값은 record의 type이 무엇인지 알려준다.

위의 내용처럼 모두 6개의 record type값을 가질 수 있다.

일반적인 데이터 record의 경우 record type이 0으로 되어 있다.  대부분의 record들이 0으로 되어 있는것을 알 수 있다.  즉, 데이터 record 인것이다.

그리고 가장 마지막 record는 record type이 1로 되어 있다.  즉, record가 끝임을 알려주는 것이다.

이미 앞에서 언급했듯이 offset 주소가 2바이트로 되어 있으므로 가질수 있는 최대 주소값이 64KB라고 하였다.  그렇다면 64KB보다 큰 실행파일의 경우는 어떻게 주소를 줘야 할까?  이 때 사용하게 되는 것이 record type 2에 해당되는 'Extended Segment Address Record' type이다.

요즘의 PC는 64비트 CPU가 들어가 있지만 초창기 IBM-PC는 16비트 CPU가 사용되었다.  16비트로 표현할 수 있는 최대값이 64KB이므로 이보다 더 큰 주소를 사용하기 위해서 Segment라는 개념을 도입할 수밖에 없었다.  Segment값도 16비트값으로 표현되지만, segment의 1은 offset주소 16에 해당되는 값을 가지도록 되어 있다.

segment:offset 의 표기법을 이용하여 최대 2^20에 해당되는 주소를 지정할 수 있게 된다.  이 부분에 대해서는 intel의 주소체계와 register종류를 공부하면 좀더 자세한 내용을 알 수 있다.

나머지 record type에 대해서는 몰라도 상관없으므로 설명을 생략하기로 한다.

record type다음에 나오는 부분은 data 값들이다.  그리고 마지막 바이트값은 checksum 값이다.  Record length 필드에서부터 checksum필드까지 모두 더하면 그 값이 항상 0이 나와야 한다.



위의 내용을 가지고 hex 파일을 분석하여 bootloader 프로그램에 전달하여야 할 data를 추출해 보도록 하겠다.



이 글의 시작부분에 보여졌던 Hex 파일에서 필요한 data record를 제대로 추출해 낸것을 알 수 있다.


AvrBootloader.py













댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함