YAFFS #
Contents
- 1 YAFFS
- 1.1 yaffs란
- 1.1.1 yaffs의 구조
- 1.1.2 yaffs1과 yaffs2의 차이
- 1.1.3 라이선스
- 1.2 yaffs 소스 구하기
- 1.2.1 yaffs 소스 구하기
- 1.2.2 yaffs2 소스 구하기
- 1.3 yaffs 도구 만들기
- 1.4 yaffs 이미지 만들기
- 1.5 yaffs 이미지 fusing하기
- 1.5.1 부트로더에서 yaffs 이미지 fusing하기
- 1.5.2 리눅스 부팅 후 yaffs 이미지 fusing하기
- 1.6 리눅스 커널에 yaffs 적용하기
- 1.7 yaffs 마운트하기
- 1.8 yaffs/yaffs2의 ECC
- 1.9 참고
Yaffs는 Yet Another Flash File System에서 머리 글자만 딴 것이다. 이것은 임베디드 시스템의 NAND 플래시를 위한 저널링 가능한 파일 시스템이다.
1.3 yaffs 도구 만들기 #
yaffs를 위한 도구는 yaffs의 소스의 util 디렉토리 아래에 있다.
mkyaffs - NAND 플래시 영역을 yaffs로 초기화
mkyaffsimage - yaffs용 이미지 생성
빌드하기 위해서는 각각 make mkyaffs와 make mkyaffsimage를 하면 된다.
1.4 yaffs 이미지 만들기 #
디렉토리를 만들고 그 아래에 파일 시스템의 구성을 만든다. 이후 mkyaffsimage 명령을 이용하여 yaffs 이미지를 만든다.
mkyaffsimage ./target ramdisk.yaffs
1.5.1 부트로더에서 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 영역은 쓰지 않는다.
1.5.2 리눅스 부팅 후 yaffs 이미지 fusing하기 #
예를 들어 /dev/mtd4에 fusing하고자 한다면 먼저 /dev/mtd4를 yaffs 파일 시스템으로 초기화를 한다.
mkyaffs /dev/mtd4
이후 ramdisk.yaffs 이미지를 fusing하면 된다.
mkyaffs /dev/mtd4 ramdisk.yaffs
1.6 리눅스 커널에 yaffs 적용하기 #
yaffs를 커널에 추가하는 방법은 다음과 같다.
커널 소스내에 fs/yaffs 라는 디렉토리를 만든다.
이 디렉토리에 yaffs의 소스에서 devextras.h yaffs_fs.c yaffs_gets.c yaffs_guts.h yaffs_mtdif.c yaffs_mtdif.h yaffsinterface.h yportenv.h 를 복사해 놓는다.
yaffs 소스에서 Makefile.kernel을 fs/yaffs/Makefile로 복사한다.
fs/Config.in 에서 다음을 추가한다.
if [ "CONFIG_MTD_NAND" = "y" ]; then
tristate "Yaffs filesystem on NAND" CONFIG_YAFFS_FS
fi
fs/Makefile에 다음을 추가한다.
{{
subdir-$(CONFIG_YAFFS_FS) += yaffs
}}}
- 커널 configuration에서 mtd nand를 설정하고 yaffs fs를 선택한다.
- 마지막으로 커널을 빌드하면 된다.
1.7 yaffs 마운트하기 #
mount -t yaffs /dev/mtdblock4 /yaffs