= YAFFS = -- [김도집] [[DateTime(2005-08-12T02:43:39)]] [[TableOfContents]] == yaffs란 == Yaffs는 Yet Another Flash File System에서 머리 글자만 딴 것이다. 이것은 임베디드 시스템의 NAND 플래시를 위한 저널링 가능한 파일 시스템이다. yaffs 사이트는 [http://www.aleph1.co.uk/yaffs/]이다. === 라이센스 === == yaffs 소스 구하기 == 소스는 cvs를 통해 다운 받을 수 있다. cvs에서 다운 받을 수 있는 모듈은 다음과 같다. * yaffs * yaffs2 === yaffs 소스 구하기 === {{{ cvs -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs login cvs -z3 -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs co yaffs }}} login시에 password를 묻는데 이때는 엔터만 치면 된다. === yaffs2 소스 구하기 === {{{ cvs -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs login cvs -z3 -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs co yaffs2 }}} login시에 password를 묻는데 이때는 엔터만 치면 된다. == yaffs 도구 만들기 == yaffs를 위한 도구는 yaffs의 소스의 util 디렉토리 아래에 있다. * mkyaffs - NAND 플래시 영역을 yaffs로 초기화 * mkyaffsimage - yaffs용 이미지 생성 빌드하기 위해서는 각각 ''make mkyaffs''와 ''make mkyaffsimage''를 하면 된다. == yaffs 이미지 만들기 == 디렉토리를 만들고 그 아래에 파일 시스템의 구성을 만든다. 이후 mkyaffsimage 명령을 이용하여 yaffs 이미지를 만든다. {{{ mkyaffsimage ./target ramdisk.yaffs }}} == yaffs 이미지 fusing하기 == === 부트로더에서 yaffs 이미지 fusing하기 === NAND 플래시의 특성상 하나의 1페이지는 256byte의 두 영역과 하나의 16byte의 OOB 영역(또는 spare 영역)으로 구성되어 있다. 즉, 1페이지는 528byte가 된다. 이러한 페이지는 read/write의 단위가 된다. 그러나 실제 데이터를 위해 사용되는 영역은 OOB를 영역을 제외한 512byte이다. 페이지는 블록을 구성하는데, 하나의 블록은 32개의 페이지로 이뤄진다. 하나의 블록 크기 중 OOB 영역을 제외하면 16Kbyte가 된다. 블록은 erase 단위가 된다. 따라서 블록내의 한 페이지만을 erase 하고자 한다면 그 페이지가 속한 하나의 블록 전체를 erase 해야만 한다. /!\ NAND 플래시는 페이지 크기가 256byte, 512byte (+16byte OOB), 2Kbyte (+64byte OOB) 등의 크기를 갖는다. 일반적을 512byte 크기의 페이지가 널리 사용되나 2GB이상의 NAND 플래시에서는 2Kbyte가 하나의 페이지가 크기가 된다. --yaffs 이미지를 fusing 할 때는 yaffs 이미지를 위한 '''NAND 플래시의 첫번재 블록은 비워두고 두번째 블록부터 fusing을 해야 한다'''. '''그리고-- yaffs 이미지는 기본적으로 OOB 영역도 생성되어 있으므로 부트로더에서 OOB 영역까지 하나의 데이터 영역으로 보고 yaffs 이미지를 fusing해야 한다.''' /!\ jffs2 이미지는 OOB 영역을 포함하고 있지 않기 때문에 fusing시에 OOB 영역은 쓰지 않는다. === 리눅스 부팅 후 yaffs 이미지 fusing하기 === 예를 들어 /dev/mtd4에 fusing하고자 한다면 먼저 /dev/mtd4를 yaffs 파일 시스템으로 초기화를 한다. {{{ mkyaffs /dev/mtd4 }}} 이후 ramdisk.yaffs 이미지를 fusing하면 된다. {{{ mkyaffs /dev/mtd4 ramdisk.yaffs }}} == 리눅스 커널에 yaffs 적용하기 == yaffs를 커널에 추가하는 방법은 다음과 같다. 1. 커널 소스내에 fs/yaffs 라는 디렉토리를 만든다. 1. 이 디렉토리에 yaffs의 소스에서 devextras.h yaffs_fs.c yaffs_gets.c yaffs_guts.h yaffs_mtdif.c yaffs_mtdif.h yaffsinterface.h yportenv.h 를 복사해 놓는다. 1. yaffs 소스에서 Makefile.kernel을 fs/yaffs/Makefile로 복사한다. 1. fs/Config.in 에서 다음을 추가한다. {{{ if [ "CONFIG_MTD_NAND" = "y" ]; then tristate "Yaffs filesystem on NAND" CONFIG_YAFFS_FS fi }}} 1. fs/Makefile에 다음을 추가한다. {{{ subdir-$(CONFIG_YAFFS_FS) += yaffs }}} 1. 커널 configuration에서 mtd nand를 설정하고 yaffs fs를 선택한다. 1. 마지막으로 커널을 빌드하면 된다. == yaffs 마운트하기 == {{{ mount -t yaffs /dev/mtdblock4 /yaffs }}}== 참고 == * [http://www.aleph1.co.uk/yaffs/ YAFFS] * [http://www.linux-mtd.infradead.org/ Linux MTD] * [http://kelp.or.kr/korweblog/stories.php?story=05/03/11/8823013&topic=17 Yaffs 파일 시스템 이미지 파일 NAND에 Fusing 방법] - [http://www.kelp.or.kr KELP] * [http://www.aleph1.co.uk/yaffs/yaffs-rootfs-howto.html Brief HOWTO on incorporating yaffs as a root fs] * [http://kelp.or.kr/korweblog/stories.php?story=04/06/30/7742286 YAFFS HOW-TO] - [http://www.kelp.or.kr KELP] * [http://cafe114.daum.net/_c21_/bbs_read?grpid=ZmCn&fldid=Lc5H&page=1&prev_page=0&firstbbsdepth=&lastbbsdepth=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz&contentval=00002zzzzzzzzzzzzzzzzzzzzzzzzz&datanum=2&head=&subj=U-Boot%3Enand+write.yaffs+%3A+NAND+Flash+Filesystem YAFFS HOW-TO(ALT)] - Daum