[테크월드=정환용 기자] 일반적으로 체크섬(Checksum)이 많이 사용되는 곳 중 하나는 데이터 통신이다. 통신 패킷을 만들어 전송할 때, 패킷의 체크섬 값을 포함해 전달하면 패킷을 수신하는 곳에서 전송된 패킷의 무결성을 확인할 수 있다. 이처럼 체크섬은 데이터의 무결성을 확인하기 위해 사용된다.

IAR 임베디드 워크벤치(Embedded Workbench)에서는 빌드된 실행코드의 무결성을 확인하기 위한 체크섬 생성, 기록 기능이 지원된다. 체크섬 사용에 대한 프로젝트 설정과 응용 방법에 대해 살펴보자.

 

체크섬 계산
IAR 임베디드 워크벤치에 통합돼 있는 ielftool 도구에 의해 사용자가 지정한 특정 주소범위에서 체크섬을 계산된다. 체크섬의 계산은 ELF 심볼 이미지에 삽입되며, 응용 프로그램은 체크섬을 이용해 무결성을 확인한다. 응용 프로그램의 무결성 확인을 위한 체크섬을 사용하려면 다음의 사항을 수행해야 한다.

▲ ielftool에 의해 계산된 체크섬의 저장 공간, 이름, 크기 등이 정해져야 한다.
▲ ielftool에서 체크섬을 계산하기 위한 알고리즘 선택과 그에 상응하는 코드가 응용 프로그램에 삽입돼 있어야 한다.
▲ 체크섬을 이용해 무결성을 확인할 메모리 범위가 결정돼야 하고, ielftool과 소스 코드에 설정돼야 한다.

 

체크섬 설정
먼저 체크섬의 사용 설정을 위해 프로젝트의 ‘Options’에서 ‘Linker Category’를 선택하고, 체크섬 탭으로 이동한다. 사용하지 않는 코드 메모리 영역 채우기(Fill unused code memory)를 선택한다. ‘Fill pattern’ 항목에 체크섬 계산 범위 내에 사용되지 않는 메모리를 채울 패턴을 입력한다. 기본 값은 0xFF이다. 다음으로 체크섬이 계산될 주소 범위를 설정한다. 시작 주소와 끝 주소를 설정한다.([그림 1] 참조)

[그림 1] 사용하지 않는 코드 메모리 영역 채우기.

 

체크섬 생성을 위한 ‘Generate checksum’을 체크한다. 다음 활성화되는 체크섬을 생성하기 위한 정보를 설정한다. ([그림 2] 참조)

[그림 2] 체크섬 생성 설정.

 

자세한 체크섬의 항목 설정은 아래의 [표 1]을 참조하면 된다.

[표 1] 체크섬 생성 설정 항목

위의 설정을 완료 후 프로젝트를 빌드하면, 체크섬이 계산돼 코드 데이터 영역의 가장 끝부분에 추가된다.

체크섬의 위치는 .map 파일에서 가능하다. 프로젝트 Options에서 Linker Category의 List 탭에서 Generate linker map file을 체크한 후 B uild한다. 프 로젝트의 O utput 그룹에 .map 파일이 생성된다. map 파일을 확인하면 ENTRY LIST에서 체크섬 관련 심볼의 위치와
크기를 확인할 수 있다.

[그림 3] 코드 데이터 영역 끝에 위치한 Checksum.

 

저장된 Checksum의 위치 변경
체크섬은 ielftool에 의해 생성된 후 기본적으로 ROM 영역의 메모리 가장 끝부분에 위치하게 된다. 하지만 사용자의 임의 설정에 따라 체크섬의 위치를 변경할 수 있다.

▲응용 프로그램 코드의 시작에 위치시키기
define block CHECKSUM { readonly section .checksum };
place in ROM_region { readonly, first block CHECKSUM };

이 코드를 사용하는 .icf 파일(Linker Configuration File)에 추가한다.

[그림 4] 코드의 시작에 위치한 체크섬

이 경우, 응용 프로그램의 시작은 interrupt vector와 checksum 값 다음에 위치하게 된다. 일반적으로 interrupt vector는 주소 0x0에 위치한다.

▲응용 프로그램 코드의 끝에 위치시키기
define block CHECKSUM { readonly section .checksum };
place in ROM_region { readonly, last block CHECKSUM };

위의 코드를 사용하는 .icf 파일에 추가합니다.

[그림 5] 코드의 끝에 위치한 Checksum

▲임의의 주소에 위치시키기

place at address mem : [사용자 지정 주소] { readonly section.checksum };

이 코드를 사용하는 .icf 파일에 추가한다.

[그림 6] 지정한 임의의 위치에 위치한 체크섬.

예시) place at address mem:0x0000aaaa { readonly section .checksum };

__checksum 심볼은 체크섬 계산 시작과 끝의 범위 밖에 위치시키기를 권장한다. 범위 내에 존재한다면 체크섬 계산 시 변경되지 않은 _ _checksum 위치의 값을 포함해 계산 후, _ _checksum 위치에 기록한다. 이후 무결성 확인을 위해 체크섬 계산 시작과 끝의 범위의 체크섬을 계산 하면, 변경된 _ _checksum 값 때문에 저장돼 있던 체크섬 값과 다르게 되기 때문에 무결성을 확인할 수 없다.

 

체크섬 활용하기
부트로더가 포함되는 프로젝트에서 부트로더 동작 구현 중 점프해 수행할 애플리케이션의 무결성 확인을 위해 체크섬을 활용할 수 있다. 애플리케이션 영역에 실행 코드의 체크섬이 포함돼 있다면, 부트로더에서 애플리케이션의 실행 코드에 대해 체크섬을 계산하고, 애플리케이션의 영역에 저장된 체크섬 값과 비교해 무결성을 확인할 수 있다.

체크섬은 응용 프로그램의 동작에 대한 신뢰성의 지표로 사용할 수 있다. 응용 프로그램이 정상적으로 다운로드돼 있으며, 다운로드된 응용 프로그램의 변형이 없다는 것을 확인할 수 있다.

다음의 간단한 활용 예를 참조하자.

• 프로젝트의 Options에서 Checksum generation을 활성화시킨다. Start Address와 End Address는 map 파일을 참조해 코드의 시작 주소와 끝 주소로 지정한다.
• _checksum_begin, __checksum_end 심볼을 참조해 응용프로그램 시작 시 Checksum을 계산한다. 이때 프로젝트 Options에서 활성화했던 Checksum generation 방법과 동일한 방법으로 구현돼 있어야 한다.
• _checksum을 참조해 저장돼 있는 체크섬과 응용 프로그램의 시작 시 계산된 체크섬을 비교한다.
• 만약 저장된 체크섬과 응용 프로그램 시작 시 계산된 체크섬이 다르다면, 다운로드된 응용프로그램의 무결성을 보장할 수 없다고 가정하게 된다.

예시.

 

맺음말
실행되는 코드의 무결성을 확인하기 위한 체크섬 데이터는 일반적으로 빌드 후 출력되는 실행코드를 별도 제작된 프로그램을 이용해 체크섬 계산, 추가를 한다. 하지만 IAR 임베디드 워크벤치의 Linker에서 지원하는 Checksum 옵션을 사용하면, 별도 제작된 프로그램이 필요 없다. 또한, 이런 기능으로 개발의 프로세스도 조금은 간소화할 수 있다. 이처럼 IAR 임베디드 워크벤치의 다양한 기능을 활용하면 좀 더 효과적인 개발을 할 수 있다.

 

작성: 이현도 IAR Systems Korea 기술지원팀 과장

이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지