670 likes | 904 Views
Embedded System Porting (2). Lecture #5. 목 차. Overview Bootloader Kernel Ramdisk – Root File System JFFS2 – User File System Memory Map 수정. Ramdisk – Root File System. Target System. HOST System. 2. Download. Serial Interface or Ethernet Interface. Linux Kernel
E N D
Embedded System Porting (2) Lecture #5
목 차 • Overview • Bootloader • Kernel • Ramdisk – Root File System • JFFS2 – User File System • Memory Map 수정
Target System HOST System 2. Download Serial Interface or Ethernet Interface Linux Kernel Root File System User File system SDRAM 3.Fusing JTAG Interface Boot Loader 1.Fusing Boot Loader JTAG FLASH Memory Ramdisk (1)
Ramdisk (2) • Ramdisk 사용 목적 • 주기억장치인 RAM의 일부를 보조기억장치인 디스크처럼 사용 • Ramdisk에 root file system을 설치 • Root file system 구성 • Embedded linux kernel이 부팅한 후에 리눅스 시스템을 동작시키기 위해 필요로 하는 각종 유틸리티 프로그램 • 시스템 설정 파일 • 각종 유틸리티 프로그램 동작에 필요한 동적 라이브러리 등 • /bin, /sbin, /lib, /include, /usr, /var, /tmp 등으로 구성
Ramdisk (3) • Ramdisk 사용 목적 • Root file system에 대한 요구 사항 • 시스템 유틸리티 프로그램이나 라이브러리에 대한 빠른 접근 속도 • 한번 작성 후에 수정이 거의 필요 없다 Embedded System 환경에서는 Ramdisk에 Root file system을 설치 메모리 낭비 및 휘발성 특성에 의해 전원이 꺼지면 수정된 데이터도 손실
Ramdisk (4) • Ramdisk 제작 순서 • HUINS에서 제공한 CD에서 ramdisk.gz를 임의의 디렉토리에 복사한다. Example에서는 /usr/local/pxa255 디렉토리를 기준으로 한다. • Step 1: 압축 해제한다. • Step 2: ramdisk를 마운트할 디렉토리 생성한다. • Step 3: ramdisk 마운트한다. • Step 4: ramdisk를 마운트한 디렉토리에 추가하고자 하는 파일을 복사 (예를 들면, 전에 만든 hello 프로그램 추가) 후 다시 압축한다.
Ramdisk (5) • Ramdisk 제작 순서
Ramdisk (6) • RAMDISK 설치하기 • 먼저 수정한 ramdisk 이미지를 /tftpboot 로 복사. % cp ramdisk.gz /tftpboot • BLOB 으로 부팅 • minicom을 실행 하고 target board에 전원을 인가한다. • BLOB command mode로 target system booting
Ramdisk (7) • RAMDISK 설치하기 (계속) • Tftp를 통한 Download
Ramdisk (8) • RAMDISK 설치하기 (계속) • Flash Memory Fusing
Target System HOST System 2. Download Serial Interface or Ethernet Interface Linux Kernel Root File System User File system SDRAM 3.Fusing JTAG Interface Boot Loader 1.Fusing Boot Loader JTAG FLASH Memory jffs2 file system (1)
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에서 동작하는 응용 프로그램이나 응용 프로그램이 생성하는 데이터 등을 수시로 저장 • 전원이 꺼져도 저장된 내용을 보전
jffs2 file system (3) • mkfs.jffs2 설치 • jffs2 file system을 만들기 위해서는 mkfs.jffs2 프로그램이 필요 • Host에 설치 되어있나 확인하고 되어있지 않으면 설치
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로 이동하여 압축을 푼다.
jffs2 file system (5) • mkfs.jffs2 설치 (계속) • 컴파일 • 생성된 디렉토리 안에 util 디렉토리로 들어가서 컴파일 한다.
jffs2 file system (6) • mkfs.jffs2 설치 (계속) • mkfs.jffs2 실행파일 확인
jffs2 file system (7) • mkfs.jffs2 설치 (계속) • 생성된 mkfs.jffs2실행 파일을 /sbin에 복사.
jffs2 file system (8) • JFFS2 file system 이미지 생성 • Directory 생성 • jffs2 file system으로 사용할 디렉토리를 만든다. • 예제에서는 /usr/local/pxa255/jffs2 로 제작.
jffs2 file system (9) • JFFS2 file system 이미지 생성 (계속) • 필요한 File 복사 • jffs2 file system에 넣고 싶은 파일을 새로 만든 디렉토리에 복사한다. • Flash memory에서 27 M + 512 K를 사용하므로 그 이하로 복사 • 예제에서는 test를 위해 디렉토리에 welcome.txt 를 생성하였다.
jffs2 file system (10) • JFFS2 file system 이미지 생성 (계속) • mkfs.jffs2 • mkfs.jffs2 프로그램을 사용하여 jffs2 디렉토리를 jffs2 file system image로 만들어 준다.
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
jffs2 file system (12) • JFFS2 file system 설치 (계속) • Tftp를 통해 Download
jffs2 file system (13) • JFFS2 file system 설치 (계속) • Flash Memory Fusing
jffs2 file system (14) • JFFS2 file system 설치 (계속) • Booting linux kernel
jffs2 file system (15) • JFFS2 file system 설치 (계속) • Linux login
jffs2 file system (16) • JFFS2 file system 설치 (계속) • welcome.txt 문서 확인
Memory Map 수정 (1) SDRAM (128M) FLASH ROM (32M)
Memory Map 수정 (2) • 목적 • 현재 flash memory는 다음과 같이 구성 되어있다고 가정한다. • Blob: 256 Kbytes • Param Block: 256 Kbytes • Kernel: 2 Mbytes • Ramdisk: 2 Mbytes • User file system: 27 Mbyte + 512 Kbytes • 개발을 하다 보면 kernel, ramdisk 그리고 user file system 등에서 필요한 저장 공간이 현재 지정되어있는 size보다 많이 필요한 경우가 발생할 수 있다. flash memory의 각 프로그램에 할당된 size를 조정하여 필요 조건을 충족 시킨다.
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 수정
Memory Map 수정 (4) • [BLOB]/include/blob/arch/pxa255_pro.h 수정 /* and where do they live in flash */ #define BLOB_FLASH_BASE (0x00000000) #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
Memory Map 수정 (5) • [kernel]/drivers/mtd/maps/pxa255_pro.c 수정 static struct mtd_partition pxa255_pro_partitions[] = { { name: "Bootloader", size: 0x00040000, offset: 0, mask_flags: MTD_WRITEABLE /* force read-only */ },{ name: "param", size: 0x00040000, offset: MTDPART_OFS_APPEND, mask_flags: MTD_WRITEABLE /* force read-only */ },{ name: "Kernel", size: 0x00200000, offset: MTDPART_OFS_APPEND, },{ name: "ramdisk", size: 0x00200000, offset: MTDPART_OFS_APPEND, },{ name: "Filesystem", size: MTDPART_SIZ_FULL, offset: MTDPART_OFS_APPEND } };
Memory Map 수정 (6) • make menuconfig % make menuconfig • 옵션 수정 • block device 메뉴에 가서 enter • Default Ram disk size 에서 변경한 ramdisk의 size를 적어 준다.
Memory Map 수정 (7) • 목표 • Ramdisk의 압축이 풀렸을 때 size를 12M bytes로, 압축 되었을 때에 2M bytes + 512K bytes가 되도록 memory map을 수정한다. • 단계 • Step 1: Ramdisk image 재작성 • 기존의 ramdisk image mount • 새로운 ramdisk image 제작 • 새로운 ramdisk image mount • 기본의 ramdisk 내용을 새로운 ramdisk로 복사 • 추가할 파일을 새로운 ramdisk로 복사
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 수정
Memory Map 수정 (9) • Ramdisk image 재작성 • 기존의 ramdisk mount (/usr/local/pxa255/ramdisk.gz)
Memory Map 수정 (10) • Ramdisk image 재작성 (cont’) • 새로운 ramdisk image 제작
Memory Map 수정 (11) • Ramdisk image 재작성 (cont’) • 새로운 ramdisk image를 ext2 file system으로 format
Memory Map 수정 (12) • Ramdisk image 재작성 (cont’) • 새로운 ramdisk image mount 하고 기존 ramdisk의 내용 복사
Memory Map 수정 (13) • Ramdisk image 재작성 (cont’) • 새로운 ramdisk image unmount, 압축, image 크기 확인 • tftp로 전송하기 위해 /tftpboot로 복사
Memory Map 수정 (14) • BLOB source code 수정 • pxa255_pro.h를 다음과 같이 수정 /* and where do they live in flash */ #define BLOB_FLASH_BASE (0x00000000) #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
Memory Map 수정 (15) • BLOB source code 컴파일 • 예전에 configure를 수행해 Makefile을 만들어 주었으므로 make를 통해 컴파일 한다. • configure 를 실행한 적이 없거나 Makefile이 없는 경우 blob source code가 있는 디렉토리에서 다음과 작업 먼저 수행 Target boar에 올릴 kernel source code 디렉토리
Memory Map 수정 (16) • BLOB source code 컴파일 (cont’) • make
Memory Map 수정 (17) • BLOB image를 /tftpboot로 복사 • 현재 target board에 BLOB이 설치되어 있으므로 tftp로 전송 가능.
Memory Map 수정 (18) • Kernel 수정 • pxa255_pro.c 를 다음과 같이 수정 static struct mtd_partition pxa255_pro_partitions[] = { { name: "Bootloader", size: 0x00040000, offset: 0, mask_flags: MTD_WRITEABLE /* force read-only */ },{ name: "param", size: 0x00040000, offset: MTDPART_OFS_APPEND, mask_flags: MTD_WRITEABLE /* force read-only */ },{ name: "Kernel", size: 0x00200000, offset: MTDPART_OFS_APPEND, },{ name: "ramdisk", size: 0x00C00000, offset: MTDPART_OFS_APPEND, },{ name: "Filesystem", size: MTDPART_SIZ_FULL, offset: MTDPART_OFS_APPEND } };
Memory Map 수정 (19) • Kernel 수정(cont’) • make menuconfig 후 Block devices 선택 후 enter
Memory Map 수정 (20) • Kernel 수정(cont’) • Default Ram disk size 선택 후 enter
Memory Map 수정 (21) • Kernel 수정(cont’) • Size 기록 후 저장하고 나온다.