Presentation is loading. Please wait.

Presentation is loading. Please wait.

8. Porting.

Similar presentations


Presentation on theme: "8. Porting."— Presentation transcript:

1 8. Porting

2 8. porting 목 차 Bootloader compile Kernel Ramdisk JFFS2

3 8.1 Overview

4 1. Overview Target System HOST System JTAG 2. Download
JTAG Interface Serial Interface or Ethernet Interface Boot Loader FLASH Memory Linux Kernel Root File System User File system SDRAM HOST System 3.Fusing 1.Fusing 2. Download JTAG Target System

5 1. Overview 필수 구성 요소 Target System을 구동하기 위해서는 적어도 다음의 3가지 구성요소가 필요하다.
Boot Loader 하드웨어를 초기화하고 kernel image를 SDRAM에 올려주어 수행을 넘겨주는 역할을 하는 프로그램 OS Kernel OS 의 핵심 프로그램 Root File System Kernel 에서 사용할 File System

6 1. Overview 추가 구성 요소 Target System을 보다 효율적으로 사용하기 위해 user file system을 추가 할 수 있다. User File System Root file system 에 포함되지 않은 utility나 data file등을 위해 추가적으로 사용할 file system

7 1. Overview What is Boot Loader? 시스템이 부팅될 때 가장 먼저 실행되는 프로그램
Main Function Hardware Initialization CPU clock, Memory timing, interrupt, UART, ETC. PC의 BIOS Kernel Load 운영 체제를 RAM에 올려주고 실행. Additional Function Target board에 개발한 program을 전송하기 위한 기능들. Download Image to SDRAM Serial – xmodem, uuencode Ethernet – tftp, bootp Fusing Flash Rom Write, Read, Erase, Lock/Unlock Embedded System 에서의 Boot Loader란 PC의 BIOS와 OS Loader 의 기능을 수행하는 프로그램으로 시스템이 부팅될 때 가장 먼저 수행되는 프로그램이다. 부트로더의 기본적인 기능(필수 기능)으로는 하드웨어의 초기화와 커널의 load이다. CPU의 clock 이나, 메모리의 timing, interrupt vector, UART등 시스템의 하드웨어를 초기화하여 OS가 동작할 수 있는 환경을 만든 후, OS의 핵심 프로그램인 커널을 RAM에 올리고 실행시켜 주는 것이다. Embedded System 에서는 Boot Loader는 필수 기능 뿐 아니라 System 의 개발을 돕는 부가적인 기능을 가지고 있다. Embedded System은 대부분 개발 System(Host)과 target System이 분리되어있다. 때문에 Host에서 target system에 개발한 프로그램을 전송하기위한 수단이 필요한데 대부분 부트로더에 이러한 기능이 포함되어있다. Serial 을 통해 image를 전송하는 방식으로 xmodem 이나 Uuencode 프로그램이 있고, Ethernet을 통해 전송하는 방식으로는 tftp(간단한 ftp,udp 사용) 나 bootp(시스템이 booting 될 때에 자동으로 network를 설정하고, Server에 연결하여 부팅할 수 있게 해주는 프로토콜) 가 가장 많이 사용된다.

8 1. Overview Boot Loader Operating Sequence
그림은 BLOB의 실행 순서 별로 추적하면서 정리한 것이다. 큰 분류별로 본 것으로 최종적으로 Linux Kernel을 booting하는 것을 목적으로 한다. 가장 먼저 start.S파일에서 시작하게 되고, trampoline.S를 통해서 BLOB의 main() 함수가 정의된 main.c를 실행하게 된다. (from kelp.or.kr, Embedded_Linux_BootLoader_1.pdf)

9 1. Overview Kernel Kernel Image OS의 핵심기능을 수행하는 프로그램
Process management Memory management Device management Network management File System Management API (Application Programming Interface) ETC. Kernel Image Kernel 을 압축한 것으로 boot loader에 의해 압축이 해제되어 SDRAM으로 load 된다. 시스템의 저장 공간을 최소한으로 사용하기 위한 목적으로 압축 상태로 존재

10 1. Overview Root File System
“/” 디렉토리로 마운트 되는 파일 시스템으로 리눅스가 동작하기 위해 기본적으로 필요한 프로그램 및 설정 파일을 가지고 있다. Kernel 에서 기본적인 초기화 작업 후 Root File System을 마운트 한다. Embedded System 은 대부분 크기가 작아야 하므로 hard disk를 가지고 있을 수 없으며, 이로 인해 주로 Ramdisk를 사용하여 Root File System을 구축한다. Root File System이란 “/” 디렉토리로 마운트 되는 파일 시스템으로 리눅스가 동작하기 위해 기본적으로 필요한 프로그램 및 설정 파일을 가지고 있는 파일 시스템이다. Kernel은 boot loader에 의해 sdram에 로드된 후 기본적인 device들과 kernel 내부의 데이터 구조를 초기화 시킨 후 root file system을 찾아 “/” 디렉토리로 마운트 시킨다. Kernel이 root file system을 찾지 못한 경우 시스템은 더 이상 작동하지 못한다. PC의 경우 hard disk에 Root File system을 가지고 있지만Embedded System 은 대부분 크기가 작아야 하므로 hard disk를 가지고 있을 수 없다. 때문에 주로 Ramdisk를 사용하여 Root File System을 구축한다. Root File System은 최소한 다음의 디렉토리들을 가지고 있어야 한다. /dev,/proc,/bin,/etc,/lib,/usr,/tmp 또한 기본적인 동작을 위해 다음의 유틸리티들을 가지고 있어야 한다. sh, ls, cp, mv 등 시스템 명령어 그리고 유틸리티가 런타임 라이브러리를 사용하는 경우 필요한 라이브러리들을 함께 가지고 있어야한다.

