반응형

부트로더란.

- 일종의 프로그램
- 바이오스 같은거
- 보통 플래시메모리는 부트로더가 탑재됨.
- 포팅(이식)이란?

보통 범용소스를 이용하여, 특정 soc 또는 보드에서 동작하도록 소스를 수정하는 작업.


부트로더의 역할

-타깃 초기화
-타깃 동작환경 설정
-시스템 운영체제 부팅
-플래시 메모리 관리


부트로더의 특징

-하드우어 의존성이 강함. (프로세서의 구조와 특징 및 사용법 알아야함)
-시작부분은 어셈블리어로 작성되기때문에, 명령어 사용법을 알고 있어야함.
-콘솔을 구현하려면 UART 제어기의 구조와 제어방법을 숙지해야하고,
-네트워크 및 USB를 이용하려면, 이더넷 제어기 및 USB 디바이스 제어기에 대해서도 알아야함.

다양한 부트로더

- LILO, GRUB, Loadlin, EtherBoot, Blob, PMON, RedBoot, U-Boot 등 여러가지 부트로더가 있음.

- 부트로더의 기본 기능만 제공한다면, 어떤 종류의 부트로더를 사용해도 무방함. 
- U-boot는 가장 활발하게, 개발되고 다양하게 사용되는 공개 부트로더임.
- U-boot는 PPCboot와 ARMBoot 프로젝트를 기반으로 개발됨. (다양한 PPC또는 ARM프로세서 기반의 타깃보드를 지원함)
- U-boot는 TFTP를 이용하여 운영체제 부팅가능함. 게다가, 플래시 메모리, IDE, SCSI 등 다양한 매체를 이용해 부팅가능함. JFFS2파일시스템을 비롯한 다양한 파일시스템을 관리하는 기능도 있음. 
- U-boot는 다양한 명령어와 스크립트를 지원함. 그리고 모니터 기능까지 있음.
- U-boot는 임베디드 리눅스 기반의 시스템에서 많이 사용됨.
- U-boot는 리눅스와 유사한 구조를 가지고 있음.


U-boot에 대해서.

 - U-Boot는 시스템에 리셋 키가 입력되거나, 전원이 인가되면 실행되는 부트코드다.

(사실, Exynos4412는 전원이 인가되자마자, U-Boot와 같은 사용자 부트로더를 실행하지 않음. 내부 ROM에서 시작되어 칩의 OM(Operating Mode)에 다라서, 부트 디바이스를 찾고 나서야 사용자 부트로더가 실행됨.)

 

 - U-boot는 전원 인가 시에 플래시 메모리에 그 코드를 가지고 있음.
 - 하지만, NAND플래시나 eMMC 등 CPU에서 어드레스 접근이 불가능한 장치를 부트 디바이스로 사용하는 경우,
부트코드를 주메모리장치인 DRAM으로 복사해서 사용함.

 - 즉, NAND플래시, eMMC등의 장치에 대해선, 부트코드를 주메모리장치인 DRAM으로 복사해서 사용함.
 이때, CONFIG_SYS_TEXT_BASE는 복사된 DRAM 위치의 가상 주소를 나타냄.

 - 타깃 보드 디렉터리의 링커 스크립트 파일 u-boot.lds는 U-Boot의 메모리 배치 정보를 나타냄.
 - 만약 타깃 보드 디렉터리에 링커 스크립트 파일이 있으면, U-Boot 빌드 시 armv7/u-boot.lds보다 우선함.

 - 리셋 인가 후 NAND 플래시나 MMC의 부트 영역에 있는 코드 부트영역을 Exynos 내부의 SRAM으로 복사함. 이 복사된 SRAM 영역에 언급된 기능들이 맨 앞에 배치됨.

 - 리눅스에서 머신 아키텍쳐(또는 머신타입)은 타깃이름으로 지정함. 이 번호는 리눅스를 타깃별로 관리하는 데 아주 요긴하게 사용됨. 이 정보는 부트로더로부터 ARM레지스터 R1로 전달됨.

U-Boot 빌드

 - U-Boot를 빌드하기 전에 대상 시스템을 위한 환경 설정을 해야됨.

 - 새로운 시스템을 개바하는 경우에, 대상 시스템에 맞게 수정해야함.

  이 경우, 대상 제품과 최대한 유사한, 프로세서와 보드를 선정하여 환경을 설정한 후 빌드해야함.

 

