= 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의 소스의 utils 디렉토리 아래에 있다. yaffs2 소스 디렉토리에는 utils이라는 디렉토리가 없다(짐작컨대 yaffs2도 yaffs의 도구를 사용하는 것으로 보인다). * mkyaffs - NAND 플래시 영역을 yaffs로 초기화 * mkyaffsimage - yaffs용 이미지 생성 yaffs의 도구들은 yaffs/utils 이하에 있다. 빌드하기 위해서는 각각 ''make mkyaffs''와 ''make mkyaffsimage''를 하면 된다. 둘을 모두 빌드하는 경우에는 ''make'' 만 실행 하면 된다. 2005년 8월 13일에 cvs에서 다운받은 소스를 빌들하기 위해서는 리눅스 커널 소스의 driver/mtd/nand/nand_ecc.c 를 복사해서 사용해야 한다(이는 리눅스 커널 2.6.12에서만 확인 한 것이고 다른 버전에서도 그런지는 모르겠다.). 사실 nand_ecc.c 소스가 yaffs 소스에서 포함되어 있어야 할 듯 한데, 아마도 cvs commit 과정 중에 누락된 것이 아닌가 하는 생각이 든다. == 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