부트로더 bootloader
- 전원 공급시 가장 먼저 실행
-> 시스템 하드웨어 초기화 + 메모리에 운영체제로딩
- 하드웨어 추가로 운영체제 실행 전 초기화 작업이 필요한 경우 -> 부트로더 실행
- 부트로더 수정/코드 추가 -> 하드웨어 및 운영체제에 대한 이해가 필요
-> 부트로더에 명령어 추가시 부트로더를 다양하게 사용가능
- 초기화 코드가 어셈블리로 작성되는 경우 어셈블리 코드에 대한 이해도 필요
(1) 부트로더 개요
1) 부트로더
2) 부트로더 기능
3) 부트로더 소스파일 구성
4) 부트로더 생성 절차
1) 부트로더
부트로더(Boot Loader) 역활 및 유형
- 시스템 부팅 후 처음으로 실행되는 프로그램
- 시스템 초기화/ 운영체제 로딩
데스크탑 리눅스용 부트로더
- 하드디스크의 마스터부트레코드에서 동작
- 멀티부팅 : 운영체제의 선택적 부팅 기능 제공
- LILO(Linux Loader), GRUB(Grand Unified Boot loader)
임베디드 시스템용 부트로더
- 각 임베디드 시스템에 특화된 전용부트로더
- 플래시 메모리에 저장, 메인 메모리에서 실행
- 단일 운영체제 부팅
- 시스템 개발 관련 명령어 지원 : 호스트 컴퓨터와 타겟 보드의 데이터 전송명령어, 플래시 메모리 쓰기, 메모리 dump
- ARMBoot, BLOB(Boot Loader OBject), U-BOOT
2) 부트로더 기능
부트로더 주요작업
- 하드웨어 초기화 : CPU클럭설정, 메모리 파라미터설정, 시리얼 포트 설정, TCP/IP 설정
- 프로그램 복사 : 플래시메모리에 저장된 부트로더 자신, 커널이미지, 램디스크 이미지를 메모리에 옮김
-부트로더 명령어 제공 : 명령어 제공. 호스트 컴퓨터와 데이터교환, 플래시 메모리 퓨징, 간단한 디버깅 기능
- 운영체제 부팅 : 저장된 운영체제로 부팅하여 프로그램 제어권을 운영체제로 넘김 -> 응용프로그램 실행준비
+ 임베디드 시스템 개발에 필요한 작업, 환경설정 변수들을 추가/변경 -> 부트로더 기능 확장
3) 부트로더 소스파일 구성
소스파일
- 1개의 어셈블리 소스파일과 여러개의 C소스파일
- makefile : make에서 사용하는 컴파일 스크립트파일
- start.S : 부트로더 초기 코드로 어셈블리 코드, CPU, 메모리, gpio 초기화, 플래시 메모리를 DRAM 영역으로 복사
- main.c 부트로더 메인 소스코드
- commands.c : 명령어처리고드 포함
- lib.c 부트로더에서 사용하는 라이브러리 포함
- 타겟 보드에 실장된 디바이스에 대한처리프로그램 : flash.c, serial.c, time.c, net.c, bootp.c, tftp.c
헤더 파일
- 각 소스파일에서 사용하는 변수나 매크로들을 정의한 파일
- ld-xsacle : 링커 스크립트 파일(컴파일된 프로그램의 링크 방법)
- config.h : 부트로더 환경설정파일
부트로더 환경설정 파일
- config.h 매크로 형태로 정의된 변수
- 시리얼 포트 전성속도
- 자동부팅 지연시간
- 메모리 맵 : 부트로더, 커널, 램디스크 등 소프트웨어 컴포넌트를 플래시 메모리나 DRAM 어디에 저장할지 설정
-> 매크로 선언 값을 수정하여 메모리 저장위치를 변경할수있음.
- 프로세서가 메모리 컨트롤러 내장한 경우
-> 메모리 액세스 타이밍정보, 파라미터들이 메모리 제어 레지스터에 정확하게 설정되어야 함
4) 부트로더 생성절차
소스 컴파일
1. 부트로더 소스파일 sm_boot.tar.gz 준비
2. 압축파일 해제 tar zxvf sm_boot.tar.gz
3. 소스파일 수정 vi main.c
4. 부트로더 컴파일 make
-> 부트로더는 타겟 임베디드 시스템에서 실행되므로 크로스 컴파일러로 부트로더 소스를 컴파일
부트로더 퓨징 fusing
- 부트로더 소스 수정, 컴파일해서 실행파일 만듬
- 실행파일을 타겟보드에 다운로드하여 플래시 메모리에 넣어야 함
-> 이 작업을 플래시 프로그래밍 or 퓨징 이라 함
- 부트로더는 초기화 프로그램이므로, 보드 상태에 따라 퓨징 작업이 달라짐
퓨징하는 방법
1. 호스트 컴퓨터에서 전용 프로그램으로 직접 퓨징
- 플래시 메모리에 아무런 소프트웨어도 설치안된경우
- 타겟보드에 호스트 컴퓨터와 통신할수있는 프로그램이 없으므로, 하드웨어 적으로 플래시 메모리에 부트로더를 씀
- 타겟보드의 JTAG 인터페이스 사용
타겟 보드의 JTAG 인터페이스와 호스트 컴퓨터 병렬 연결 -> 전용 프로그램으로 플래시 메모리에 부트로더 실행파일을 넣음
2. 기존에 설치된 부트로더 사용하는 방법
- 기존 부트로더를 새 부트로더로 교체하는 방식
- 기존 부트로더에 호스트와 통신가능한 통신명령어와 플래시 메모리 쓰기 명령어를 포함함
- 통신 명령어로 호스트 컴퓨터로 새 부트로더를 다운로드받고 플래시 메모리 쓰기 명령어로 대체함
- 고속 데이터 전송을 위해 이더넷 인터페이스와 플래시 메모리의 특정 주소에 데이터를 쓰는 플래시 쓰기 명령지원
-> 이더넷 인터페이스를 통한 부트로더 퓨징
1. 호스트 컴퓨터에서 FTP 서버를 설치하고, FTP로 전송할 파일을 루트 디렉토리에 옮김
2. 타겟보드 부트로더에는 FTP전송을 위해 필요한 IP를 설정한 후, FTP 명령어로 새부트로더 다운
3. 다운로드 후 플래시 쓰기 명령어로 다운 받은 부트로더를 플래시 메모리에 써넣음
4. 타겟 보드를 재시작하면 새 부트로더가 시작
(2) 부트 초기화 과정
1) 부트 초기화란
2) 부트 초기화 순서
1) 부트초기화란
부트 초기화
- 메모리에 커널 로등 후 하드웨어가 초기화 되어 시스템을 사용가능한 상태로 만드는 과정
- 프로세서 초기화, 메모리 점검 및 초기화, 각종 하드웨어 점검 및초기화
- 커널로딩, 커널 자료 구조 등록 및 초기화, 시스템 사용환경구성 설정
2) 부트 초기화 순서
- power on : 시스템 전원 인가
- rom-bios 실행 : 바이오스가 실행
- post 과정 실행 : power on self test. 진원 인가 동시에 디바이스들의 오류 여부 확인
- mbr의 부트로더 읽기 : 보조기억장치 부팅파티션에 있는 MBR을 읽어 부트로더 실행
- 부트로더 실행
부팅 메뉴 선택(/boot/grub/grub.conf 환경설정)
압축 kernel 이미지 로드 (/boot/bmlinuz-버전)
시스템 제어권을 커널(kernel)에게 넘겨줌
스와퍼(swapper)프로세서 호출
- swapper 프로세스 실행 : 커널 이미지 압축 해제. 각 장치 드라이브 초기화
루트 파일 시스템을 ro 모드로 마운트 후 파일 시스템 검사, 루트파일시스템을 rw 모드로 마운트하여 init 호출
- init 프로세스 실행 : /etf/initab 파일 참조 -> /etc/rc.d/rc.sysinit 스크립트 실행 -> /etc/rc.d/rc.local 실행
-> 가상 콘솔 프로토콜 (mingetty)실행 -> login 프롬프트 출력
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
ARM을 활용한 임베디드 시스템 설계 18 - 리눅스 커널 (0) | 2020.05.04 |
---|---|
ARM을 활용한 임베디드 시스템 설계 17 - 부트로더 분석 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 15 - 임베디드 시스템 개발 환경 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 14 - 소스 컴파일 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 13 - shell 프로그래밍 (0) | 2020.05.04 |