728x90

ARM 프로세서, 리눅스 기반 임베디드 시스템에서 사용되는 부트로더

 -> 동일 시스템 개발 시 참고 가능

 -> 처음부터 개발은 힘드므로 이미 개발된 부트로더나 오픈소스 부트로더를 수정

 

(1) 부트로더 구현 사례

1) SM_BOOT

2) SM_BOOT 명령어

3) SM_BOOT 동작 흐름도

 

1) SM_BOOT

SM_BOOT의 의미와 실행화면

- ARM 기반 플랫폼 전용 임베디드 시스템 부트로더

 

SM_BOOT 메모리맵

- 플래시 메모리에 부트로더, 커널이미지, 환경변수 등 존재

- 환경변수 : 시스템 환경변수 설정

- 사용자 : 플래시 메모리 전용 파일시스템 만들어 하드디스크 처럼 사용

 * 램은 전원중단시 사라지므로 보존 필요한 데이터는 따로저장해야함

2) SM_BOOT 명령어

SM_BOOT 명령어

- 임베디드 부트로더의 한사례로 부트로더 구현방법/제공 명령어 검토

-> 새로운 부트로더 설계에 큰 도움

- 부트로더 기능 수행 : boot(램에 로딩된 커널 부팅, 수동 운영체제부팅), reset(부트로더 재실행)

- 시스템 개발 : bootp(bootp 프로토콜로 ip 어드레스 할당-데이터 송수신 필요시 해야함), setpi(ip어드레스 수동 설정),

          macwrite(이더넷 인터페이스 카드의 맥어드레스 설정), tftp(tftp 데이터전송), download(시리얼 전송),

          flash(플래시 메모리에 데이터 저장), 

- 간단한 디버그 : read(특정 메모리주소 값 읽기), write(특정 주소에 값 쓰기), status(메모리,레지스터,이더넷 상태표시)

 

부트로더 공간 크기

- bootroader는 0x00000000에서 시작하며 길이는 0x0000C0000

- 길이가 2^16이므로

- 부트로더에 설정된 공간 크기는 2^6 * 2^10 = 64 * 1024 -> 64KB

SM_BOOT status 명령 예시

 

3) SM_BOOT 실행 흐름도

SM_BOOT 실행 흐름도

1. Power On

2. Start.S

 - 벡터 테이블 설정

 - 레지스터 설정(클럭, 메모리, GPIO 등)

 - 부트로더를 RAM으로 복사

 - 스택 포인터 설정

 - 램 상의 부트로더로 제어권 이동

3. main.c

 - 시리얼 초기화

 - 이더넷 초기화

 - 램으로 이미지 복사(커널, 램디스크)

 - 부트모드 결정

 - 명령어 입력/리눅스 커널 부팅

 

 

(2) 부트로더 동작 흐름

1) ARM 기반 부트로더 동작 흐름

2) 링커 스크립터

 

1) ARM 기반 부트로더 동작 흐름

ARM 기반 부트로더 동작 흐름

1. 인터럽트 벡터 테이블 설정 

  - 시스템 전원 인가시 마이크로 프로세서는 무조건 0x0000 0000 번지의 데이터를 읽음

 - 하드웨어적으로 이벤트 발생시 특정 번지로 이동해 그 위치의 명령어를 읽음

 - 예외 : 하드웨어/소프트웨어적으로 발생하는 이벤트

 - 예외처리기 : 예외상황이 발생시 실행하는 작업

 - 인터럽트 벡터 테이블 : 예외처리기 위치 정보를 가진 테이블

 - 이테이블은 메모리 가장 낮은 위치에 저장되어 부트로더 소스중 가장 먼저 실행되는 코드

2. 인터럽트 마스킹

 - 부트로더 실행중 인터럽트 발생 방지

 - 마스킹 발생 방지 방법 : 마이크로 프로세서에 따라 다름

 - ICMR 값을 클리어하면 인터럽트 발생이 방지됨

3. sleep mode 방지

 - 소비전력 절약을 위한 sleep 모드 지원

 - 부팅 과정 중 시스템이 슬립모드 진입을 막는 코드가 있음

4. cpu 클럭 설정

 - 동작 속도 설정을 위해 cpu 클럭 설정 레지스터에 원하는 cpu 클럭 속도 지정

5. gpio 설정

 - 표준 입출력 포트를 사용하기 위한 기본적인 설정

 - 표준 입출력 포트가 입력용인지 출력용인지, 라이징엣지에서 인식할지 폴링엣지에서 할것인지 정해야함

6. SDRAM 설정

 - 메인메모리로 SDRAM을 많이 사용, 프로세서에 메모리 컨트롤러 내장

 - ARM 프로세서에 SDRAM을 사용시 메모리 동작모드 및 액세스속도 등 관련도니 설정 레지스터, 어드레스 설정값

 - 부트로더에서 설정 레지스터에 적절한 설정값을 지정해야됨

7. 스택 포인터 설정

 - c 함수를 사용하기 위한 스택 포인터 설정

-------------------start.S 파일의 어셈블리 코드 실행과정

8. beforeMain 함수 호철

9. beforeMain 함수 실행

 - 어셈블리 코드가 아닌 c프로그램으로 main.c에 포함

 - cmain 부트로더 메인함수 호출전 실행

 - 플래시 메모리에 저장된 부트로더 코드를 메인 메모리에 복사한후 cmain 함수 호출

10. cmain 함수

 - 시리얼포트 전송/다운로드 속도 설정

 - 시리얼 포트/타이머/lcd/ether 초기화

 - 사용자 key 입력 대기 : 입력시 부트로더 명령어 모드 진입/ 없을시 커널 부팅

11. 부트로더 명령어 모드

 - display prompt 함수 호출 - 명령어 프롬프트 출력

12. 자동 부팅

 - 플래시 메모리에 저장된 커널.램디스크 이미지를 메인메모리에 복사 -> DoBootKernel 함수 호출

 

 

2) 링커 스크립터

링커 스크립터

- 링커명령어로 쓰여진 스크립터

- 목적파일의 섹션들을 실행파일들에 매핑시키는 방법기술

- 실행 파일의 메모리 레이아웃 제어

- 링커 명령어를 사양한 다양한 동작 구현가능

 

링커 스크립터 종류

- 기본 링커 스크립터 : 링커 실행파일 내부에 정의된 기본 스크립터. 사용자가 별도 스크립터 지정하지않을시 적용.

- 사용자 정의 스크립터 : 사용자가 정의함. -T옵션으로 적용 가능

 

부트로더 실장위치

- 부트로더가 램의 특정 위치에 로딩되도록 링커 스크립터에 정의

- 시스템 설계 단계에서 결정한 매모리맵에 원하는 프로그램을 로딩할때 사용

 

300x250

+ Recent posts