Presentation is loading. Please wait.

Presentation is loading. Please wait.

Embedded System Porting (2)

Similar presentations


Presentation on theme: "Embedded System Porting (2)"— Presentation transcript:

1 Embedded System Porting (2)
Lecture #5

2 목 차 Overview Bootloader Kernel Ramdisk – Root File System
목 차 Overview Bootloader Kernel Ramdisk – Root File System JFFS2 – User File System Memory Map 수정

3 Ramdisk – Root File System

4 Ramdisk (1) 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 Ramdisk (2) Ramdisk 사용 목적 주기억장치인 RAM의 일부를 보조기억장치인 디스크처럼 사용
Ramdisk에 root file system을 설치 Root file system 구성 Embedded linux kernel이 부팅한 후에 리눅스 시스템을 동작시키기 위해 필요로 하는 각종 유틸리티 프로그램 시스템 설정 파일 각종 유틸리티 프로그램 동작에 필요한 동적 라이브러리 등 /bin, /sbin, /lib, /include, /usr, /var, /tmp 등으로 구성

6 Ramdisk (3) Ramdisk 사용 목적 Root file system에 대한 요구 사항
시스템 유틸리티 프로그램이나 라이브러리에 대한 빠른 접근 속도 한번 작성 후에 수정이 거의 필요 없다  Embedded System 환경에서는 Ramdisk에 Root file system을 설치  메모리 낭비 및 휘발성 특성에 의해 전원이 꺼지면 수정된 데이터도 손실

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

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

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

10 Ramdisk (7) RAMDISK 설치하기 (계속) Tftp를 통한 Download
ramdisk 는 sdram의 0xa 에 download 되도록 내부적으로 지정되어있다.

11 Ramdisk (8) RAMDISK 설치하기 (계속) Flash Memory Fusing
ramdisk는 flash memory의 0x 번지부터 쓰도록 지정되어있다.

12 JFFS2 – User File System

13 jffs2 file system (1) 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

14 jffs2 file system (2) JFFS2(Journaling Flash File System-2) file system NOR형 flash memory를 사용하기 위한 linux file system 주로 flash memory를 user file system으로 사용하기 위해 적용 Embedded system에서 flash memory 일부를 부팅에 필요한 이미지를 저장하고, 나머지 영역은 사용자 데이터를 저장하기 위한 영역으로 사용 Embedded system에서 동작하는 응용 프로그램이나 응용 프로그램이 생성하는 데이터 등을 수시로 저장 전원이 꺼져도 저장된 내용을 보전

15 jffs2 file system (3) mkfs.jffs2 설치
Host에 설치 되어있나 확인하고 되어있지 않으면 설치

16 jffs2 file system (4) mkfs.jffs2 설치 (계속) mtd-snapshot 파일을 download
ftp://ftp.uk.linux.org/pub/people/dwmw2/mtd/cvs 예제에서는 /usr/local/pxa255에 복사하였다. 압축 해제 /usr/local/pxa255로 이동하여 압축을 푼다.

17 jffs2 file system (5) mkfs.jffs2 설치 (계속) 컴파일
생성된 디렉토리 안에 util 디렉토리로 들어가서 컴파일 한다.

18 jffs2 file system (6) mkfs.jffs2 설치 (계속) mkfs.jffs2 실행파일 확인

19 jffs2 file system (7) mkfs.jffs2 설치 (계속)
생성된 mkfs.jffs2실행 파일을 /sbin에 복사.

20 jffs2 file system (8) JFFS2 file system 이미지 생성 Directory 생성
예제에서는 /usr/local/pxa255/jffs2 로 제작.

21 jffs2 file system (9) JFFS2 file system 이미지 생성 (계속) 필요한 File 복사
Flash memory에서 27 M K를 사용하므로 그 이하로 복사 예제에서는 test를 위해 디렉토리에 welcome.txt 를 생성하였다.

22 jffs2 file system (10) 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의 크기.)

23 jffs2 file system (11) JFFS2 file system 설치
생성한 jffs2_image를 /tftpboot 로 복사 % cp /usr/local/pxa255/jffs2.img /tftpboot/ BLOB으로 booting minicom을 실행 한다. blob command mode로 target system booting

24 jffs2 file system (12) JFFS2 file system 설치 (계속) Tftp를 통해 Download
User file system은 sdram의 0xa 에 download 되도록 내부적으로 지정되어있다.

25 jffs2 file system (13) JFFS2 file system 설치 (계속) Flash Memory Fusing
User file system은 flash memory의 0x 번지부터 쓰도록 지정되어있다.