예를 들어, 아래와 같이 DTK4412 보드용 설정 명령을 내려줌.

# make dtk4412_config

Configuring for dtk4412 board...

 

- 환경 설정이 완료되면 의존성을 검사하고 소스를 빌드함.

- 의존성 검사는 파일 간의 상호 관계를 설정하는 것으로, 향후 수정된 파일이 있으면, 관계된 파일을 같이 빌드하기 위해 사용됨.

- 의존성 검사는 u-boot top 디렉터리에서 다음과 같은 명령어에 의해 실행함.

# make dep

Generating include/autoconf.mk

...

 

의존성 검사가 완료되면 u-boot top 폴더에서 다음과 같이 빌드함.

# make

 

arm-note-linux-gnueabi-gcc -DDO_DEPS_ONLY \

....

 

 

 - 빌드가 완료되면, 빌드된 오브젝트 파일을 링크하여, 새로운 실행 가능한 오브젝트 파일이 생성됨.
 - 링크 후 생성되는 실행 가능한 파일은 ELF 형식의 바이너리로 생성됨.

 - 또한, 플래시에 탑재하기 위해 바이너리 이미지도 생성함.

 - 이 바이너리 이미지는 형식 변환 툴에 의해, 기계 코드와 데이터만을 가짐.

 

표 15-5 U-boot 빌드 후 생성되는 파일

파일 이름 설명
u-boot.map 심볼 맵을 가지는 파일
u-boot ELF 형식의 U-Boot 이미지 파일
u-boot.bin 플래시 메모리에 탑재되는 순수 바이너리 이미지 파일
u-boot.srec 모토로라 S-Record 형식의 U-Boot 이미지 파일

- 향후 U-boot를 개발 대상 시스템페 포팅하기 위해서는, U-Boot 내의 소스파일을 수정하고 다시 빌드하는 과정을 반복해야함.

 - 이 경우, U-Boot를 다시 빌드할 때에는 별도의 환경 지정이나 의존성 검사 없이 u-boot top 폴더에서 make 명령만을 사용하여 빌드하면 됨.

 

대상 보드에 U-Boot 탑재

- 개발된 U-Boot 바이너리는 대상 시스템 보드의 플래시에 탑재되어야함.

- 플래시에 탑재되는 파일은 U-Boot 빌드 후 생성된 u-boot.bin 파일을 사용함.

 

부트로더 탑재하는 방법은 4가지 방법이 있음.

1. 전용 플래시 메모리 프로그래밍 장비를 이용하여 탑재하는 방법

개발 중에는 사용하지 않고 양살할 때에 사용함.

-> 사용하지 않는 추세.

 

2. 전용 디버깅 툴과 ICE 장비를 사용하여 플래시에 탑재하는 방법.

440쪽에 언급했었음. 이 방법은 개발 중에 부트로더를 플래시에 탑재하는 가장 좋은 방법으로 디버깅할 수있음.

하지만 고가의 ICE장비가 필요.

 

3. JTAG 동글을 활용하여 플래시에 탑재하는 방법

440쪽에 언급했엇음. 저가로 쉽게 구현하여 사용할 수 있기 때문에 널리 사용됨.

 

4. 기존에 탑재된 부트로더를 이용하여 탑재하는 방법

이 방법은 기존에 동작하는 부트로더가 있는 것을 가정하고 있음.

그래서 일부 부트로더의 기능이 수정되거나 기능이 추가될 때 사용할 수 있음.

 

4번째 방법에 관해서.

- 대부분의 부트로더는 시리얼, USB, 네트워크 장치를 이용한 프로그램의 다운로드 및 실행 기능을 지원함.

- 이 책에서 사용되는, (ARM으로 배우는 임베디드 리눅스 시스템) 부트로더도,

 시리얼과 USB를 이용한 다운로드 기능을 지원함.

 

- DTK4412에서 사용하는 부트로더의 USB 다운로드 명령은 dnw임.

  - dnw라는 명령은 USB를 이용한 다운로드를 구현함 프로그램인데, 삼성에서 개발함.

  - 이 명령은 타깃의 U-Boot 콘솔에서 실행됨.

  - dnw 다음의 41e00000은 이미지를 다운로드해서 사용할 타깃 보드의 주 메모리 주소를 나타냄.

  - 다운로드 이후에 체크섬에 문제가 없으면 다운로드가 정상 종료된 것임.

 