11 1. Overview Ramdisk Hard disk 나 floppy 등 Kernel이 사용해야 하는 File System이 없는 경우 RAM을 이러한 용도로 사용할 수 있는데, 이렇게 ram을 disk 처럼 사용하는 것을 이를 Ramdisk라 한다. Flash Memory에 압축된 ramdisk 이미지를 저장한 뒤 부팅할 때마다 ram에 압축을 풀어서 Load한 후 사용한다. 작업 내용을 저장할 수 없다  실행 파일이나 static data를 저장 Embedded System 의 경우 Root File System을 구성하기 위해 ramdisk를 많이 사용한다.

12 1. Overview User File System
Root file system 에 포함되지 않은 utility나 data file등을 위해 추가적으로 사용할 file system 필수 요소는 아니지만 target board를 보다 효율적으로 구성하기 위해서 필요하다. Flash File System으로 제작 Ramdisk와 달리 Flash Memory에 직접 file system을 구현한 것 Flash Memory에 바로 read/write  hard disk와 동일하게 사용 전원이 꺼진 후에도 작업 내용이 Flash Memory에 남아있다. Flash memory는 기록하는 데에 한계가 있으므로 빈번하게 기록과 삭제가 일어나면 짧은 시간에 고장날 수 있다

13 1. Overview JFFS2 Journalling Flash File System
Red Hat에서 개발한 flash file system으로 linux kernel에서 지원 전원이 꺼지더라고 지워지지 않고 남아 있어야 하는 설정 파일이나, ramdisk에 포함되지 않은 프로그램 등을 저장하기 위해 사용

14 1. Overview Target 설정 순서 Target System HOST System JTAG 2. Download
JTAG Interface Serial Interface or Ethernet Interface Boot Loader FLASH Memory Linux Kernel Root File System User File system SDRAM HOST System 3.Fusing 1.Fusing 2. Download JTAG Target System Target System을 구동시키기 위해서는 먼저 하드웨어를 초기화하고 kernel을 실행 시켜 주는 Boot Loader를 개발하여 Target System의 FLASH Memory의 0번지에 Fusing 해 주어야 한다. Target System의 전원을 켜주면 바로 이 FLASH Memory의 0번지가 실행된다. 즉, 이 위치에 Boot Loader를 fusing 해 주었기 때문에 Boot Loader가 실행된다. 임베디드 시스템의 Boot Loader는 하드웨어를 초기화하고 커널을 실행시켜 주는 기능외에도 개발중에( 아직 Target System에 kernel 및 file system이 없을 때) 시리얼 또는 Ethernet 연결을 통해서 커널이나 file system 등의 이미지를 다운로드 할 수 있는 기능을 가지고 있다. 또한 다운받은 이미지를 flash memory에 fusing할 수 있는 기능도 가지고 있다. 그렇기 때문에 Target System을구축하기 위해서는 Boot Loader를 먼저 JTAG를 사용하여 Flash Memory 의 0번지에 fusing한 후 전원을 다시 켜주어 Boot Loader 를 실행한 후 Boot Loader의 기능을 사용하여 Kernel 과 file systme(ramdisk) image를 다운받아 Flash Memory 에 fusing 해야 한다..

15 1. Overview Target Operating 순서 [1] Boot Loader Boot Loader
SDRAM Boot Loader Linux Kernel RAMDISK JFFS2 Target System을 구축한 후에 전원을 켜주면 먼저 Boot Loader가 실행된다. 그리고 Boot Loader가 flash memory에 저장되어있는 kernel 이미지와 Ramdisk Image(Root File System) 를 ram에 올려준 후 kernel 로 수행을 넘겨준다. 1. Power On 2.Execute 0x 3.Load Kernel 4. Load Root File System (RAMDISK) FLASH Memory

16 ‘init’(/sbin/init) process 실행
1. Overview Target Operating 순서 [2] Kernel Root File System 마운트 ‘init’(/sbin/init) process 실행 Login 프롬프트 출력 Kernel 이미지 적재 시스템 초기화 네트워크 설정 호스트 이름 설정 Device 구동 다른 file system 마운트 ETC 파일 시스템 점검 가상 콘솔 접속 관리 ETC. 커널이 sdram에 적재되면 기본적인 device와 내부 변수들을 초기화 한 후에 Root File System의 위치를 찾아 “/” 에 마운트 한다. (Root File System의 위치에 대한 정보는 boot loader로 부터 넘겨 받는다) 그 후 시스템의 최 상위 프로세스인 /sbin/init 를 실행한다. init 프로세스는 시스템을 초기화 한 후에 로그인 프롬프트를 출력한 후 사용자의 접속을 기다린다.

17 부트로더를 컴파일하고 JTAG을 이용하여 flash memory에 fusing 하자
8.2 Bootloader 부트로더를 컴파일하고 JTAG을 이용하여 flash memory에 fusing 하자

18 2. Boot Loader 설치 Boot Loader Compile Boot Loader For Xscale processor
Arm 계열의 processor에서는 BLOB을 주로 사용 Boot Loader source code HUINS에서 제공한 CD의 blob.zip 파일 Kernel source code HUINS에서 제공한 CD의 linux cd.tar.gz 파일 Install Method JTAG: 회로를 디버그 하기 위한 표준 ROM을 타겟 보드에서 분리하지 않아도 된다.

19 2. Boot Loader 설치 Boot Loader Compile
Huins 에서 제공한 cd-rom을 마운트하고 kernel 과 blob 소스를 임의의 디렉토리에 복사한 후 이동 Example에서는 /usr/local/pxa255 에 복사

20 2. Boot Loader 설치 Boot Loader Compile source code 압축 풀기

