FAT32에 대한 게시물입니다. FAT32 부분 관련해서는 MP3 플레이어 제작 시 제일 어려운 부분이 될 수 있고 대부분이 겪는 어려움 또한 FAT32를 제어하면서 발생되리라 봅니다. 그렇기 때문에 이번 게시물과 밑에 참고 게시물은 꼭 보시어 숙지하셔야 나중에 문제 발생 시 유연하게 대처할 수 있습니다.
그리고 FAT32 드라이버 제작에 유리한님께서 정리하신 FAT32 한글 문서가 정말 유용했습니다. 늦었지만 좋은 자료 공개에 감사의 말씀 드립니다.
1. 파일시스템 FAT32의 개요
FAT32는 FAT12/16의 한계를 개선한 파일 시스템으로 제 기억으로는 윈도우즈95 OSR2 부터 적용이 되었던 파일시스템 입니다.
FAT32는 기존 FAT16이 2GB의 하드 밖에 사용을 하지 못했던 것에 비해 2TB의 대용량의 하드를 지원할 수 있었습니다.
그러나 하드웨어의 발전속도가 빠른 지금.. 효율적인 측면 및 기타 사유로 인해 최신 윈도우계열(2000, 2003, XP 등등)에서는 NTFS 파일시스템에 밀려 한물간 파일시스템이 되었습니다. 그러나 대용량 플래시 메모리에서는 아직도 자주 쓰이는 파일시스템으로 32GB가 넘는 대용량 메모리가 나오기 이전까지는 많이 사용되지 않을까 싶습니다. (32GB 이상도 사용 가능하지만 효율성이 점점 떨어지는 것으로 알려져 있습니다.)
아래는 FAT 파일 시스템 버젼별 차이점 입니다.
구분 | FAT12 | FAT16 | FAT32 |
사용 용도 | 플로피디스크용 | 저용량 하드디스크 | 고용량 하드디스크 |
클러스터 표현 비트 수 | 12bit | 16bit | 32bit(28bit만 사용) |
최대 클러스터 개수 | 4,084개 | 65,524개 | 약 228만개 |
최대 볼륨 크기 | 16MB | 2GB | 2TB |
파일의 최대 크기 | 볼륨 크기만큼 | 볼륨 크기만큼 | 4GB |
디렉토리당 최대 파일 개수 | X | 65,535개 | 65,535개 |
루트디렉토리의 파일개수 제한 | 있음 | 있음 | 없음 |
(IT EXPERT, 임베디드 개발자를 위한 파일시스템의 원리와 실습 샘플 챕터 - FAT 파일시스템 비교)
FAT12 | FAT16 | FAT32 | |
사용매체 | 플로피디스크 | 소용량 하드디스크 | 대용량 하드디스크 |
주소지정방식 | 12 bits | 16 bits | 32 bits |
최대 주소 지정갯수 | 4,086 | 65,526 | ~268,435,456 |
1개클러스터 용량 | 0.5 KB to 4 KB | 2 KB to 32 KB | 4 KB to 32 KB |
1개 파티션 최대량 | 16,736,256 | 2,147,123,200 | 약 2^41 |
(표 출처 - 푸른강물님 블로그)
2. 섹터와 클러스터(원본 출처 - 푸른강물님 블로그)
# 섹터(Sector)
하드디스크에 데이터를 저장하는 최소단위 입니다. 일반적으로 섹터의 크기는 512byte이며, 일반적으로 SD카드에서도 큰 조작을 하지 않는다면 1블럭의 크기는 512바이트 즉, 1섹터로 잡힐 것 입니다.
섹터에는 데이터를 저장 할 수 있는 공간 이외의 영역이 존재합니다. 이 부분은 운영체제나 프로그램이 볼 수 없는 영역이며 주로 하드디스크 콘트롤러가 하드디스크를 작동시키는데 필요한 것들입니다.
- ID정보(ID information) : 섹터번호, 위치에 대한 정보인데 디스크 상에서 섹터의 위치를 확인하기 위한 정보.
- 동기화 필드(synchronization fields) : 하드디스크 컨트롤러가 섹터를 읽기동작에 필요한 가이드 역할을 하는 부분.
- 데이터 영역 : 데이터 저장공간(512 byte)
- ECC : 데이터의 무결성을 검사하기 위한 에러정정코드가 존재하는 부분.
- 빈공간(gabs) : 섹터사이를 구분해주는 빈 공간.
# 클러스터(cluster)
섹터를 일정 단위로 묶어 놓은 것 입니다. 도스에서 사용하는 파일시스템인 FAT16 방식에서 인식할 수 있는 주소를 섹터마다 배정하게 되면 배정가능한 주소의 수가 모자라서 하드디스크 용량 인식에 문제가 생기게 되어서 고육지책으로 고안해 낸 방법이 섹터를 여러 개 묶어서 주소 한 개를 배정해서 인식 할 수 있는 용량을 더 크게 확장시킨 방식입니다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
1섹터 = 1클러스터
2섹터 = 1클러스터
4섹터 = 1클러스터
8섹터 = 1클러스터
# FAT16/FAT32와 클러스터와의 관계
프로그램의 최소단위인 파일은 파일저장의 최소단위인 클러스터에 저장되는데 한 개의 파일은 한 개의 클러스터 이상의 공간에 저장됩니다. 파일 한 개의 크기가 클러스터의 크기보다 작을 때 그 클러스터의 남는 공간은 다른 파일이 함께 저장 될 수 없기 때문에 공간의 낭비가 심해지게 되고 파일은 크고 클러스터는 매우 작게 포맷이 되었을 경우 한 파일이 차지하게 되는 클러스터의 수가 많아지게 되어 그 파일을 읽어들이는 속도가 느려지게 되고 클러스터 간의 링크가 손상될 확률이 높아지게 됩니다.
FAT16과 FAT32의 차이는 근본적으로 하드디스크의 클러스터에 얼마나 많은 주소를 지정할 수 있느냐의 차이인데, FAT16은 2의16승(2^16)=65536개의 주소를 클러스터에 붙일 수 있고 (실제로는65536-10개) FAT32는 2^28 + 2^4=약 4억개 정도의 주소를 지정 할 수 있습니다.
클러스터당 섹터수와 용량 | 인식가능한 파티션의 최대용량 |
1 ×512=512 | 512 × 65536=32MB |
2 × 512=1024 | 1024 × 65536=64MB |
4 × 512=2048 | 2048 × 65536=128MB |
8 × 512=4096 | 4096 × 65536=256MB |
16 × 512=8192 | 8192 × 65536=512MB |
32 × 512=16384 | 16384 × 65536=1024MB |
64 × 512=32768 | 32768 × 65536=2048MB |
위의 표에서 보면 FAT16방식에서는 섹터64개를 클러스터 1개로 묶으면 한 파티션의 최대용량이 2GB가 됩니다.
만일 8GB용량의 하드디스크를 FAT16방식으로 포맷하게 되면 파티션을 네개로 나누어야 하드디스크전체를 사용 할 수 있습니다. 이때 한 개 클러스터의 크기도 과도하게 크므로(32KB) 낭비되는 공간이 심하면 30%에 이를 수도 있습니다.
크기가 1KB인 문서파일한개 | 남는 공간 여기엔 다른 파일을 함께 저장 할 수 없다 |
<1클러스터=64섹터 일때의 파일의 크기가 적을수록 공간의 낭비가 심해진다>
FAT16 방식의 단점을 보완하기 위해 윈도우95 OSR2부터 FAT32를 지원하기 시작했습니다. FAT32에서는 클러스터의 크기에 따른 공간의 낭비와 데이터검색속도와의 효율성을 고려해서 1클러스터 = 4096byte(8개섹터)를 기본값으로 사용합니다. 각 클러스터를 인식 할 수 있는 주소수도 충분해서 8GB의 하드디스크를 단일파티션으로 사용 할 수 있습니다.
FAT16 | FAT32 | |||
파티션 | 클러스터 | 파티션 | 클러스터 | 권장 클러스터 크기 |
128MB | 2KB | 260MB | 512B | 512B |
256MB | 4KB | 260MB~8GB | 512B, 1, 2, 4KB | 4KB |
512MB | 8KB | 8GB~16GB | 4, 8KB | 8KB |
1G | 16KB | 16~32GB | 8, 16KB | 16KB |
2G | 32KB | 32GB | 16, 32KB | 32KB |
3. FAT32의 간략한 구조
FAT는 아래 표와 같은 계층적 구조를 가지고 있습니다. MBR, BOOT RECORD, FAT 엔트리, 루트 디렉토리 엔트리, 클러스터 등등의 영역으로 나누어져 있으며, 해당 계층을 엑세스 하거나 초기화 할 때 그 이전 상위 계층에서 해당 정보를 잘 추출해야합니다. 예를 들어 FAT 엔트리가 몇번 째 클러스터 또는 섹터에 있는가를 알기 위해서는 상위 레벨의 계층에서 정보를 얻어야 그 위치를 얻을 수 있는 것이지요..
여기서 MBR(Master Boot Record) 영역은 0번 섹터에 해당하는 부분으로 해당 디스크의 파일시스템에 대한 전반적인 내용이 이곳에 저장되어 있습니다. 우리는 여기를 제일먼저 엑세스 하여 기타 타 영역의 정보를 추출하고 각각의 위치나 필요한 데이터를 읽어오면 됩니다. 참고로 위 그림에서 오프셋은 위에서 아래로 갈수록 증가한다고 보면 됩니다.
4. FAT32의 상세 구조
간단하게 FAT32의 계층을 살펴보았는데 이번에는 그 계층간 상세구조를 살펴보도록 하겠습니다.
<여기서 잠깐!>
FAT 파일 시스템에서 저장되어있는 값은 "리틀엔디안"입니다. 예를 들어 0x12345678 이라는 헥스값이 메모리의 0x01번지부터 저장되어 있다면, 아래와 같이 저장되는 방식이 리틀 엔디안입니다. 물론 그의 반대는 빅 엔디안 입니다.
리틀 엔디안
메모리 주소 (HEX) | 01 | 02 | 03 | 04 |
값 (HEX) | 78 | 56 | 34 | 12 |
빅 엔디안
메모리 주소 (HEX) | 01 | 02 | 03 | 04 |
값 (HEX) | 12 | 34 | 56 | 78 |
</여기서 잠깐!>
#1 Master Boot Record
물리적으로 제일 첫 번째 섹터에 해당하는 MBR입니다. MBR에서는 해당 디스크의 파티션에 대한 정보를 담고 있습니다.
파티션에 대한 정보를 나타내는 위치는 처음 446Byte 이후부터 16Byte 크기만큼씩 4개의 파티션으로 나타내주고 있습니다.
< 출처 - http://www.pjrc.com >
그림을 참고하면 446바이트의 더미(?) 코드 이후로 파티션에 대한 정보가 연속으로 나타나고 있으며 일반적으로 4개의 파티션 정보를 나타냅니다. 그러나 우리가 사용할 SD카드는 일반적으로 파티션을 나누고 있지 않고 한개의 파티션만 사용하게 되므로 Partition 1의 위치에 대한 내용만 읽어오면 됩니다. 그리고 맨마지막 511, 512번째 바이트는 55 AA 값을 갖고 있는데 이는 매직 코드라고 하여 FAT의 파일시스템인지 아닌지를 검출할 때 사용합니다.
#2 16Byte Patition Entry
아래의 그림은 파티션 섹션을 자세하게 나타내놓은 그림입니다.
< 출처 - http://www.pjrc.com >
그림에서는 색깔로 표시된 영역인 Type Code와 LBA Begin 섹션의 정보를 얻어오면 되며, Type Code는 FAT의 타입을 LBA Begin은 해당 파티션이 시작되는 주소를 나타내줍니다.
#3 FAT32 Volume ID, critical fields
아래의 그림은 LBA 시작 주소의 첫 섹터이고 이것은 PBR(Partition Boot Record)이자 부트섹터 입니다.
앞으로는 혼동을 막기위해 명칭을 되도록 파티션 부트 레코드(PBR)로 통일하겠습니다.
< 출처 - http://www.pjrc.com >
Field | Microsoft's Name | Offset | Size | Value |
---|---|---|---|---|
Bytes Per Sector | BPB_BytsPerSec | 0x0B | 16 Bits | Always 512 Bytes |
Sectors Per Cluster | BPB_SecPerClus | 0x0D | 8 Bits | 1,2,4,8,16,32,64,128 |
Number of Reserved Sectors | BPB_RsvdSecCnt | 0x0E | 16 Bits | Usually 0x20 |
Number of FATs | BPB_NumFATs | 0x10 | 8 Bits | Always 2 |
Sectors Per FAT | BPB_FATSz32 | 0x24 | 32 Bits | Depends on disk size |
Root Directory First Cluster | BPB_RootClus | 0x2C | 32 Bits | Usually 0x00000002 |
Signature | (none) | 0x1FE | 16 Bits | Always 0xAA55 |
위 그림과 표를 보시면 해당 파티션에 대한 자세한 정보를 얻을 수 있는데 일반적으로 섹터당 바이트 수는 512바이트로 고정이고 클러스터에 따른 섹터 갯수(Sectors Per Cluster)는 해당 파티션의 용량에 따라 다릅니다. 개인적으로 64MB 크기의 miniSD 카드와 1GB microSD 카드를 갖고 있는데.. 64MB의 경우는 클러스터당 섹터 갯수는 1개 이고, 1GB의 경우는 클러스터당 섹터 갯수가 8개 입니다. 그렇기 때문에 용량이 다른 SD카드를 삽입할 경우를 대비하여 위의 정보는 파티션 부트 레코드에서 반드시 읽어두어야 합니다. 여기서 또 필요한 정보는 루트디렉토리 클러스터(Root Directory First Cluster)의 주소와 예약 섹터 갯수(Number of Reserved Sectors) 입니다.
여기서 예약 섹터의 갯수를 알아야하는 이유는 아래 그림에서의 FAT #1 위치를 파악하기 위함으로써 위 볼륨 ID 섹터 + 예약섹터의 위치가 FAT #1의 위치가 되겠습니다. 또한 아래 그림에서 FAT #2는 일종의 백업영역으로 FAT #1과 동일한 내용을 담고 있습니다. 그리고 루트디렉토리 클러스터는 아래 연두색의 Clusters의 제일 첫 시작부분을 가리킵니다.
< 출처 - http://www.pjrc.com >
위에서 언급했던 영역의 크기와 위치를 구하는 공식은 아래와 같습니다.
(unsigned long)fat_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors;
(unsigned long)cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors + (Number_of_FATs * Sectors_Per_FAT);
(unsigned char)sectors_per_cluster = BPB_SecPerClus;
(unsigned long)root_dir_first_cluster = BPB_RootClus;
그럼 우리는 여기서 다시 한번 위의 영역을 찾아가기 위한 과정을 처음부터 다시 한번 생각해보도록 합시다.
1. 제일 처음 MBR에서 매직코드를 읽어 FAT 파일시스템인지 확인
2. MBR에서 파티션1의 PBR 위치와 FAT 타입을 확인(FAT16/32)
3. PBR의 제일 처음 섹터인 Volume ID에서 클러스터당 섹터 갯수, 루트 디렉토리 클러스터 주소, 예약섹터 갯수 확인
4. PBR의 첫 섹터 위치 + 예약섹터 갯수로 #FAT 1 위치 확인
간단하게 위의 과정을 거치면 이젠 최소한 FAT32에서 해당 파티션이 어디에 있는지 파일 및 디렉토리의 데이터 영역이 어디부터 시작하는지 알 수 있습니다.
#3 Root Directory Entry(이하 디렉토리 엔트리)
다음은 루트 디렉토리 엔트리입니다. 루트 디렉토리 엔트리는 루트 디렉토리 클러스터(Root Directory First Cluster)의 제일 처음 시작되는 부분입니다. 루트 디렉토리라는 말은 우리가 흔히 말하는 루트를 말하고 있습니다.(디렉토리의 최상위 영역 ex C:\) 이 부분에는 어떤 파일과 디렉토리가 있는지에 대한 정보를 갖고 있습니다. 일반적으로 2번째 클러스터에 해당하는 영역부터 시작됩니다. 그리고 일반 서브 디렉토리를 생성하면 서브 디렉토리에 한하여 그 디렉토리 내부에 어떤 파일과 디렉토리가 있는지 정보가 필요하므로 앞서 말한 루트 디렉토리 엔트리와와 동일한 구조를 갖는 디렉토리 엔트리 형식을 갖게 됩니다. 물론 서브디렉토리는 다른 클러스터 주소를 갖게 됩니다.
디렉토리 엔트리는 32바이트 크기로 나누어져 있는데, 아래와 같은 구조를 같고, 1섹터당 16개의 디렉토리 엔트리 갯수를 갖고 있습니다.
< 출처 - http://www.pjrc.com >
Field | Microsoft's Name | Offset | Size |
---|---|---|---|
Short Filename | DIR_Name | 0x00 | 11 Bytes |
Attrib Byte | DIR_Attr | 0x0B | 8 Bits |
First Cluster High | DIR_FstClusHI | 0x14 | 16 Bits |
First Cluster Low | DIR_FstClusLO | 0x1A | 16 Bits |
File Size | DIR_FileSize | 0x1C | 32 Bits |
그림을 보면 Short Filename은 DOS에서 출력되는 형식으로 8(이름) + 3(확장자)바이트 즉, 이름 영문 8자 또는 한글 4자 + 확장자 영문 3자를 넘지 않으며, 영문의 경우 대문자 아스키 값으로로 한글의 경우 완성형 값으로 저장되어 있습니다.
<1리터의 눈물.txt, 011.bmp, 012.bmp, 013.bmp의 경우>
실제로 디렉토리 엔트리를 HEX 에디터로 살펴보면 위와 같이 파일명을 확인할 수 있습니다.
그리고 디렉토리 엔트리 영역의 첫 바이트의 값 또는 Attrib 값이 어떠냐에 따라서 디렉토리 엔트리의 해당 정보가 전체적으로 달라지는데 그 경우는 아래와 같습니다.
1. Normal record with short filename - Attrib is normal
Attrib의 값이 일반적인 경우는 파일에 대한 정보를 나타냄(위의 디렉토리 엔트리 형식과 동일)
2. Long filename text - Attrib has all four type bits set
Attrib의 하위 니블이 모두 1일 (0x0f) 경우 긴 파일 이름를 표시해주는 디렉토리 엔트리 영역임을 나타냄
(위의 디렉토리 엔트리 형식과 다르고 Long Filename Entry라고 하겠음 - 차후에 다룰 예정)
3. Unused - First byte is 0xE5
첫 번째 바이트가 0xE5 라면 사용하지 않는 즉, 지워진 파일을 나타냄 (실제적으로 파일 복구의 가장 간단한 원리는 파일이 삭제시 해당 파일의 데이터를 물리적으로 0으로 모두 채우는 것이 아니라 디렉토리 엔트리의 첫 바이트를 E5 값을 넣어서 지워진 파일이라고만 표시하여 눈에만 보이지 않게 하는 것이기 때문에 해당 위치를 아스키값으로 대체하면 파일이 복구되는 것임)
4. End of directory - First byte is zero
0 값일 경우 전체적으로 디렉토리 엔트리가 끝임을 알림
Attrib Bit | Function | LFN | Comment |
---|---|---|---|
0 (LSB) | Read Only | 1 | Should not allow writing |
1 | Hidden | 1 | Should not show in dir listing |
2 | System | 1 | File is operating system |
3 | Volume ID | 1 | Filename is Volume ID |
4 | Directory | x | Is a subdirectory (32-byte records) |
5 | Archive | x | Has been changed since last backup |
6 | Ununsed | 0 | Should be zero |
7 (MSB) | Ununsed | 0 | Should be zero |
<Attrib 값에 따른 파일의 상태>
그리고 일반적인 디렉토리 엔트리의 구조를 갖는다면, Cluster High와 Cluster Low는 해당 파일이 시작되는 클러스터 주소의 시작번지가 되겠습니다. 그렇게 때문에 떨어져있는 두 섹션을 합하여 해당 주소를 읽어와야 합니다. 그리고 마지막 4비트는 파일의 사이즈가 되겠습니다.
#4 FAT32 Sector, Cluster chains for root directory and three files
이제 디렉토리 엔트리에서 파일의 시작 클러스터 주소를 추출 할 수 있기 때문에 이제는 파일이 어디서 부터 시작되는지 찾아갈 수 있습니다. 그러나 파일의 시작클러스터에서 EOF(End of File)까지 클러스터가 연속적으로 붙어있지 않을 경우가 있습니다.
예들 들어, 포맷을 한 뒤 (아무 파일도 없이 깨끗한 상태 또는 파일의 삭제를 한번도 안한 매체) 파일을 쓰면 아래와 같이 순차적으로 파일의 실제 정보가 들어 있는 클러스터는 아래와 같이 순차적으로 진행됩니다.
00000004 | 00000005 | ……… | 00000028 | EOF |
< 순차적으로 연결되어 있는 파일 클러스터 주소 >
그러나 잦은 쓰기와 지우기를 반복하여 중간중간 디스크의 단편화가 발생하게 되면 파일에 대한 클러스터는 연속적이지 않을 가능성이 높습니다.
00000004 | 00000012 | ……… | 00000037 | EOF |
그렇기 때문에 파일을 읽기 위해서는 처음부터 끝까지 순차적으로 읽을 수 있는 것이 아니라 파일에 대한 클러스터 체인의 정보가 #FAT1에 저장되어 있기 때문에 파일의 하나의 클러스터를 모두 읽어들였다면 #FAT 1에서 다음 클러스터는 몇 번째 클러스터인가에 대한 정보를 얻어와야 합니다.
우리가 접하는 디스크 조각모음 이란 것은 이렇게 떨어져 있거나 비 순차적인 파일 클러스터 순서를 순차적으로 바꾸어주어 파일 로딩속도 향상을 시키는 작업이라고 보면 됩니다.
다음은 아래의 #FAT 1에 대한 그림을 살펴보도록 하겠습니다.
< 출처 - http://www.pjrc.com >
그림을 살펴보시면 색깔 별로 4바이트씩 나누어져 있습니다. 이렇게 4바이트 마다 저장되어 있는 값은 각각의 다음 클러스터의 위치와 주소를 가리키고 있습니다. 한 섹터는 512바이트 이므로 한 섹터당 128개의 클러스터 정보를 갖고 있습니다.
위에 첫 번째 4바이트와 두 번째 4바이트는 모두 x로 되어있는데 이는 이 영역은 보통 사용을 안하기 때문이고 각각의 클러스터의 0과 1을 의미합니다. 세 번째 분홍색 00000009의 값의 경우는 2번 클러스터를 의미하고 다음에 연결된 클러스터는 9번 클러스터라는 것을 의미합니다.
그럼 자세히 다시 차근차근 살펴보겠습니다. 그림에서 오른쪽에 분홍색 영역을 보면 Root Directory라고 되어 있습니다. 일반적으로 루트디렉토리의 시작 클러스터는 2입니다. 루트디렉토리에는 파일의 대한 정보를 갖고 있는데 파일이 늘어나면 당연히 파일에 대한 정보도 늘어나고 저장하기 위해 많은 섹터와 클러스터가 필요하겠지요? 예를 들어 루트디렉토리에 100개의 파일이 있고 1개의 클러스터에는 20개의 파일의 정보만 있다라고 가정한다면 최소 5개의 클러스터를 읽어와야 루트디렉토리에 있는 100개의 파일에 대한 정보를 모두 읽어올 수 있습니다. 하지만 클러스터라는게 꼭 순차적으로 연결 된 것이 아니라 비 순차적으로 연결되어있을 수 있기 때문에 다음에 올 클러스터를 참조해야합니다.
일단 2번 클러스터는 루트디렉토리의 시작 클러스터이므로 정보를 쭉 읽어오고 다음 클러스터를 읽어오기 위해서는 #FAT1에서 2번 클러스터 위치로 가봅시다. 가보니 값이 00000009 입니다.(리틀 엔디안이므로 실제값은 0x09000000 값이 되는데 그림은 사용자가 보기 쉽게 하기 위하여 리틀엔디안이 아닌 빅엔디안으로 표시한 듯 합니다.) 그럼 다음 클러스터는 9번 클러스터란 말이군요! 그럼 9번 클러스터로 가서 해당 위치의 내용을 모두 읽었습니다. 그럼 또 다음 클러스터는 어떤 것인지 알아야겠지요? 그럼 또 9번째 클러스터 위치로 가보니 0000000A 값이 있습니다. 그럼 A 번째 클러스터 값이 다음에 연결됨을 알 수 있습니다. 이런 식으로 계속 찾아가면 연결된 다음 클러스터를 찾을 수 있으며, 다음클러스값이 FFFFFFFF (실제로는 0FFFFFFF)일 경우는 더이상의 클러스터는 없고 파일의 끝임을 알립니다.
이와같이 #FAT1의 영역은 클러스터 체인에 대한 정보를 갖고 있으므로 MP3 파일을 불러올 때 중요한 역할을 합니다.
이것으로 간단하게 FAT32에 대한 구조를 살펴보았습니다.
다음부터는 간단하게 회로구성부터 코딩을 시작해보도록 하겠습니다.
참고문서 및 사이트
푸른강물님의 블로그 데이터 복구 관련 모음집 : http://blog.naver.com/datagirl/130005073211
유리한님이 정리해주신 FAT32 한글 문서 통합본 : http://cafe.naver.com/micropic/239
Understanding FAT32 Filesystems : http://www.pjrc.com/tech/8051/ide/fat32.html
마이크로소프트 FAT32 관련 공식 문서 : http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx
한빛미디어 IT EXPERT, 임베디드 개발자를 위한 파일시스템의 원리와 실습 샘플 챕터 :
http://www.hanb.co.kr/web/sample/1405/sample.pdf
[출처 : 마이크로 픽 개발자 커뮤니티 http://cafe.naver.com/micropic]