26 jffs2 file system (14) JFFS2 file system 설치 (계속) Booting linux kernel
Skip된 부분은 이미 flash memory에이미 같은 값이 씌여져 있기 때문에 넘어간 것이다.

27 jffs2 file system (15) JFFS2 file system 설치 (계속) Linux login

28 jffs2 file system (16) JFFS2 file system 설치 (계속) welcome.txt 문서 확인

29 Memory Map 수정

30 Memory Map 수정 (1) 0xa7,fff,fff SDRAM (128M) FLASH ROM (32M)
| 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 0x01,fff,fff 0x00,480,000 0x00,280,000 0x00,080,000 0x00,040,000 0x00,000,000 JFFS2 27.5 Mbytes ramdisk.gz 2 Mbytes zImage parameter 256 Kbytes BLOB 256 kbytes

31 Memory Map 수정 (2) 목적 현재 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의 각 프로그램에 할당된 size를 조정하여 필요 조건을 충족 시킨다.

32 Memory Map 수정 (3) 필요한 작업 다음의 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 크기를 바꾼 경우에는 다음 작업도 수행해야 한다. Kernel source code 디렉토리에서 make menuconfig block devices  Default Ram disk size 수정

33 Memory Map 수정 (4) [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로 넘겨줄 때 사용한다.

34 Memory Map 수정 (5) [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에서 바꾸어 준 것과 동일하게 바꾸어 준다.

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

36 Memory Map 수정 (7) 목표 Ramdisk의 압축이 풀렸을 때 size를 12M bytes로, 압축 되었을 때에 2M bytes K bytes가 되도록 memory map을 수정한다. 단계 Step 1: Ramdisk image 재작성 기존의 ramdisk image mount 새로운 ramdisk image 제작 새로운 ramdisk image mount 기본의 ramdisk 내용을 새로운 ramdisk로 복사 추가할 파일을 새로운 ramdisk로 복사

37 Memory Map 수정 (8) 단계 (계속) Step 2: BLOB source code 수정/컴파일/Download
pxa255_pro.h 수정 Step 3: Kernel source code 수정/컴파일/Download pxa255_pro.c 수정 Kernel option ramdisk size 수정

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

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

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

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

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

43 Memory Map 수정 (14) 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 (27 * 1024 * 1024) /* the size (in kbytes) to which the compressed ramdisk expands */ #define RAMDISK_SIZE (12 * 1024) #endif

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

45 Memory Map 수정 (16) BLOB source code 컴파일 (cont’) make

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

47 Memory Map 수정 (18) 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 } };

48 Memory Map 수정 (19) Kernel 수정(cont’)
make menuconfig 후 Block devices 선택 후 enter

49 Memory Map 수정 (20) Kernel 수정(cont’) Default Ram disk size 선택 후 enter

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

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

52 Memory Map 수정 (23) Kernel image를 /tftpboot로 복사
BLOB를 통해 tftp로 download할 수 있다.

53 Memory Map 수정 (24) JFFS2 file system 이미지 수정
Ramdisk 이미지 크기가 커졌기 때문에 JFFS2 file system 이미지 크기를 조정하여야 함 앞에서 살펴본 JFFS2 file system 이미지 생성 절차에 따라 새로운 크기의 이미지를 생성한다 새로이 생성된 JFFS2 file system 이미지를 다운로드하기 위해 /tftpboot 디렉토리에 복사한다

54 Memory Map 수정 (25) BLOB command mode
Target board를 BLOB command mode로 부팅한다.

55 Memory Map 수정 (26) BLOB download blob을 target board에 download

56 Memory Map 수정 (27) BLOB fusing
blob을 target board의 flash memory에 fusing

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

58 Memory Map 수정 (29) Kernel download zImage를 target board에 download

59 Memory Map 수정 (30) Kernel fusing Download 한 zImage를 flash에 fusing

60 Memory Map 수정 (31) Ramdisk download
새로 만든 ramdisk_big을 target board에 download

61 Memory Map 수정 (32) Ramdisk fusing Download한 ramdisk_big을 flash에 fusing

62 Memory Map 수정 (33) Jffs2 download
새로 생성된 jffs2 file system image를 download

63 Memory Map 수정 (34) Jffs2 fusing
Download한 jffs2 file system image를 flash에 fusing

64 Memory Map 수정 (35) Booting

65 Memory Map 수정 (36) Ramdisk partition 크기 확인


Download ppt "Embedded System Porting (2)"

Similar presentations


Ads by Google