티스토리 뷰

프로젝트/FAT32

FAT32 -FAT Entry

Just4Fun 2017. 9. 18. 20:01

이번 글에서는 FAT 영역에 어떤 정보가 들어가는지에 대하여 설명하도록 하겠다.

FAT영역에 저장되는 FAT entry는 한마디로 파일이나 디렉토리가 Data 영역의 몇번째 클러스터에서 시작되는지 알려주기 위하여 cluster index를 저장하는 table이라고 할 수 있겠다.

앞에서 설명했듯이 FAT32의 경우 root directory가 Data 영역 어디에도 위치할 수 있는데, 실제로는 어디에 있는지 클러스터 index를 boot sector에서 알려주었기 때문에 클러스터 index에 해당되는 위치에서 root directory 내용을 읽을수 있었다.

위의 그림은 FAT#0 영역을 dump 해 본 것인데, 초록색박스로 표시된 부분이 FAT32에서 예약된 cluster#0, cluster#1이고, 빨간색 부분이 root directory가 있는 cluster#2이다.  계속해서 일련번호로 할당되는 cluster 인덱스가 되는 것이다.  만약 sector 크기가 512바이트라면 하나의 섹터에 128개의 클러스터 인덱스가 들어가게 된다.

FAT entry에 들어가는 내용은 아래 표에 자세히 설명 되어 있다.

FAT entry 값이 0이면 해당 클러스터는 비어 있으므로 새로운 데이터를 쓸 수 있다는 뜻이다.

Entry 값이 2 ~ Max 값 사이에 있으면 현재 클러스터 다음에 연결된 클러스터가 어디인지 알려주는 값이 된다. 즉, single linked list 구조와 같다고 보면 된다.

Max+1 ~ 0x0FFFFFF6 사이의 값은 예약되어 있으므로 사용할 수 없다.

Entry 값이 0x0FFFFFF7이 쓰여져 있다면 해당 클러스터는 bad 상태이므로 이 영역의 데이터는 접근하지 말아야 한다.

0x0FFFFFFF라고 되어 있으면 파일이나 디렉토리의 마지막 클러스터라는 것을 의미 하는 것이다.  위의 표에서는 0xFFFFFFFF라고 되어 있지만 상위 4비트는 다른 용도로 사용할것에 대비해서 현재까지는 0으로 설정하여야 한다.

위의 그림 FAT dump 를 보면 대부분의 데이터가 "FFFFFFF0F"로 되어 있는것을 볼 수 있는데, little endian 으로 쓰여져 있으므로 4바이트를 한번에 읽어 보면 "0x0FFFFFFF"가 되고 파일이나 디렉토리가 하나의 클러스터 안에 포함될 수 있는 크기를 가진다는 것을 의미한다.

실제 예를 들어서 FAT entry에 어떤 값이 들어가는지 설명해 보도록 하겠다.

위의 그림 오른쪽에 보이는것처럼 File A,B,C가 있을 때, FAT entry에는 위의 왼쪽 그림과 같은 값을 가지게 된다.

만약 클러스터 크기 5개가 필요한 File D를 새로 만들게 될 경우에는 다음과 같이 FAT entry가 바뀌게 된다.


위의 그림처럼 처음 4개의 cluster index는 다음 클러스터가 몇번 인지를 알려주고 마지막 다섯번째 cluster index에는 해당 클러스터가 마지막임을 표시해 주고 있다.

Root directory를 읽어본 결과 CM3RTOS.ZIP 파일은 385번째 클러스터에 데이터가 들어 있다고 되어 있다.  파일 사이즈가 94057바이트이므로 3개의 클러스터가 필요할 것이다(하나의 클러스터 크기가 32Kbyte이라고 가정하면).

그럼 385번째 클러스터 다음으로는 어떤 클러스터에 연결되는지 FAT entry를 찾아 보도록 해보자.

Cluster index #385를 주소로 변환하기 위하여 4를 곱한 후 섹터 크기로 나누면 몫이 3이고 나머지가 4가 된다.  그러므로 FAT 영역의 시작에서 3번째 떨어진 섹터의 두번째 index가 385에 해당되는 위치가 된다.

FAT영역이 3466에서 시작되므로 세번째 FAT 섹터는 3469가 된다.

위의 그림처럼 3469섹터의 데이터를 읽어 보면, 세개의 클러스터에 CM3RTOS.ZIP 파일이 기록되어 있음을 확인할 수 있다.  385에는 386(0x182)이 쓰여져 있고, 386에는 387(0x183)이 쓰여져 있다. 387에는 클러스터가 마지막임을 나타내기 위하여 0x0FFFFFFF가 있게 된다.

결국 FAT entry에 있는 cluster index를 따라 가면 클러스터 단위로 쪼개어져 있는 전체 파일을 읽을 수 있게 되는 것이다.



'프로젝트 > FAT32' 카테고리의 다른 글

FAT32 - fat32_openfile(), fat32_readfile()  (0) 2017.09.25
FAT32 - fat32_opendir(), fat32_readdir()  (0) 2017.09.20
FAT32 - Directory Entry  (0) 2017.09.14
FAT32 - BPB(BIOS Parameter Block)  (0) 2017.09.12
FAT32 - MBR(Master Boot Record)  (3) 2017.09.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함