- dnw

호스트 컴퓨터에서 dnw 프로토콜에 맞도록 바이너리 파일 전송 방법은 smdk-usbdl유틸리티를 사용함.

방법은 아래와 같음

$ smdk-usbdl -f <파일이름> -a <다운로드 우치>

<파일 이름>은 타깃으로 전송하려는 파일 이름이고, <다운로드 위치>는 타깃의 다운로드 메모리 위치를 지정.

 

아래의 명령은 호스틑에서 smdk-usbdl 명령을 사용하여 u-boot.bin을 해당 메모리 위치로 전송.

# ./smdk-usbdl -f u-boot.bin -a 0x41e00000

 

- 다운로드 이후에는, 저장 장치에 기록하는 U-boot 명령을 이용하여,

U-Boot를 타깃에 탑재함.

 

- 예를 들어,

  * NAND 플래시를 사용한다면,    nand erase와 nand write 명령을 이용하면 됨.

  * SD 또는 MMC 장치를 사용한다면,    movi 명령을 사용하면 됨.

각 장치마다 해당 장치에 맞는 기록방법을 이용해 메모리에 저장하면 됨.

 

다음은 일례로,

SD/MMC에 각 이미지를 기록하는 U-Boot 명령을 사용하는 방법을 보여준다.

 

// Initialize moviNAND and show card info

movi init 

// Read data from sd/mmc

movi read (u-boot | kernel } {device_number} {addr}

// Write data to sd/mmc

movi write {fwbl1 | u-boot | kernel} device_number} {addr}

// Write rootfs data to sd/mmc by size

movi write rootfs {device_number} {addr} [bytes(hex)]

// instead of this, you can see "mmc write"

