레이블이 bootloader인 게시물을 표시합니다. 모든 게시물 표시
레이블이 bootloader인 게시물을 표시합니다. 모든 게시물 표시

2010년 1월 21일 목요일

MIPS memory map

MIPS 부트코드를 보다가 cached, uncached 라는 것을 발견해서 memory map을 좀 찾아 보았다.


이것이 MIPS의 메모리 구조이다.
각 영역에 대한 설명은 다음과 같다.

  • KUSEG
    • 사용자가 사용하는 공간
    • TLB를 통해 physical addr로 변환
  • KSEG0 (512M)
    • cached (항상 cache를 사용함)
    • cache 초기화 이후에 사용
    • 상위 1bit (최상위 bit)를 0으로 만들어 physical addr로 변환
    • TLB를 거치지 않고 access
    • 커널이 이 영역을 사용
  • KSEG1(512M)
    • uncached (cache를 사용하지 않음)
    • 시스템에서 cache가 정의되기 이전에 사용. (ex. reset vector addr = 0xBFC00000)
    • 상위 3bit를 0으로 만들어 physical addr로 변환
    • I/O 주변기기에 mapping (I/O 장치들은 그 특성상 cache를 사용해서는 안됨.)
  • KSEG2(512M)
    • 커널을 통해서 access 가능
    • TLB를 통해 physical addr로 변환

Nand Flash Block 구조

보드는 RMI, Au1250 MISP cpu를 사용하고.
아무튼, 부트로더를 올리기 위해서 nand flash 구조를 그려봤다.


알게 된 사실은 bootloader image를 2M까지 키워도 된다는 것.
용량 부담없이 마구 수정해야겠다-_-)> 훗.
엇, 부팅 이미지도 2M까지 받을 수 있구나. 이쁜 언냐로다가... 화질 좋은 걸로다가 ... 흐흐...


아, 또 하나.
nand에는 Large Block과 Small Block이 있는데, 둘의 차이는 page 크기의 차이로 보인다.

우선,
Large Block
1 Page = 2Kbytes
1 Block = 64Pages(0~63) = 128KB
NAND = 1024Blocks(0~1023) = 40M(맞나?;;)

Small Block
1 Page = 512Bytes
1 Block = 32Pages(0~31) = 16KB
NAND = 2048Blocks(0~2047) = 20M(맞나?;;)

2008년 7월 21일 월요일

bootloader porting with T32

BOX-X에 redboot을 포팅하는데 2주 걸렸다-_-) 이런, 수박바.

정말.. 끝내주는 삽질이었다-_-;

우선 T32를 이용한 cmm파일은 다음과 같다.
========================================================================================
B::

RESET
SYSTEM.OPTION waitreset.on
SYSTEM.CPU PXA255
SYSTEM.UP

Break.RESET
FLASH.RESET
FLASH.CREATE 0x00000000--0x3fffff 0x20000 I28F001J3 BYTE
FLASH.ERASE ALL
print "erase done"

FLASH.PROGRAM ALL
DATA.LOAD.binary Y:\x-station\u-boot-1.2.0-xstation\u-boot.bin 0x0 /word
FLASH.PROGRAM OFF
ENDDO
===========================================================================================

그리고 삽질끝에 알아낸 memory controller register value!!
보드는 CPU - PXA255에 flash - Inter strata flash 28F128이다.

D.S 0x48000000 %l 0x00000000 ;MDCNFG
D.S 0x48000004 %l 0x03CA4FFF ;MDREFR
D.S 0x48000008 %l 0x7FF07FF0 ;MSC0
D.S 0x4800000C %l 0x7FF07FF0 ;MSC1
D.S 0x48000010 %l 0x7FF07FF0 ;MSC2
D.S 0x48000014 %l 0x00000000 ;MECR
D.S 0x48000018 %l 0x00000000 ;SXLCR
D.S 0x4800001C %l 0x00040004 ;SXCNFG
D.S 0x48000020 %l 0x01FE01FE
D.S 0x48000024 %l 0x00000000 ;SXMRS
D.S 0x48000028 %l 0x00000000 ;MCMEM0
D.S 0x4800002C %l 0x00000000 ;MCMEM1
D.S 0x48000030 %l 0x00000000 ;MCATT0
D.S 0x48000034 %l 0x00000000 ;MCATT1
D.S 0x48000038 %l 0x00000000 ;MCIO0
D.S 0x4800003C %l 0x00000000 ;MCIO1
D.S 0x48000040 %l 0x00220022 ;MDMRS
D.S 0x48000044 %l 0x00000008 ;BOOT_DEF
D.S 0x48000058 %l 0x00000000 ;MDMRSLP

