부트로더 제작 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)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

 

Trackback Address :: http://www.hongikcom.com/trackback/74 관련글 쓰기
Name
Password
Homepage
Secret
< PREV |  1  |  ...  60  |  61  |  62  |  63  |  64  |  65  |  66  |  67  |  68  |  ...  131  |  NEXT >