21 2. Boot Loader 설치 Boot Loader Compile
압축을 풀면 blob 과 linux cd 디렉토리가 생성됨 blob 디렉토리로 이동

22 2. Boot Loader 설치 Boot Loader Compile Makefile 생성 커널 압축 해재후 생성된 디렉토리
Configure는 shell script로 프로그램을 여러 옵션을 통해 다양한 기능을 갖도록 컴파일 하기 위한 것이다. 리눅스에서 Configure는 대부분 shell script로 작성되어 출력으로 Makefile을 생성한다. 위의 예에서 coufigure에 –with-board, --with-linux-prefix, 2가지 옵션을 주었다. –with-board: 는 blob를 사용할 target board 의 이름을 주는 것이다. 이 옵션을 주지 않고 configure를 실행하면 에러가 출력될 것이다. Target board 의 이름으로는 hyper104 와 pxa255_pro 두가지 중 하나를 선택할 수 있도록 되어있다. hyper104는 hybus 사에서 제작한 board의 이름이고 pxa255_pro가 휴인스에서 제작한 board의 이름이다. 그러므로 pxa255_pro를 사용한다. --with-linux-prefix 는 좀 전에 압출을 풀었던 커널 소스 디렉토리를 지정하여 주는 것이다. 이는 blob에서 kenel을 memory에 적재할 때에 인자를 넘겨주거나 할때에 커널과 공유하는 변수나 매크로 등이 있기 때문이다. Make 는 여러 소스로 이루어진 프로그램을 컴파일할 때에 각 소스간의 관계, 컴파일 규칙 등을 관리해주는 유틸이다. Visual studio 등의 visual tool 에서 project 관리를 생각하면 된다.

23 2. Boot Loader 설치 Boot Loader Compile
Host IP address 와 Target IP address 설정 /usr/local/pxa255/blob/include/blob/main.h에 다음 내용 추가 blob 에서는 kernel 과 ramdisk를 download 하기 위해 tftp 를 사용한다. tftp 는 UDP를 사용하여 data를 전송하므로 IP address 를 사용해야 한다. 그렇기 때문에 컴파일 할 때에 host와 target의 IP address를 설정하여 주는 것이다.

24 2. Boot Loader 설치 Boot Loader Compile Compile
make clean은 기존에 생성된 object 파일이나 임시 파일등을 삭제하기 위한 것이다.

25 2. Boot Loader 설치 Boot Loader Compile blob 이미지 확인
/usr/local/pxa255/blob/src/blob/ 에 생성된다.

26 2. Boot Loader 설치 JTAG program 설치 What is JTAG?
Joint European Test Access Group JTAG은 PCB와 IC를 테스트 하기 위한 목적으로 1985년 조직된 JTAG(Joint Test Action Group)에 의해 제정된 표준이다. Boundary Scan Test 칩 내부에 Boundary Cell이란 것을 두어 외부의 핀과 일대 일로 연결시켜 프로세서가 할 수 있는 동작을 중간에 Cell을 통해 모든 동작을 인위적으로 수행할 수 있어 여러 가지 하드웨어 테스트나 연결 상태 등을 체크할 수 있다.

27 2. Boot Loader 설치 JTAG program 설치 JTAG 기능
프로세서(CPU)의 상태와는 상관없이 디바이스의 모든 외부 핀을 구동시키거나 값을 읽어 들일 수 있는 기능을 제공 회로의 배선과 소자의 전기적 연결상태 test 디바이스간의 연결상태 test Flash memory fusing jtag의 위 기능중 blob를 flash memory에 download 하기위해 flash memory fusing을 사용할 것이다.

28 2. Boot Loader 설치 JTAG program 설치 pxa255-pro 의 JTAG 호환 장치(cpu)의 구조 BSR
BSC cpu의 각각의 pin은 BSC (Boundary-Scan Cell)에 연결되어 있고, 이 BSC가 BSR (Boundary-Scan Register)를 이루게 된다. BSC : 각 pin에 대한 bit 단위의 값(혹은 상태)를 가지게 된다. BSR : 모든 BSC이 연결 되어 하나의 Register를 이루게 된다. TDI로부터 입력된 데이터가 shift작업을 통해 적절한 위치에 값을 위치시키거나, 가져올 수 있게 되며, TDO를 통해 이 값이 출력된다. JTAG이 테스트 상태일 경우에 동작하며, IC 동작 상태 일 경우에는 동작 불능 상태가 된다. PXA255-PRO V1.0 보드에서는 CPU의 각 핀의 출력을 SIMULATION 하기 위해서 JTAG를 사용한다. CPU의 각 PIN에 1BIT를 저장할 수있는 CELL(BSC)을 연결하고, 이 CELL 들을 연결하여 하나의 레지스터(BSR)를 구성한다. JTAG가 테스트 상태일 경우 BSR에 값을 기록하여 각 CPU의 각 PIN 의 출력을 원하는 값으로 설정하여 주변 장치에 출력해 줄 수 있다. 이러한 기능을 이용하여 FLASH MEMORY에 ADDRESS, READ/WRITE 신호, DATA 신호를 를 전달하여, DATA 를 FUSING 하거나 저장되어있는 DATA를 읽어 올 수 있다.

29 2. Boot Loader 설치 JTAG program 설치 PC를 통한 JTAG 호환 장치의 제어

30 2. Boot Loader 설치 JTAG program 설치
PXA255-PRO V1.0에서 Host 와 Target의 JTAG Interface Host의 parallel port JTAG port PXA255-PRO V1.0 에서는 host 의 parallel port 와 target 의 J17(JTAG) port를 연결한다. 이때 cable의 빨간 선이 J17 port의 1번 pin에 연결되도록 해야 한다. PC의 parallel port의 주소는 일반적으로 0x378이다.

