부트로더 제작 5편. blob 'STARTUP.S' 의 분석 - 2009/02/10 23:10
우리가 지금부터 하려는 작업인 ARM9 기반의 AHAV9302 보드상으로의 소위 포팅 작업은 blob의 구성 프로그램중 초기 기동 코드인 'STARTUP.S' 을 출발점으로 해야 마땅 할 것이다.
한편, blob 의 본시 배경 플랫폼은 인텔의 스트롱암 기반이다. ARM9 으로의 포팅 작업은 많은 량의 코드 수정을 요하지는 않지만 그중 가장 많은 코드의 수정을 요하는 것이 아마도 금번의 분석 대상인 'STARTUP.S' 이 아닐까 한다.
따라서, 금번회차와 다음회차 정도가 가장 어려운 내용이 아닐까 싶다.
당연 우리가 진행하고 있는 본 강좌. 부트로더 제작 강좌는 시간이 갈 수록 그 내용이 쉬워지지 않을까 생각된다.
설명을 위해 도입한 다음의 소스코드를 한번 살펴 보자.
생선중 '갈치'라는 것이 있다. 주방에서 갈치를 구워 내면 그 냄새가 매우 독특하고 진한 향이 난다. 그 모양 또한 길쭉하게 생긴것이 특징이다.
시장에 가서 이 갈치를 사면 생선가게 아줌마가 생선을 적당한 크기로 토막내어 소금을 뿌려준다.
갈치를 토막 내듯 우리가 지금부터 분석할 소스 코드를 적당한 크기로 흑(BLACK), 백(WHITE)로 토막낸다. 당연 각 파트는 설명을 위해 기능별로 잘라내었다. 그리고 각 부위별로 번호를 매긴다( AA, AB, AC, . . . .AV ) 이런식으로 말이다.
금번 회차에서는 blob의 원본 소스 코드('STARTUP.S')를 분석해 보고 다음회차에서는 AHAV9302 버젼의 'STARTUP.S' 을 선보인다.
*[AA] : 주석이다.
*[AB] : 인터럽트 벡터 테이블(IVT)이 보인다. 소스의 최하단에 위치한 [AV] 와 함께 보면 좋을듯.
BLOB 부트로더에서는 인터럽트를 전혀 사용하지 않는 것이 이채롭다. 왜냐구? [AV] 을 보라. 인터럽트 서비스 루
틴이 보이질 않는다.
*[AC] : 모든 인터럽트를 비 허가 한다(DISABLE)
*[AD] : 주석을 보면 CPU의 클럭을 설정하고 있음을 알 수 있다.
*[AE] : SDRAM 의 초기화를 수행한다.
*[AF] : 시리얼(UART) 장치의 초기화를 수행한다.
*[AG] : LED 장치의 초기화를 수행한다. 이후에 이 LED 장치가 대단한 활약(?)을 하게 된다.
*[AH] : 초기화 가 완료된 시리얼 장치를 이용하여 문자열('welcome')을 디스플레이한다.
*[AI] : 현재의 코드가 외부 플래시 장치에서 실행되고 있음이 확인되면 해당 코드 이미지를 내부 플래시로 복사를 수행한다('cpy_ext2int')
*[AJ] : 램(RAM) 의 메모리를 zero out(클리어) 한다.
*[AK] : 플래시 메모리에서 특정 키워드를 검색한다. 읽어낸 이 코드값을 이후에 main() 에게 파라메터로 전달한다.
코드의 후반부에서 이후 사용될 스택(STACK) 포인터를 세트한다.(코드 sub sp, r11, #$04)
*[AL] : c_main 메인 엔트리를 호출한다.
*[AM] : AM ~ AV 까지는 C 언어로 비유하자면 함수(서브루틴) 정도가 된다.
LED 을 켜고 끄는 코드가 작성되어 있다.
*[AN] : 시리얼로 디스플레이 할때 사용될 문자열들이 저장되어 있다.
*[AO] : 문자열 디스플레이 함수이다.
*[AP] : 숫자 디스플레이 함수이다.
*[AQ] : 시리얼 문자 전송 함수이다.
*[AR] : cpy_ext2int 함수로서 EXTERNAL 플래시로 부터 INTERNAL 플래시로 복사해 주는 함수이다.
*[AS] : 플래시 쓰기에 사용되는 함수이다.
*[AT] : 플래시 읽기에 사용되는 함수이다.
*[AU] : 시간 지연(대기) 함수이다.
*[AV] : 인터럽트 서비스 루틴이다. 다만, 그 내용물이 없다. 따라서 본 BLOB 부트로더에서는 인터럽트를 사용하지 않음을 알 수 있다.
ps. 필자가 쓴 칼럼중 다음의 내용과 함께 보면 좋을듯 싶다. 어떤 내용이 추가되어 있고 어떤 내용이 생략되어 있는지 말이다. 부트 스타트업 코드(crt0.s)의 실체. 다음회차의 칼럼을 보는데 도움이 될 것이다.
NEXT. . . 다음 시간에는 AHAV9302 보드용 blob의 부트스타트업(start.s) 을 만들어 봅니다.
posted by 가일(GUILE)