비록 cmm파일에 쓰이지 않았지만, 삽질의 결과다-_ㅠ) 흑흑..

2008년 7월 4일 금요일

redboot올릴 보드#2

IMO보드에 이어서 받은 보드는 타이눅스 BOX-X.

CPU: PXA255(Intel)
SDRAM: MT48LC8M16(Micron)
Flash: Strata E28F128(Intel)


아쉽게도 이 보드를 만든 팜팜테크가 현존하지 못해... 혼자 삽질해가야 겠다.ㅠ
bootloader라도 있어 다행이지만,

현재... flash날라간 상태.

2008년 4월 28일 월요일

REDBOOT (ver. smdk2410)

 
<< REDBOOT 소스 분석 >>



시스템이 시작되는 곳

arm.ld 소스보기





exception handler 중 reset_vector

vector.S 소스보기





platform마다의 다른 설정(arm9/smdk2410에 맞게 설정)
hardware에 dependent하다.

Hal_platform_setup.h 소스보기





memory management unit 초기화 및 TTB, virtual memory 설정

Smdk2410_misc.c 소스보기

2008년 1월 17일 목요일

시스템 초기화 루틴


시스템 초기화 루틴이란,
시스템에 power on 한 후 커널의 main 코드를 실행시키기 직전까지 수행시키는 일을 말한다. 즉, 커널에 주도권을 넘겨주기 전에 커널을 시스템상에 올리기 위하여 하는 일을 뜻한다.

power on 또는 reset시에 최초로 수행되는 부분이며, 메모리 0x0번지 부터 읽혀진다. 보통은 bank0의 flash memory에 위치한다.


초기화 루틴은 몇가지 단계를 거쳐 이루어지는데 다음과 같다.

Exception Vector Init → Disable Watch Dog Timer → Disable Interrupt → Clock Configuration → Memory Bank Init → Stack Init → Setup Exception Handler → Init Data Area → Jump to Main

즉, 초기화 단계는 Exception Vector를 설정하고 Exception Handler를 작성하고 메모리 시스템과 stack pointer를 초기화 하는 과정을 거치며 마지막에 C코드로 진입하게 된다.



2007년 11월 2일 금요일

bootloader란

bootloader는 다른말로 bootstrap이라고 하는데 이 말의 어원은 boot(장화) + strap(끈)에서 비롯되었다.
장화의 끈을 묶고 일어서려는 사람이라는 설도 있고, 장화끈을 묶어주는 사람이라는 설도 있는데 아무튼 출발하기 직전의 준비작업이라는 의미가 되는 것 같다.

컴퓨터에서 bootloader는 OS의 최소부분을 메모리로 올려 프로세서가 이를 실행할 수 있게 해주는 일을 하는 녀석이다.
컴퓨터에 전원이 들어오면 시스템을 정상적으로 작동시킬 수 있도록 소프트웨어 및 하드웨어를 초기화 시키고 (Memory setting, CPU clock setting GPIO setting, Serial setting MAC address, Ethernet port setting 등) 커널을 부팅시키는 일을 한다.
하드웨어에 dependent하게 짜여져 있기 때문에 어셈코드가 많으며 flash메모리에 저장되기 때문에 크기가 매우 작다.

부트로더는 메모리로 운영체제를 읽어들이는 역할을 한다.
전원이 들어오면 가장 먼저 수행되어야 하기 때문에 항상 ROM같은 비휘발성 메모리에 보관되어 있다.
부트로더의 가장 큰 역할은 시스템의 초기화 이다.
CPU내의 MMU와 캐시를 활성화시키고 RT클럭과 하드웨어 등을 초기화 시킨다.


그렇기 때문에 bootloader에 대해서 공부하기 위해서는 clock 및 메모리 장치, flash를 잘 알아야하고, C와 assembler를 다룰 줄 알아야 한다.


bootloader의 종류는 매우 많은데 가장 많이 알려진 것들은 다음과 같다.

GRUB: Grand Unified Bootloader GNU 프로젝트 부트로더
LILO: linux loader x86기반의 리눅스
redboot: 레드햇에서 개발된 부트로더, eCos기반
U-boot: universal Bootloader PPCBoot와 ARMBoot를 타깃으로 개발(두개를 합친 것), 환경설정이 쉽다는 장점이 있다.
EZBoot: EZ-X5보드를 위하여 개발된 것으로 부트로더의 장점을 취합
BLOB: arm프로세서 기반의 하드웨어를 위해 개발. 아사벳보드 등
PMON: PROM Moniter MIPSqhem를 지원하기 위해 개발