31 2. Boot Loader 설치 JTAG program 설치 jtag 프로그램
pc에서 jtag interface를 통하여 target system의 flash memory에 data를 fusing 하는 작업을 간편하게 해주는 프로그램 ftp://ftp.arm.uk.linux.org/pub/linux/arm/people/xscale/lubbock/jtag/ 에서 jtag.0624.tar.bz2를 다운 받을 수 있다. PXA255-PRO V1.0 실습 보드에서는 이 보드에 맞게 수정되어 huins에서 제공 하는jtag 프로그램을 사용하여야 한다.

32 2. Boot Loader 설치 JTAG program 설치 설치
Huins에서 제공된 jtag 소스파일(pxa255-jtag.tar.gz)을 임시 디렉토리에 복사한다. Example에서는 /usr/local/pxa255에 복사       압축풀기 % tar xfvz pxa255-jtag.tar.gz 소스 파일이 있는 디렉토리로 이동 % cd pxa255-jtag/jtag-0.4 configure (Makefile 생성) % ./configure --prefix=/usr/local/pxa255/pxa255-jtag --with-include=/usr/local/pxa255/pxa255-jtag/include-0.2.3 compile & install % make; make install configure 에서 -–prefix 옵션은 make를 통해 컴파일 되어 생성된 각 실행 파일 및 설정 파일 등을 make install 명령으로 install 할 때에 어느 디렉토리 아래에 install 할 것인가를 결정하게 된다. 이 옵션을 지정해 주지 않으면 make install 명령에 의해 실행 파일은 대부분 /bin 또는 /usr/bin 에 복사되고 설정 파일은 /etc 또는 그 밖의 default 로 설정된 디렉토리에 복사되게 된다. --with-include 옵션은 컴파일할 때 include할 헤더파일이 있는 위치를 지정하는 것이다. 반드시 절대 경로로 지정한다. 하위 디렉토리에도 적용되기 때문

33 2. Boot Loader 설치 JTAG program 설치 jtag 설치 확인
/usr/local/pxa255/pxa255-jtag 디렉토리로 이동하여 bin 폴더와 share폴더가 생성되었는지 확인한 후, 제대로 되었다면 bin디렉토리를 PATH에 등록한다. 다시 로그인할 때에도 path에 JTAG 디렉토리가 등록 되도록 하려면 자신의 HOME 디렉토리에 있는 .bashrc 파일에 위 내용을 추가해 주면 된다. %vi ~/.bashrc export PATH=$PATH:/usr/local/pxa255/pxa255-jtag/bin/ %source ~/.bashrc

34 2. Boot Loader 설치 JTAG program 설치
이전에 생성한 blob 이미지가 있는 곳으로 이동한 후 jtag를 실행한다.

35 2. Boot Loader 설치 Bootloader Download
다음과 같은 명령을 주어 blob를 flash 메모리의 0번지에 올린다. (약 3~5분 정도 걸린다.) cable: 은 사용할 jtag cable을 선택하는 것이다. 0x378이 일반적인 PC의 parallel 포트이다. PXA255는 cable을 type을 정하는 것으로 huins에서 제작한 PXA255-PRO V1.0보드를 위해서 PXA255라고 적어준 것이다. detect: cable이 제대로 연결되어있는가를 확인하는 것이고 flashmem 0 blob: flashrom 0번지에 blob 파일(jtag를 실행한 디렉토리에 있는)을 저장하겠다는 것이다.

36 2. Boot Loader 설치 Bootloader Download
minicom 을 실행하고 target borad를 reset하여 boot loader가 잘 동작하는가 확인한다.

37 2. Boot Loader 설치 Boot Loader Download 다음과 같은 화면이 보이면 성공한 것이다.
blob이 부팅하고 있는 중간에 아무것이나 key 입력을 해 주어야 한다. 그렇지 않으면 blob는 자동으로 kenerl이 적재될 주소로 jump한다.

38 2. Boot Loader 설치 BLOB의 내부 command
ttftp “host 에서 다운받을 파일명(zImage)” kernel ttftp “host 에서 다운받을 파일명(ramdisk)” ramdisk ttftp “host 에서 다운받을 파일명(blob)” blob 위 의 명령을 주면 host의 /tftpboo 에 있는 해당 파일을 sdram의 정해진 영역으로 download한다. 정해진 영역은 다음장에 설명한다. flash blob flash kernel flash ramdisk 위 명령을 주면 ram의 일정 영역에서 flash의 일정 영역으로 내용을 copy 한다. 복사 범위에 대해서는 다음 장에 설명한다.

39 2. Boot Loader 설치 BLOB의 memory map 0xa7,fff,fff 0xa3,000,000
SDRAM (128M) FLASH ROM (32M) 0x01,fff,fff 0x00,480,000 0x00,280,000 0x00,080,000 0x00,040,000 0x00,000,000 0xa7,fff,fff | JFFS2 0xa3,000,000 ramdisk.gz 0xa0,700,000 BLOB main() 0xa0,400,400 BLOB down image 0xa0,300,000 zImage 0xa0,008,000 0x00,000,000 JFFS2 27.5 Mbytes ramdisk.gz 2 Mbytes zImage parameter 256 Kbytes BLOB 256 kbytes Blob 소스코드가 있는 디렉토리에서 include/blob/arch/pxa255_pro.h 에 보면 위의 메모리 영역에 대한 정의가 있다. Blob에서 ttftp “zImage” kernel 명령을 주면 위 그림에서 sdram 영역의 zImage 영역(0xa ) 부터 zImage를 저장한다. ttftp의 다른 인자들(blob, ramdisk) 도 동일하게 정해진 sdram 영역으로 host에 있는 파일을 복사한다. flash kernel 명령을 주면 sdram의 0xa 의 부터 512kbyte를 flash memory의 0x 에 복사한다. 다른 인자를 주어도 동일하게 정해진 영역의 sdram의 내용을 정해진 영역의 flash memory에 복사한다.

