2010년 6월 4일 금요일

Boot Loader

Boot Loader
  기본적인 내용은 지난번 포스팅했던 내용을 참조
  → http://wayne867.textcube.com/45

1. Boot Loader의 역할
  - Target system 초기화
.부트로더는 전원이 입력되면 타겟 시스템이 정상동작 할 수 있도록 HW및 SW동작환경을 설정
  .불필요한 HW의 동작 중지, 시스템 clk설정, 메모리 제어기 설정 및 필요에 따라 MMU설정
.프로그램 동작에 필요한 재배치(relocation),스택 영역 설정 및 C에서 사용되는 변수 영역 설정 후
 C로 작성된 함수 호출 / '재배치' means 초기 nand에 있던 program을 DRAM으로 옮기는 작업.
.부터로더에는 필요에 따라 IRQ와 같은 예외처리벡터 및 핸들러도 작성되어야 한다.
  - Target system 동작 환경
.부트 방법, 부트 디바이스를 비롯한 네트워크를 이용한 부트를 지원하기 위한 네트워크 설정
 IP주소설정등 부트로더 동작에 필요한 정보를 설정
.설정된 환경 변수 값은 플래시 메모리 또는 EEPROM에 저장하여 관리.
  - system OS Booting
.일반적으로 임베디드 시스템의 OS는 flash memory에 탑재되어 있고 부팅과정에서
 주 메모리(일반적으로 DRAM)에 탑재하여 실행.
.시리얼, 네트워크 또는 USB를 이용한 실행하는 방법 지원
 -네트워크는 TFTP를 사용
 -USB는 네트워크에 비하여 별도 설정 없이 누구나 쉽게 사용 가능
 -UART를 이용한 탑재 방법(속도가 느려 용량이 큰 OS를 탑재하기에는 부적합)
  - Flash memory 관리
.임베디드 시스템에서 가장 효율적인 보조 기억장치
  .부트로더 탑재, 시스템에 전원이 인가되면 플래시에 저장된 부트로더 실행
.부트로더 및 시스템 동작에 필요한 환경 변수 저장
.플래시 메모리에는 시스템 운영체제 이미지 탑재
 
2. 특징
  - 프로세서에 의존성이 높다
.특히 시스템 초기화 과정의 모든 코드는 어셈블러로 작성된다.
.프로그래머는 프로세서의 architecture와 programmer's model에 대해 이해를 하고 있어야 한다.
  - Target system의 하드웨어에 의존성이 높다
.프로그래머는 target system의 하드웨어를 이해하여야 한다.
.특히 메모리 인터페이스, 주변 장치 등에 대하여 잘 알고 있어야 한다.
  - 가능하면 적은 크기여야 한다.
  - 대부분은 사용자가 직접 작성하여 사용한다.

3. 종류
  - LILO: Linux Loader는 x86 컴퓨터 기반의 리눅스에서 오래 전부터 사용되고 있음
  - GRUB: Grand Unified Bootloader는 GNU 프로젝트의 부트로더
  - EtherBoot: 디스크 없는 시스템에서 이더넷을 통해 부팅할 수 있게 하는 부트로더
  - Blob: Blob는 ARM프로세서 기반의 LART 하드웨어를 위한 부트로더
  - PMON:PROM Monitor, MIPS보드를 지원하기 위해 제작된 것
  - RedBoot: Redhat에서 개발되어 배포된것
  - U-Boot: Popular, PPCBoot와 ARMBoot 프로젝트를 기반으로 개발, ARM기반 Target 보드 지원.

4. U-Boot
  - 특징
.Linux와 유사한 구조(일부 소스는 linux용을 사용, linux img를 부팅하기 쉽도록 되어 있다)
.확장이 용이함(새로운 command 추가가 쉽다, configuration에 의한 dynamic한 기능추가/확장제공)
  - getting Source.
.http://sourceforge.net/projects/u-boot
.유사한 target machine의 소스를 개발하고자 하는 target에 맞도록 복사하고 설정 환경을 만든다.
.U-Boot을 configuration하고 빌드하여 최종 이미지를 얻는다.
.target에 탑재하고 실행하면서 보드에 맞도록 포팅한다.
  - 초기화 과정
.start.S file이 U-boot의 시작.
  - Build
.build configuration
  $cd ~Work/u-boot-1.3.4
  $make dtkc100_config
.의존성(Dependency)검사
  $make dep
.build U-boot
  $make
.빌드후 생성되는 files
  u-boot.map (U-boot memory map file)
  u-boot (ELF binary format의 U-boot img. debug시에는 이 파일을 이용)
  u-boot.bin (plane binary format의 U-boot img. flash에 탑재되는 img. code와 data만 있음).
  - boot loader 탑재
.개발된 부트로더는 target의 flash에 탑재되어 부트로더 기능을 수행함.
.
  - 환경변수 설정
.printenv / 현재 설정된 환경 변수 출력 / printenv
.setenv / 환경 변수 설정 / setenv [변수명] [설정값]
.saveenv / 설정된 환경변수 저장(nand에) / saveenv

  - download (kernel및 ramdisk등)
.loadb / 시리얼로 다운로드 / loadb [주소] [속도] / load 20008000 115200
.tftp / 네트워크로 다운로드 / tftp [주소] [파일명] / tftp 20008000 zImage
.이때 주소는 target의 destination주소임.

  - booting
.bootm 명령 사용
.bootm 20008000 / 20008000번지의 내용을 사용하여 booting
.자동부트
  bootcmd
  #setenv bootcmd 'tftp 20800000 ramdisk.gz;tftp 20008000 zImage;bootm 20008000'
  #saveenv

댓글 없음:

댓글 쓰기