Boot Loader가 하는 일중에 여러가지가 있지만, 하드웨어의 기본적인 Init이후 Boot Loader를 구동하게 됩니다.
Flash Memory에 있는 Boot Loader Image를 RAM에 Load하고 해당 주소로 Jump하는 것이 있습니다.

Boot Loader를 보면 ARM Assembly 로 되어 있습니다.
어떻게 Jump하는지 보도록 하지요

add r2, pc, #CODEINRAM-(.+8)                                        ; 1
sub r2, #BOOTLOADER_IMAGE_FLASH_OFFSET                ; 2
ldr   r1, =BOOTLOADER_IMAGE_START_ADDRESS_IN_RAM ; 3
add r1, r1, r2
mov pc, r1

자 이게 핵심 소스 이지요 ㅋ
- 해당 소스는 WinCE 6.0 Evaluation 180days에 있는 MAINSTONE BSP중 Eboot의 Startup.S의 일부입니다.

먼저 CODEINRAM, BOOTLOADER_IMAGE_FLASH_OFFSET, BOOTLOADER_IMAGE_START_ADDRESS_IN_RAM 이 세가지는 include 파일에 이미 정의되어 있습니다. C언어에서의 Constant로 보면 되겠지요 ㅋ

1. add r2, pc, #CODEINRAM-(.+8)
- 사전 용어 설명이 필요하겠지요?
r2는 register, pc는 program counter, #CODEINRAM 은 상수, .은 address of current instruction, +8은 two dword
그럼 설명 들어 갑니다.
pc는 current instruction이 수행되고 있을때, address of next instruction을 가지고 있습니다.
그러면 pc = (.+8) --> pc = current + two dword로 같다고 생각할 수 있습니다.
하지만, ARM Instruction Set을 살펴보면 일반적인 32bit Instruction과 16bit Instruction인 Thumb Instruction이 있습니다. 따라서 위에서 설명한 것처럼 항상 32bit는 아니기에 pc 와 (.+8)은 항상 같다고는 말할 수 없죠
그러면 이런것은 안될까 생각하실 껍니다.
mov r2, #CODEINRAM or ldr r2, =CODEINRAM
이거.. 절대 안됩니다. CODEINRAM은 code상 Flash에 있지만 이것을 실행하기 위해 현재 RAM에 적재되어 있죠
따라서 현재 PC는 Flash영역의 Address를 가리키고 있고 우리가 수행하고자 하는 것은 RAM영역의 Address인겁니다. 따라서 저렇게 하시면 절대 안됩니다. 아마 존재하지도 않는 Address를 가리키는 것으로 Boot Loader가 뻗겠지요?

=====================================================================================================

아~ 이런 벌써 시간이 이렇게 되었군요
워크샵 갈 시간입니다. ;;;;;
다음 설명은 다녀와서 할께요 ^^

===================================================================================

add issue

device driver -> block device -> loopback device -> initrd

file system -> NFS uncheck

그외 불필요한거 삭제 ->MTD, 기타 등등
그래야 zImage 용량이 줄어든다 크허허허허허허허

===================================================================================

linux kernel porting sequence

- modify machine code
$(kerneldir)/arch/arm/boot/compressed/head-xscale.S 수정

mainstone을 기준으로 변경한다 -> mainstone은 100번이 넘기 때문에 mov로 안되고 ldr로 해야 한다

- Makefile 수정
ARCH := arm
CROSS_COMPILE := arm-linux-

- $(kdir)/include/asm/arch-pxa/debug-macro.S
orr   \rx, \rx, 0x00100000 -> 0x00700000     @ FFUART-> STUART

-$(kdir)/include/asm-arm/arch-pxa/uncompressed.h
#define   FFUART -> STUART

-$(kdir)/arch/arm/kernel/setup.c
#define MEM_SIZE (16*1024*1024) -> (128*1024*1024)

- $(kdir)/arch/arm/mach-pxa/mainstone.c
memory mapping 수정
io_desc memory map을 참조하여 수정

- kernel configuration
boot command
="root=/dev/ram0 initrd=0xa0400000,5M ramdisk=12288 console=ttyS2,115200 mem=128M rw"

- make mainstone_defconfig
이후 불필요한 device driver 삭제 -> kernel zImage 용량을 줄이기 위해

- file system
ext2 file system
ext2 file system extend

이정도만 고치면 될듯 ㅡㅡㅋ

===================================================================================

일단 정했습니다 ㅋ
무엇을 할지 ;;;
뭔지는 비밀 ;;;
근데 이게 reject 되면...
대략 낭패 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이걸 하는 당위성을 잘 설명하면 될지도 ;;;
크허허허 머리속에 시상이 -_-;;;

===================================================================================

정말 요즘들어서 할게 너무 많네요 ㅋ
여기에라도 글을 적어 우선순위를 좀 정해봐야 겠네요

KBS 합숙 면접 준비 - 11월 16, 17일
Embedded App Software Project - 11월 12일 기획안 제출
RBC Protocol Coding & Study - 11월 13, 14일
Toeic Study = 11월 12일 오전 11시
Embedded System Software Device Driver PT - 11월 13일 오전 10시 30분

간단하게 기억나는데로 적었는데 대략 난감하네요 ㅋ
KBS는 뭘 해야 할지 정확히 모르겠네요 ㅋ
기말 프로젝트 기획안은
pxa255기반 보드에서(정확히는 Tynux TB-XT)
1. USB Gadget을 이용한 USB device 기능 구현
2. Linux 2.6 기본 포팅
3. Video4Linux 기반 캠코더 기능 구현
위 세가지 가운데 하나를 택해야 하고
RBC는 개념만 어렵풋하게 잡혀 있고 공부하고픈 마음은 그다지 ;;;
토익은 어쩔 수 없이.. 저의 스펙이 허접하기에 ㅡㅜ 훗날을 위한 투자
임베디드 PT는 SPI in wince... 도무지 감을 못잡겠네요
PPT만든게 맞는지도 모르겠고...

졸린거 같기는 한데... 할게 많다 보니 잠은 안오고 말이죠 ;;;;
웃기군요 음...
하나씩 마무리 해야 겠습니다.
USB Gadget하면 좋을꺼 같기도 한데... 문서를 잠깐 살펴봤으나... 영어가 저의 발목을 또 잡더군요 ㅋ
Video4Linux도 좀 찾아봐야 겠네요... 마음 같아선... Linux 2.6 기본 포팅을 하면 좋겠는데 말이죠...
그건... 정말 마음 잡고 하면... 거짓말 하나 안보태고 ;;;; 하루 밤 새면 다 하겠네요... 이틀 째 보고서...
그리고는 GG 푸헐;;;;

이거 푸념이 섞여 버렸군요 ㅋㅋ

===================================================================================

TAG embedded