40 8.3 Kernel

41 Target System HOST System JTAG 2. Download Serial Interface or
JTAG Interface Serial Interface or Ethernet Interface Boot Loader FLASH Memory Linux Kernel Root File System User File system SDRAM HOST System 3.Fusing 1.Fusing 2. Download JTAG Target System

42 3. Kernel Make menuconfig

43 3. Kernel Character device  LED GPIO와 KEY GPIO 제거
Led와 key에 대한 device driver를 새로 작성하는 실습을 할 것이므로 kernel에서 이전에 포함되어 있던 led와 key의 device driver를 제거한다.

44 3. Kernel 설정을 저장하고 나온 후 커널 컴파일

45 3. Kernel 컴파일된 kernel 이미지를 /tftpboot 로 복사 blob으로 부팅
% cp ./arch/arm/boot/zImage /tftpboot/ blob으로 부팅 minicom을 실행 한다. blob command mode로 target system booting make zImage 를 통해 컴파일 하면 [kernel]/arch/arm/boot/zImage 에 생성된다.

46 3. Kernel Download Kernel은 sdram의 0xa 에 download 되도록 내부적으로 지정되어있다.

47 3. Kernel Fusing Kernel은 flash memory의 0x 번지부터 쓰도록 지정되어있다.

48 3. Kernel Booting linux kernel

49 3. Kernel Linux login Linux kernel로 booting이 되었다면 ramdisk와 kernel image를 target board에 설치하는 데 성공한 것이다.

50 8.4 Ramdisk

51 Target System HOST System JTAG 2. Download Serial Interface or
JTAG Interface Serial Interface or Ethernet Interface Boot Loader FLASH Memory Linux Kernel Root File System User File system SDRAM HOST System 3.Fusing 1.Fusing 2. Download JTAG Target System

52 4. Ramdisk Ramdisk 제작 순서 HUINS에서 제공한 CD에서 ramdisk.gz를 임의의 디렉토리에 복사한다. Example에서는 /usr/local/pxa255 압축 해제한다. ramdisk를 마운트 할 디렉토리 생성한다. ramdisk 마운트 한다. ramdisk를 마운트 한 디렉토리에 추가하고자 하는 파일 을 복사 (예>전에 만든 hello 프로그램 추가) 후 다시 압축

53 4. Ramdisk ramdisk의 내용이 pc의 리눅스 디렉토리 구조와 동일함을 볼 수 있다. 여기에 디바이스 드라이버나 응용프로그램 등을 추가로 올리면 stand alone으로 동작하는 완전한 embedded 시스템을 구축할 수 있다.

54 4. Ramdisk 먼저 수정한 ramdisk 이미지를 /tftpboot 로 복사. BLOB 으로 부팅
% cp ramdisk.gz /tftpboot BLOB 으로 부팅 minicom을 실행 하고 target board에 전원을 인가한다. BLOB command mode로 target system booting Blob command mode로 부팅하기 위해서는 blob이 kernel로 제어를 넘기기 전에 임의의 키를 입력하여야 한다.

55 4. Ramdisk Download ramdisk 는 sdram의 0xa 에 download 되도록 내부적으로 지정되어있다.

56 4. Ramdisk Fusing ramdisk는 flash memory의 0x 번지부터 쓰도록 지정되어있다.

57 8.5 JFFS2

58 Target System HOST System JTAG 2. Download Serial Interface or
JTAG Interface Serial Interface or Ethernet Interface Boot Loader FLASH Memory Linux Kernel Root File System User File system SDRAM HOST System 3.Fusing 1.Fusing 2. Download JTAG Target System

59 5. jffs2 file system mkfs.jffs2 설치
Host에 설치 되어있나 확인하고 되어있지 않으면 설치

60 5. jffs2 file system mtd-snapshot 파일을 download 압축 해제
ftp://ftp.uk.linux.org/pub/people/dwmw2/mtd/cvs 예제에서는 /usr/local/pxa255에 복사하였다. 압축 해제 /usr/local/pxa255로 이동하여 압축을 푼다.

61 5. jffs2 file system 컴파일 생성된 디렉토리 안에 util 디렉토리로 들어가서 컴파일 한다.

62 5. jffs2 file system mkfs.jffs2 실행파일 확인

63 8.4 jffs2 file system 생성된 mkfs.jffs2실행 파일을 /sbin에 복사.

64 5. jffs2 file system Make directory jffs2 file system으로 사용할 디렉토리를 만든다.
예제에서는 /usr/local/pxa255/jffs2 로 제작.

65 5. jffs2 file system File 복사
Flash memory에서 27 M K를 사용하므로 그 이하로 복사 예제에서는 test를 위해 디렉토리에 welcome.txt 를 생성하였다.

66 5. jffs2 file system mkfs.jffs2
mkfs.jffs2 프로그램을 사용하여 jffs2 디렉토리를 jffs2 file system image로 만들어 준다. mkfs.jffs2의 옵션은 다음과 같은 기능을 한다. -r: jffs2 file system으로 만들 원본 디렉토리를 지정한다. -o: 출력될 jffs2 file system 이미지의 이름을 지정한다. -e: erase block( flash memory에 erase명령을 줄때 한번에 지울 block 의 크기, hardware에 의존적이다) 의 size를 지정한다. 0x40000  256K(pxa255_pro 보드에서 사용한 inter 28F128 Flash Memory의 erase block size 이다.) -p: 생성할 jffs2 file system의 size를 지정한다.byte 단위. 0x1b80000  27M + 512K ( usr file system으로 사용할 flash memory의 크기.)