movi write {sector#} {device_number} {bytes(hex)} {addr}

 

- exynos4412와 SD/MMC 또는 eMMC를 부트디바이스로 사용하는 경우,

위에서 생성된 u-boot.bin을 2개 부분으로 나누어 각 파티션에 저장해 사용함.

- 근래에는 dnw 명령보다 fastboot 명령을 많이 사용함.

 

U-Boot 실행

- 업데이트 프로그램이 종료되면, 부트 디바이스의 부트 영역에는 새로운 U-Boot 이미지가 탑재됨.

- 새 이미지를 이용하여 시스템이 다시 시작됨.

- 이때 화면을 보면 U-Boot가 빌드된 날짜와 시간을 확인할 수 있음.

 

U-Boot 활용

- U-Boot 탑재를 완료했으니, 명령행에서 help를 입력하여, U-Boot 명령어를 확인할 수 있음.

- 몇가지 U-boot에 관한 중요 명령어는 아래와 같음

 

(U-Boot 프롬프트에서 help 명령을 입력한 화면)

DTK4412 # help

? - alias for 'help'

....

 

[표 15-6] 주로 사용되는 U-Boot 명령어 (p547)

명령어 설명
bdinfo 타깃 보드에 대한 정보를 출력
coninfo 콘솔 장치에 대한 디바이스 정보를 출력
iminfo 이미지 헤더 정보를 출력
base 메모리의 베이스 주소를 설정하거나 출력
cp 메모리의 내용을 복사(byte, word, long word)

 

 

환경 변수 설정

- U-Boot는 다양한 환경 변수를 설정하여 사용할 수 있음.

- U-Boot에서 설정 가능한 환경변수는

  - 운영체제 부팅 방법 및 부팅에 필요한 환경,

  - 네트워크 사용에 필요한 환경,

  - 표준입출력 장치에 대한 환경 변수.

등이 있고, 개발자에 의해 추가될 수 있음.

 

표 15-7 U-Boot의 환경 설정 명령

명령 용도
printenv 현재 설정된 환경 변수 출력
setenv [변수 이름] [설정값] 환경 변수 설정
saveenv 설정된 환경 변수 기록

- U-Boot의 기본 환경 변수는 대상 보드별 환경 설정 정보를 지정하는 파일인, include/configs/dtk4412.h에 있는 값이 사용됨.

- saveenv 명령에 의해 환경 변수는 플래시 또는 EEPROM과 같은 기록장치에 저장됨.

 

[표 15-8] 주요한 U-Boot 환경변수

변수 이름 내용
autoload 변수값이 no나 n으로 설정된다면 rarp, bootp, dhcp 명령은 BOOTP/DHCP 서버로부터 검색된 서버 정보를 통해 다운로드함. 그렇지 않은 경우 TFTP를 사용하여 다운로드 함.
autostart rarp, bootp, dhcp, tftp, disk, doob를 통해 로드된 부트 이미지를 자동으로 시작함.
bootargs 부팅 시 커널에 전달할 인수

 

- 환경 변수의 설정값 변경은 setenv 명령을 사용함.

- 변경된 환경변수는 saveenv 명령에 의해 이뤄짐.

DTK4412 # setenv ipaddr 192.168.1.10

dtk4412 # saveenv

Saving Environment to Flash....

 

 

다운로드

- 다운로드는 새로운 운영체제 커널이미지, 파일시스템 이미지를 비롯한 필요한 파일을 주메모리(SDRAM) 또는 플래시메모리에 내려받아 탑재하는 것을 말함.

- 일반적으로 다운로드 되는 파일은 주메모리에 탑재됨.

 

- DTK2440으로 만들어진 U-BOOT는 아래의 표 15-9와 같이 크게 3가지 방법으로 다운로드 가능,

명령 용도 사용법 예제
loadb 시리얼로 다운로드 loadb [주소] 속도 loadb 40008000 115200
dnw USB 다운로드 dnw [주소] dnw 40008000
fastboot USB 다운로드 fastboot fastboot

- 시리얼의 경우 속도를 지정해야함. 시리얼은 속도가 느리기 때문에, 커널이나 파일 시스템 이미지를 내려받는데 무리가 있기 때문.

- 하지만, 시리얼의 경우, 최초 U-Boot 개발 및 포팅 시 또는 간단한 앱을 내려받아 실행하는 경우엔 자주 사용됨.

 

fastboot.

- USB 인터페이스를 지원하는 U-Boot 명령으로 dnw와 fastboot 가 있음.

- fastboot는 호스트의 fastboot 응용 프로그램이 타깃과 USB로 통신함.

  - 이렇게 통신하여, 이미지를 플래시나 기타 기록 장치에 저장함.

- 이 프로토콜은 안드로이드 플랫폼에서 사용하는 ADB 기능의 일부를 사용함.

- 실제로 안드로이드에서 커널 및 파일시스템을 저장할 때 많이 사용됨

 

- 다음은 타깃의 U-Boot 콘솔에서 fastboot 명령을 실행하는 방법.

DTK4412# fastboot

[Partition table on MoviNAND]

ptn 0 name = 'fwbl1' start = 0x2 len = N/A (use hard-coded info. (cmd: movi))

...

 

- 이제 호스트에서 fastboot 명령으로 필요한 이미지를 기록하자

$ fastboot flash kernel

 

- dnw 명령어는 플래시나 기타 기록 장치에 저장하지 않는다.

  - 그리고, 간단하게 메모리로 내려 받아서 사용하는 경우 유용한다.

- 다음은 타깃의 U-Boot 콘솔에서 커널 이미지를 내려받기 위해 대기하는 명령.

DTK4412# dnw 40008000

OTG cable Connected!

Now, Waiting for DNW to transmit data

 

- 이 화면이 U-Boot에 출력이 되면, 호스트에서 DNW 애플리케이션을 이용하여 파일을 내려받을 수 있다.

- 다음은 리눅스용 DNW 앱 프로그램 smdk-usbdl 명령을 이용해서 커널 이미지를 전송하는 화면.

[root@localhost linux-3.6.9]# smdk-usbdl -f arch/arm/boot/zImage -a 40008000

SMDK42XX, S3C64XX USB Download Tool

...

 

- U-Boot 명령어인 loadb나 dnw를 사용하면 일반적으로 DRAM에 내려받는다.

 

 

임베디드 리눅스 부팅

- U-Boot환경에서 임베디드 리눅스를 부팅하기.

  - (1) 커널이미지와 (2)RAMDISK 루트 파일시스템 이미지를 타깃 보드로 내려받아야 함.

 

 

 

RAMDISK와 커널이미지

  - RAMDISK는 DRAM 영역을 블록 장치처럼 사용하게 해줌.

  - 커널이미지는 일반적으로 데이터 양을 줄이기 위해 압축된 zImage를 사용함.

 

bootm명령어

- 이 명령어는 주 메모리에 있는 압축된 커널 이미지 zImage를 실행하는 명령어임.

# bootm [주소]

 

다음은 타깃보드 DTK4412에서 커널을 실행하고 부팅하는 화면이다.

DTK4412# bootm 40008000

Boot wit zImage

 

Starting kernel ...

 

Uncompressing Linux...  done, booting the kernel.

Booting Linux on physical CPU 0

Linux version 3.6.9 (root@localhost.localdomain) (gcc version 4.6.3 (Sourcery CodBench ...

Machine: DTK4412

Memory policy: ECC disabled, Data cache writealloc

CPU EXYNOS4412 (id 0xe4412211)

 

자동 부트 지원

- 자동 부팅이란, 인가되거나 리셋되면서 부트로더가 스스로 플래시 메모리나, 호스트 컴퓨터에 있는 이미지를, 주메모리에 탑재하여 실행하는 것을 말함.

  - 개발 중에는 리셋 키를 누르거나, 전원을 켜면,  호스트 컴퓨터에 있는 커널 이미지를 내려받고 자동으로 실행하여 운영체제가 부팅되도록 할 수 있음.

  - 개발이 완료된 후에는 리셋 키 입력이나 전원 인가 후, 자동으로 플래시 메모리에 있는 이미지를 주메모리에 복사하고 운영체제를 부팅할 수 있음.

 

- 자동부팅은, U-Boot 환경 변수를 설정하여 지원됨.

- 자동부팅과 관련된 명령어는 bootcmd와 bootdelay가 있음.

    - bootcmd는 U-Boot의 초기화 완료 후 자동으로 실행되는 명령을 지정.

    - bootdelay는 bootcmd를 실행하기 전, 대기 시간을 지정. 대기 시간 중에는 사용자의 키 입력에 따라 자동 부팅 과정을 중지시킬 수 있음.

 

SD/MMC에 저장된 커널 이미지를 이용하여 자동 부팅하도록 설정하기

앞에서 배운 U-Boot의 환경 변수 지정 명령을 사용하여 bootcmd 명령을 다음과 같이 변경.

 

DTK4412# setenv bootcmd 'movi read kernel 0 40008000; bootm 40008000'

DTK4412# saveenv

 

- bootcmd 안에 있는 명령어는, SD/MC의 디바이스 번호 0에서 커널 이미지를 DRAM의 0x40008000으로 로드한 다음, 이주소에서 바로 커널을 부팅하는 예임.

- 따라서, 이걸 적용하면, 시스템 리셋 키를 입력하거나 전원을 새로 인가하면 자동으로 커널을 DRAM의 0x40008000으로 로드한 후 부팅함.

- 딜레이를 주고 싶으면, 아래와 같이 bootdelay 변수를 적용해보자.

DTK4412# setenv bootdelay 2

DTK4412# saveenv

 

이 설정은 2초간 대기한 후, 아무런 키 입력이 없으면, 설정된 bootcmd에 따라 부팅함.

 

U-Boot 포팅

- 새로운 SOC나 시스템을 개발하는 경우, 그 시스템에 맞게 소스를 수정하여 개발하려는 SOC와 보드에 맞도록 포팅해야됨.

- 포팅에 필요한 대부분 소스는 arch/arm/cpu 디렉터리board 디렉터리에 존재

- 새로운 타깃에 포팅하는 경우, 포팅하려는 타깃과 가장 유사한 타깃을 선정한 후,

    - 에러 없이 빌드하여 이미지를 생성한 후

    - 필요한 파일을 수정한다.

 

U-Boot  포팅에 필요한 소스 및 타깃

p555 표 15-10. 하드웨어 동작 관련 디렉터리 파일

 

 

U-Boot 초기화 동작의 이해

- U-Boot는 시스템에 리셋 키가 입력되거나, 전원이 인가되면 실행되는 부트코드다. (Exynos4412는 조금 다름. OM(Operating Mode)에 따라서 부트 디바이스를 찾고 나서야 사용자 부트로더가 실행됨)

 

- 일반적으로 부트코드가 NOR플래시에 저장되어 사용되는 경우;

    - 바로 부트코드를 플래시에서 동작하게 구현할 수 있음.

 

- 하지만, 근래 대부분의 시스템은 부트코드가 NOR 플래시가 아닌, NAND 플래시 또는 SM/MMC와 같은 장치에 저장되어 있음.

    - 이런 경우, 직접 부트코드를 실행할 수 없음.

    - 그래서, 대부분 저장 장치에 있는 부트코드를 실행 가능한 주메모리(일반적으로 DRAM)로 복사한 후 실행.

    - 현재 이 책에서 설명되는 DTK4412의 경웨도 마찬가지임.

    - 부트코드가 MMC 디바이스에 저장되며, 부팅 후에는 주메모리로 복사되어 사용됨.

    - 이때 고려할 사항이 주메모리 초기화임.

 

주메모리 초기화

- 이 주메모리 초기화는 초기 설정이 필요 없는 칩 내부의 SRAM에서 담당함.

- 칩 내부의 SRAM에 비해, U-Boot 코드가 상당히 큼. 그래서, 모든 코드를 SRAM으로 복사해서 사용할 수 없음.

- 그래서;

    - Exynos와 같은 칩은 부트로더에서 클록이나 메모리 장치 초기화를 담당하는 코드

    - 메인 부트로더 코드를 복사하는 코드를,

        SRAM에 복사하여 사용함.

 

초기화가 완료되면, 주메모리나머지 부트로더 코드를 복사하여 사용함.

 

 이에 따라 U-Boot는 초기에 SRAM에 복사되어 실행되는 BL1 주 U-Boot 코드로 나뉨.

 

- BL1은 부트로더 코드의, 맨 앞쪽에 위치한 일부 코드임.

    - 이 코드는,

        - 시스템 클록과 DRAM 등 주요 하드웨어의 초기화를 담당함.

        - 부트 디바이스에 있는 U-Boot의 모든 코드를 주메모리로 복사함.

        - 주메모리의 U-Boot에 제어권을 넘김.

 

그림 15-2. U-Boot와 BL1 이미지

BL1 u-boot.bin

 

 

U-Boot를 사용하여, 시스템이 부팅되는 과정은 다음과 같음.

1. 전원 인가 또는 리셋 신호 구동 후 내부 ROM 코드 BL0 실행

2. BL0에서는 외부 핀 OM에 따라 부트 디바이스 선택

3. 선택된 부트 디바이스초기 부트코드(BL1)내부 SRAM에 복사

4. SRAM의 BL1에서 U-Boot 부트코드를 DRAM에 복사

5. 제어권을 복사된 DRAM의 U-Boot 영역으로 변경, 변경 후에는 U-Boot 코드 실행.

 

 

 

..(작성중)..

 

 

 

 

 

 

 

---

NAND 플래시란.

 

 

SD 또는 MMC란.

 

 

플래시 메모리란?

- 전기적으로 데이터를 지우고 다시 기록할 수 있는 기억장치

- 전원이 공급되지 않더라도, 기존에 저장된 데이터는 그대로 존재하는 불 휘발성 메모리 (Non-volatile Mermory)

- EPROM -> EEPROM을 거쳐, 현재 사용되고 있는 플래시 메모리의 모습으로 진화함.

- 현재 MP3 Player, Note Book, Smart Phone, Tablet PC등 휴대용 전자기기, 그리고 USB Drive, 그리고 eMCC 및 SSD 등 다양한 플래시 메모리의 수요가 있음.

 

  NAND 플래시 메모리

플래시 메모리는 낸드형(NAND-type)과 노어형(NOR-type)이 있음.

이는 플래시 메모리 기본 소자의 구성형태가 마치 Logic gate의 NAND 및 NOR gate의 Pulldown을 형성하고 있는 부분의 모양과 유사한 데에서 유래함.

 

  - NAND 플래시 메모리

    - 고집적화가 용이, 고 용량 데이터 저장용.

    - 메모리 셀 unit의 contact 수가 적음.

 

  - NOR 플래시 메모리

    - Byte단위의 고속 sensing이 가능함.

    - 비번하게 개서하는 저 용량 데이터 저장용으로 주로 사용.

 

 

 

https://www.koreascience.or.kr/article/JAKO201216238707699.pdf

 

 

 

 

반응형