부트로더 제작 7편. startup - 2009/02/10 23:12
보통 부트 스타트업 코드는 어셈블리로 작성되어 있는 경우가 많다. 우리가 지금 보고 있는 부트로더도 마찬가지여서 스타트업 코드가 존재하고 이제부터 우리는 이의 분석을 진행 하려 한다.
부트 스타트업 코드를 필자는 다음과 같이 5가지의 테마로 세분화 하였으며 금번 시간에는 이중 첫번째로 (1)을 분석한다. (2),(3),(4),(5)는 다음회차 강좌에서 진행 할 계획임을 더불어 알린다.
분석목표
(1)relocation
: 코드가 저장되어 있는 공간인 플래시메모리에서 부트후 self 코드를 SDRAM 영역으로 복사하여 2차로 실행되는 과정
(2)programmers memory initialization
: 초기화된 데이터 영역(.data), 초기화 되지 않은 데이터 영역(.bss), 스택, 동적메모리(.heap)의 초기화 시퀀스
(3)MMU
: MMU의 처리
(4)PLL config
: CPU core / BUS clock의 컨피규어
(5)SDRAM config
: SDRAM controller 초기화
첨부 소스의 설명
첨부된 소스는 금번시간과 다음 시간에 걸쳐 startup 동작에 대한 설명에 촛점을 맞추기 위하여 부트로더의 소스코드중 startup 엔트리에서 main() 함수로의 진입까지의 소스만을 발췌하였다.
주요 파일 리스트
|
Makefile src/flash_cfg.S include/ahav9302.h |
타겟보드에 코드를 컴파일하여 다운로드 하는 방법에 대한 설명
#tar xvf blob-ahav9302-106.tar ; 배포 이미지 압축을 푼다
#cd blob ; blob 폴더로 이동
#make clobber ; 컴파일하기 전에 오브젝트및 바이너리들을 깨끗하게 지우기
#make ; 컴파일
.. 이상이 없다면 해당 blob 폴더내에 'blob.bin' 이라는 실행파일이 만들어 졌을 것이다.
이 파일을 download 툴을 이용하여 타겟 보드에 다운로딩 한다.
타겟 보드에 다운로딩하는 요령에 대하여는 이전의 강좌를 참고 할것.
#download -b 115200 -p 3 blob.bin ; 115000baud, COM3 사용의 예
프로그램 다운로딩이 끝났다면 보드의 리셋버튼을 눌러보자. 혹은 보드의 전원을 켜보자.
'그림1. LED가 동작하는 ahav9302 보드 참조' ahav9302보드의 LED 부분을 보면 LED가 두개 있을 것이다. 이 LED가 각각 적색, 녹색등으로 켜진다면 정상적으로 실행된 것이다. 반면, LED가 안 켜지거나 녹색등만 켜진다면 오동작을 한 것으로 보면 된다
그림1. LED가 동작하는 ahav9302 보드
다음부터의 설명에는 start.S 을 주목하여야 한다.
그림2. start.S 소스코드
"그림. start.s 소스코드" 각 섹션의 설명
*[AA] : ARM의 동작 모드를 수퍼바이져 모드로 변경한다.
*[AB] : MMU제어, PLL config, CPU core / BUS clock의 세팅, SDRAM config 등의 작업을 수행한다.
*[AC] : relocation 작업. 코드가 저장되어 있는 공간인 플래시메모리에서 부트후 self 코드를 SDRAM 영역으로 복사하여 2차로 실행되는 과정이 일어나며 이 작업의 목적은 아래의 relocation 절에서 설명될 것이다.
*[AD] : 스택의 초기화.
*[AE] : bss 영역의 초기화.
*[AF] : LED 'TURN OFF'
*[AG] : c_main() 의 호출
relocation
ahav9302 보드의 SDRAM은 그 크기가 64M바이트 이며 0xC000.0000가 그 시작 주소이다. 한편, FLASH 는 그 크기가 16M바이트 이며 0x6000.0000가 그 시작 주소이다.
relocation 은 두가지 정도의 목적을 가지고 있다. (첫째), 코드가 실행되는 플래시 메모리는 SDRAM 에 비해 읽고 쓰는 속도가 느리다. 따라서, 고속의 페이지 동작이 가능한 SDRAM 상으로 코드를 이동시켜서 실행되도록 한다. (둘째), blob 부트로더에는 플래시 라이팅 기능도 지원되는데 이의 처리를 위해서는 필히 현재 실행되는 코드가 플래시에서
동작되서는 곤란하다. 왜냐구? 플래시를 라이팅하는 프로그램이 동작하는 곳도 플래시고 타겟 장치도 자신이므로 이는 플래시 메모리의 특징상 불가능 하다. (AVR이라는 마이크로 컨트롤러에서는 이것이 가능하다. 인상적이다.)
이상과 같은 이유로서 relocation 작업이 필요하며 'start.s' 상에서 그 기능이 구현되어 있다.
그러면 몇번째 코드라인 부터 SDRAM 상에서 실행될까? 188라인 이후부터인 c_main() 이라고 말할수 있다. 즉, 188라인까지는 blob 프로그램 코드는 플래시 상에서 실행된다.
188라인의 문장을 보자. " ldr pc, _start_armboot "으로 작성 되어져 있다. 실행후 프로그램 카운터에는 어떤 값이 들어갈까?. 0xc3c01004 라는 주소값이 들어간다.
어떻게 알았는가?. 첨부문서() 에서 blob.map 이라는 파일은 LINKING 후의 맵(MAP) 정보를 담고 있다. 131라인을 보면 다음과 같이 나와 있다.
|
*(.text) |
결국 " ldr pc, _start_armboot " 의 실행결과 프로그램 카운터는 이후 부터 SDRAM 상의 주소에 해당하는 c_main() 함수를 실행하고 이후 부터 실행되는 모든 코드는 SDRAM 상에서 실행될 것이다.
참고를 위하여 '그림3. blob 의 프로그램 메모리 구조도' 와 '그림4. blob 의 relocation 동작 개념도' 을 아래와 같이 첨부한다.
그림3. blob 의 프로그램 메모리(SDRAM상) 구조도
blob 의 프로그램 메모리(SDRAM) 영역상의 각각은 다음의 의미를 갖는다.
(1).stack 영역
수퍼바이져 스택, 인터럽트(irq, fiq 각각) 스택 영역에 해당한다.
(2).bdinfo
보드 specific 한 정보를 담기 위한 것으로 실제로는 사용되지 않는다.
(3) .heap 영역
malloc(C), new(C++) 와 같은 동적 메모리 할당 명령 실행시 할당되는 메모리 영역이다.
(4).text 영역
프로그램(기계어)이 저장되는 메모리 영역이다.
(5).rodata 영역
const 나 스트링 참조 배열 초기값을 가지고 있는 영역이다.
(6) .data 영역
cf) int gvariable= 1; 처럼 초기화 한 전역변수들이 모여있는 영역이다.
(7) .got 영역
모르겠다(죄송~~)
(8) .bss 영역
cf) int gvariable; 처럼 초기화 하지 않은 전역변수들이 모여있는 영역이다.
그림4. blob 의 relocation 동작 개념도
NEXT. . . 다음 시간에는 blob의 부트스타트업(start.s) 을 계속해서 진행합니다.
posted by 가일(GUILE)
♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요-> 





blob_ahav9302_106.tar