67 5. jffs2 file system 생성한 jffs2_image를 /tftpboot 로 복사 BLOB으로 booting
% cp /usr/local/pxa255/jffs2.img /tftpboot/ BLOB으로 booting minicom을 실행 한다. blob command mode로 target system booting

68 5. jffs2 file system Download
User file system은 sdram의 0xa 에 download 되도록 내부적으로 지정되어있다.

69 5. jffs2 file system Fusing
User file system은 flash memory의 0x 번지부터 쓰도록 지정되어있다.

70 5. jffs2 file system Booting linux kernel
Skip된 부분은 이미 flash memory에이미 같은 값이 씌여져 있기 때문에 넘어간 것이다.

71 5. jffs2 file system Linux login

72 5. jffs2 file system welcome.txt 문서 확인

73 8.6 Memory Map 수정

74 FLASH ROM (32M) SDRAM (128M) 0xa7,fff,fff 0xa3,000,000 0xa0,700,000
0x01,fff,fff 0x00,480,000 0x00,280,000 0x00,080,000 0x00,040,000 0x00,000,000 0xa7,fff,fff | JFFS2 0xa3,000,000 ramdisk.gz 0xa0,700,000 BLOB main() 0xa0,400,400 BLOB down image 0xa0,300,000 zImage 0xa0,008,000 0x00,000,000 JFFS2 27.5 Mbytes ramdisk.gz 2 Mbytes zImage parameter 256 Kbytes BLOB 256 kbytes

75 6. Memory Map 수정 목적 현재 flash memory는 다음과 같이 구성 되어있다.
Blob: 256 Kbytes Param Block: 256 Kbytes Kernel: 2 Mbytes Ramdisk: 2 Mbytes User file system: 27 Mbyte Kbytes 개발을 하다 보면 kernel이나 ramdisk, user file system에서 필요한 저장 공간이 현재 지정되어있는 size보다 많이 필요한 경우가 발생할 수 있다.  flash memory의 각 block의 size를 조정하여 필요조건을 충족 시킨다.

76 6. Memory Map 수정 필요한 작업 다음의 2가지 파일을 변경해 주어야 한다.
BLOB source code의 pxa255_pro.h “blob 소스코드 디렉토리 ”/include/blob/arch/pxa255_pro.h Kernel source code의 pxa255_pro.c “kernel 소스코드 디렉토리 ”/drivers/mtd/maps/pxa255_pro.c 압축이 풀렸을 때의 Ramdisk size를 변경해 준 경우에는 다음 작업도 해야 한다. Kernel source code 디렉토리에서 make menuconfig block devices  Default Ram disk size 수정

77 6. Memory Map 수정 [BLOB]/include/blob/arch/pxa255_pro.h 수정
/* and where do they live in flash */ #define BLOB_FLASH_BASE (0x ) #define BLOB_FLASH_LEN (256 * 1024) #define PARAM_FLASH_BASE (BLOB_FLASH_BASE + BLOB_FLASH_LEN) #define PARAM_FLASH_LEN (256 * 1024) #define KERNEL_FLASH_BASE (PARAM_FLASH_BASE + PARAM_FLASH_LEN) #define KERNEL_FLASH_LEN (1024 * 1024 * 2) #define RAMDISK_FLASH_BASE (KERNEL_FLASH_BASE + KERNEL_FLASH_LEN) #define RAMDISK_FLASH_LEN (2 * 1024 * 1024) #define ROOT_FLASH_BASE (KERNEL_FLASH_BASE + KERNEL_FLASH_LEN) #define ROOT_FLASH_LEN (2 * 1024 * 1024) #define USR_FLASH_BASE (RAMDISK_FLASH_BASE + RAMDISK_FLASH_LEN) #define USR_FLASH_LEN ((512 * 1024) + ( 27 * 1024 * 1024 )) /* the size (in kbytes) to which the compressed ramdisk expands */ #define RAMDISK_SIZE (8 * 1024) #endif 위 값들은 blob에서 “flash kernel” 과 같은 명령을 주었을 때에 image를 저장할 flash memory의 시작 주소와 크기를 표시한것이다. BLOB_FLASH_BASE (0x ) BLOB_FLASH_LEN (256 * 1024) flash blob 명령을 주면 sdram 0xa 의 내용을 flash memory 0x 에 256 Kbytes복사하도록 정의한 것이다. sdram의 주소 0xa 도 sdram을 위한 memory map으로 pxa255_pro.h에 매크로로 정의 되어 있다. PARAM_FLASH_BASE (BLOB_FLASH_BASE + BLOB_FLASH_LEN) PARAM_FLASH_LEN (256 * 1024) flash param 명령을 주면 sdram 0xa 에서 flash memory의 blob 다음 block에 256 Kbytes를 복사하도록 정의한 것이다. Blob이 256 Kbyte였으므로 0x 부터 parameter block이 기록될 것이다. Parameter block는 7장 blob analysis에서 간단히 다룰 것이다. KERNEL_FLASH_BASE (PARAM_FLASH_BASE + PARAM_FLASH_LEN) KERNEL_FLASH_LEN (1024 * 1024 * 2) flash kernel 명령을 주면 sdram 0xa 에서 flash memory의 parameter block 다음 block에 2 Mbytes를 복사하도록 정의한 것이다. Parameter 가 0x 에서 시작해 256 Kbyte였으므로 0x 부터 kernel이 기록될 것이다. RAMDISK_FLASH_BASE (KERNEL_FLASH_BASE + KERNEL_FLASH_LEN) RAMDISK_FLASH_LEN (2 * 1024 * 1024) flash ramdisk 명령을 주면 sdram 0xa 에서 flash memory의 kernel 다음 block에 2 Mbytes를 복사하도록 정의한 것이다. Kernel이 2 Mbyte였으므로 0x 부터 ramdisk가 기록될 것이다. ROOT_FLASH_BASE (KERNEL_FLASH_BASE + KERNEL_FLASH_LEN) ROOT_FLASH_LEN (2 * 1024 * 1024) flash root명령을 주면 sdram 0xa 에서 flash memory의 kernel 다음 block에 2 Mbytes를 복사하도록 정의한 것이다. 현재 root file system으로 ramdisk를 사용하므로 flash memory 주소는 ramdisk와 같게 정의되어있다. USR_FLASH_BASE (RAMDISK_FLASH_BASE + RAMDISK_FLASH_LEN) USR_FLASH_LEN ((512 * 1024) + ( 27 * 1024 * 1024 )) flash usr명령을 주면 sdram 0xa 에서 flash memory에 ramdisk(또는 root) 다음 block에 27 Mbytes Kbytes를 복사하도록 정의한 것이다. ramdisk가 2 Mbyte였으므로 0x 부터 parameter block이 기록될 것이다. 위의 값을 원하는 size로 변경시켜 주면 되는데, 주의할 것은 총 사용 메모리 양이 설치되어있는 flash memory 양을 넘지 않아야 한다는 것이다. RAMDISK_SIZE (8 * 1024) Ramdisk 의 압축이 풀렸을 때의 size를 정의한 것이다. 나중에 kernel로 부팅할때 argument로 넘겨줄 때 사용한다.

78 6. Memory Map 수정 [kernel]/drivers/mtd/maps/pxa255_pro.c 수정
static struct mtd_partition pxa255_pro_partitions[] = { { name: "Bootloader", size: 0x , offset: 0, mask_flags: MTD_WRITEABLE /* force read-only */ },{ name: "param", size: 0x , offset: MTDPART_OFS_APPEND, mask_flags: MTD_WRITEABLE /* force read-only */ name: "Kernel", size: 0x , name: "ramdisk", size: 0x , name: "Filesystem", size: MTDPART_SIZ_FULL, offset: MTDPART_OFS_APPEND } }; Kernel에서 flash memory의 partion에 대한 정보를 담아두는 구조체이다. (mtd는 memory techonology device의 약자로 flash등의 memory device에 file system을 구현하기 위해 kernel에서 지원하는 subsystem의 이름이다.) name partiton 의 이름 size partition 의 size MTDPART_OFS_FULL (0) //[kernel 디렉토리]/include/mtd/partitions.h 에 정의되어있다. Flash memory의 남은 모든 공간 할당 offset: 어디에 부터 사용할 것인지를 결정하는 것이다. [kernel 디렉토리]/include/mtd/partitions.h 에 정의되어있다. MTDPART_OFS_NXTBLK (-2) //다음 BLOCK 부터 기록 MTDPART_OFS_APPEND (-1) //이어서 기록 mask_flags 읽기, 쓰기, 지우기 모두를 허용할 것인지 일부를 제한할 것인지 결정하는 flag [kernel 디렉토리]/include/mtd/mtd.h 에 정의되어있다. #define MTD_CLEAR_BITS // Bits can be cleared (flash) #define MTD_SET_BITS // Bits can be set #define MTD_ERASEABLE // Has an erase function #define MTD_WRITEB_WRITEABLE // Direct IO is possible #define MTD_VOLATILE // Set for RAMs #define MTD_XIP 32 // eXecute-In-Place possible #define MTD_OOB 64 // Out-of-band data (NAND flash) #define MTD_ECC // Device capable of automatic ECC // Some common devices / combinations of capabilities #define MTD_CAP_ROM 0 #define MTD_CAP_RAM (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEB_WRITEABLE) #define MTD_CAP_NORFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE) #define MTD_CAP_NANDFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE|MTD_OOB) #define MTD_WRITEABLE (MTD_CLEAR_BITS|MTD_SET_BITS) MTD_WRITEABLE /* force read-only */  쓰기를 금지하는 것이다. 위 내용에서 size 부분을 blob에서 바꾸어 준 것과 동일하게 바꾸어 준다.

79 6. Memory Map 수정 make menuconfig % make menuconfig 옵션 수정
block device 메뉴에 가서 enter Default Ram disk size 에서 변경한 ramdisk의 size를 적어 준다.

80 6. Memory Map 수정 목표 Ramdisk의 압축이 풀렸을 때 size를 12M bytes로, 압축 되었을 때에 2M bytes K bytes가 되도록 memory map을 수정한다. 단계 Ramdisk image 재작성 기존의 ramdisk image mount 새로운 ramdisk image 제작 새로운 ramdisk image mount 기본의 ramdisk 내용을 새로운 ramdisk로 복사 추가할 파일을 새로운 ramdisk로 복사 BLOB source code 수정/컴파일/Download pxa255_pro.h 수정 Kernel source code 수정/컴파일/Download pxa255_pro.c 수정 Kernel option ramdisk size 수정

81 6. Memory Map 수정 Ramdisk image 재작성
기존의 ramdisk mount (/usr/local/pxa255/ramdisk.gz) Mount에서 –o loop 옵션은 loop back device를 마운트 할 때 사용하는 옵션이다. Loop back device란 file을 하나의 장치처럼 사용할 때 이를 지원해 주는 가상 디바이스이다. 위 슬라이드에서 ramdisk는 파일로서 존재하는 것이기 때문에 이를 마운트 하기 위해서는 –o loop 옵션이 필요하다.

82 6. Memory Map 수정 Ramdisk image 재작성 (cont’) 새로운 ramdisk image 제작
dd 명령은 file을 복사하는 명령으로 if 는 input file, of 는 output file이다. /dev/zero는 0으로 된 가상장치이다. 즉 0으로 초기화된 output file을 만드는 것이다. bs는 복사할 block 단위, count는 복사할 block 수이다.

83 6. Memory Map 수정 Ramdisk image 재작성 (cont’)
새로운 ramdisk image를 ext2 file system으로 format

84 6. Memory Map 수정 Ramdisk image 재작성 (cont’)
새로운 ramdisk image mount 하고 기존 ramdisk의 내용 복사 cp 에서 a 옵션은 원본 파일의 속성, 링크 정보들을 그대로 복사하는 것이다. 예를 들어 a 옵션이 없는 경우 link파일을 복사하면 link 하고 있는 원본 파일을 복사하게 되지만 a 옵션을 주면 link 파일 자체를 복사하게 된다.

85 6. Memory Map 수정 Ramdisk image 재작성 (cont’)
새로운 ramdisk image unmount, 압축, image 크기 확인 tftp로 전송하기 위해 /tftpboot로 복사

86 6. Memory Map 수정 BLOB source code 수정 pxa255_pro.h를 다음과 같이 수정
/* and where do they live in flash */ #define BLOB_FLASH_BASE (0x ) #define BLOB_FLASH_LEN (256 * 1024) #define PARAM_FLASH_BASE (BLOB_FLASH_BASE + BLOB_FLASH_LEN) #define PARAM_FLASH_LEN (256 * 1024) #define KERNEL_FLASH_BASE (PARAM_FLASH_BASE + PARAM_FLASH_LEN) #define KERNEL_FLASH_LEN (1024 * 1024 * 2) #define RAMDISK_FLASH_BASE (KERNEL_FLASH_BASE + KERNEL_FLASH_LEN) #define RAMDISK_FLASH_LEN ((512 * 1024) + (2 * 1024 * 1024)) #define ROOT_FLASH_BASE (KERNEL_FLASH_BASE + KERNEL_FLASH_LEN) #define ROOT_FLASH_LEN ((512 * 1024) + (2 * 1024 * 1024)) #define USR_FLASH_BASE (RAMDISK_FLASH_BASE + RAMDISK_FLASH_LEN) #define USR_FLASH_LEN ((512 * 1024) + ( 27 * 1024 * 1024 )) /* the size (in kbytes) to which the compressed ramdisk expands */ #define RAMDISK_SIZE (12 * 1024) #endif

87 Target boar에 올릴 kernel source code 디렉토리
6. Memory Map 수정 BLOB source code 컴파일 예전에 configure를 수행해 Makefile을 만들어 주었으므로 make를 통해 컴파일 한다. configure 를 실행한 적이 없거나 Makefile이 없는 경우 blob source code가 있는 디렉토리에서 다음과 작업 먼저 수행 Target boar에 올릴 kernel source code 디렉토리

88 6. Memory Map 수정 BLOB source code 컴파일 (cont’) make

89 6. Memory Map 수정 BLOB image를 /tftpboot로 복사
현재 target board에 BLOB이 설치되어 있으므로 tftp로 전송 가능.

90 6. Memory Map 수정 Kernel 수정 pxa255_pro.c 를 다음과 같이 수정 {
static struct mtd_partition pxa255_pro_partitions[] = { { name: "Bootloader", size: 0x , offset: 0, mask_flags: MTD_WRITEABLE /* force read-only */ },{ name: "param", size: 0x , offset: MTDPART_OFS_APPEND, mask_flags: MTD_WRITEABLE /* force read-only */ name: "Kernel", size: 0x , name: "ramdisk", size: 0x00C00000, name: "Filesystem", size: MTDPART_SIZ_FULL, offset: MTDPART_OFS_APPEND } };

91 6. Memory Map 수정 Kernel 수정(cont’)
make menuconfig 후 Block devices 선택 후 enter

92 6. Memory Map 수정 Kernel 수정(cont’) Default Ram disk size 선택 후 enter

93 6. Memory Map 수정 Kernel 수정(cont’) Size 기록 후 저장하고 나온다.

94 6. Memory Map 수정 Kernel 컴파일 make clean; make dep; make bzImage
make zImage와 make bzImage 둘 중 아무거나 사용해도 된다. bzImage는 kernel 이미지가 클 때 사용한다.

95 6. Memory Map 수정 Kernel image를 /tftpboot로 복사
BLOB를 통해 tftp로 download할 수 있다.

96 6. Memory Map 수정 BLOB command mode
Target board를 BLOB command mode로 부팅한다.

97 6. Memory Map 수정 BLOB download blob을 target board에 download

98 6. Memory Map 수정 BLOB fusing blob을 target board의 flash memory에 fusing

99 6. Memory Map 수정 Target 재부팅 후 status 확인
Flash memory의 memory 변경 사항이 적용되었는지 확인한다. Ramdisk의 size가 커져서 usr 의 시작 주소가 0x 에서 0x 으로 변경되었다.

100 6. Memory Map 수정 Kernel download zImage를 target board에 download

101 6. Memory Map 수정 Kernel fusing Download 한 zImage를 flash에 fusing

102 6. Memory Map 수정 Ramdisk download
새로 만든 ramdisk_big을 target board에 download

103 6. Memory Map 수정 Ramdisk fusing Download한 ramdisk_big을 flash에 fusing

104 6. Memory Map 수정 Jffs2 download 기존의 jffs2 file system image를 download

105 6. Memory Map 수정 Jffs2 fusing
Download한 jffs2 file system image를 flash에 fusing

106 6. Memory Map 수정 Booting

107 6. Memory Map 수정 Ramdisk partition 크기 확인


Download ppt "8. Porting."

Similar presentations


Ads by Google