본문 바로가기

Job Notes/File System

(10) 파일 엑세스

FAT32 이해하기의 마지막 단계인 [파일 엑세스] 부분입니다.


이전의 내용으로 미루어 볼 때, MP3 파일은 클러스터 영역에 존재한다는 것을 알았습니다. (이제 당연한 얘기겠죠?^^)

그런데 MP3 파일이 클러스터에 일렬로 쭉~ 존재하는 것은 아닙니다. 만약에 MP3 파일이 클러스터에 일렬로 쭉~ 존재한다면

MP3 데이터의 시작 클러스터만 알아내고 클러스터 주소를 1씩 증가시키면 쉽게 MP3 파일을 끝부분까지 읽을 수 있을 것입니다.


하지만 MP3 파일은 클러스터에 띄엄띄엄 존재합니다. 정확히 말하면 MP3 데이터가 쭉~ 이어질 수도 있고, 이어지다가 몇 개의 클러스터를 건너띄고 이어질 수도 있습니다.


예를 들면,

1. MP3 데이터가 클러스터에 사슬처럼 쭉~ 이어진 경우는 -> SD카드를 깨끗이 포맷한 후, 처음으로 노래를 넣었을 때이고

2. MP3 데이터가 클러스터 띄엄띄엄 존재하는 경우는       -> SD카드에 들어있는 노래를 삭제하거나, 추가하는 동작을 많이 한 경우입니다.


한 개의 MP3 파일이 클러스터에 띄엄띄엄 존재하면 쭉~ 이어진 경우보다는 읽는 속도가 느릴 것입니다. 우리가 사용하는 PC도 오래 사용하면 느려지는 이유가 여기에 있습니다. 하드디스크에 있는 파일을 삭제하거나 추가하는 동작을 많이한 PC는 속도가 느려집니다. 따라서 속도를 높이려면 하드디스크를 포맷하면 되지만, 보통 디스크 조각모음을 통해 클러스터에 띄엄띄엄 존재하는 데이터를 쭉~ 이어지게 만듭니다. 말하다 보니, 딴 길로 샜네요^^; 그냥 이렇다는 정도로만 알고 넘어가면 될 것 같습니다.^^


클러스터 영역에 있는 MP3 파일을 읽으려면

1. 먼저 디렉토리 엔트리에서 클러스터 넘버를 읽은 후,

2. 그 다음 MP3 파일이 끝날 때까지 FAT(File Allocation Table)을 읽고 그에 해당하는 클러스터로 가서 MP3 데이터를 읽는다. (FAT #1 영역)


간단히 설명하면, 디렉토리 엔트리는 MP3 파일의 시작 위치만 알려줍니다. 이렇게 MP3 파일의 시작 위치를 알았으면 MP3 파일이 끝날 때까지 FAT을 읽고 그에 해당하는 클러스터로 가서 MP3 데이터를 읽으면 됩니다.^^ 그 이유는 FAT이, MP3 데이터가 클러스터 어디 어디에 존재하는지 알려주기 때문입니다. (FAT 영역은 이전에 배웠듯이, 여러개의 FAT 엔트리로 구성되어 있습니다.)



FAT 영역의 첫 번째 섹터

사용자 삽입 이미지


위의 그림은 FAT의 첫 번째 섹터입니다. MP3 데이터 읽기 동작을 설명해보겠습니다.^^ 우선 루트디렉토리라는 곳이 있습니다. 이전에 설명한 부분인데, 루트디렉토리는 여러개의 "디렉토리 엔트리"로 이루어져 있습니다. (기억이 안나시면 이전에 알아본 "루트디렉토리" 부분을 읽어보시면 됩니다.^^) 그리고 SD카드(예:G:\)에는 노래 2곡이 들어 있고 파일이름이 ABBA.mp3, MORNING.mp3라 했습니다. 노래가 2개 이니까  루트디렉토리 섹터에 디렉토리 엔트리도 2개가 존재합니다. 이중에서 ABBA.mp3 파일을 엑세스 할 것이므로 첫 번째 디렉토리 엔트리가 관심 사항입니다. 이 디렉토리 엔트리에서 클러스터 넘버(=0x0003)가 몇 번인지 추출합니다. 클러스터 넘버가 MP3 파일이 시작되는 곳을 나타내므로 클러스터 번호가 0x0003인 섹터로 가서 MP3 데이터 512 바이트를 읽습니다.

(클러스터 번호는 0x00000002 번부터 시작하고 이곳에는 루트디렉토리 섹터가 있습니다.)


첫 번째 MP3 섹터를 읽었으면 MP3 파일이 끝날 때까지 FAT(위의 그림)을 참조합니다. 위에서 말한 클러스터 넘버는 또한 FAT 엔트리 번호를 나타냅니다. 방금 클러스터 넘버 0x0003 섹터에 있는 MP3 데이터를 읽었으므로 이제 0x0003번 FAT 엔트리가 가서 다음 클러스터 번호를 가져옵니다. 위의 그림에서 보이듯이, 다음 클러스터 넘버는 0x0000 0004번입니다. 이 클러스터로 가서 MP3 데이터를 읽고 0x00000004번 FAT 엔트리로 가서 다음 클러스터 번호를 가져옵니다. 이런식으로 MP3 파일이 끝날 때까지 반복합니다.


FAT을 읽는 방법을 요약하면,


디렉토리 엔트리에서 클러스터 넘버를 확인하고


그 클러스터로 가서 MP3 데이터를 읽고, 클러스터 넘버에 해당하는 FAT 엔트리로 가서 그 내용을 읽어, 다음 클러스터 번호를 가져온다.

그 클러스터로 가서 MP3 데이터를 읽고, 클러스터 넘버에 해당하는 FAT 엔트리로 가서 그 내용을 읽어, 다음 클러스터 번호를 가져온다.

그 클러스터로 가서 MP3 데이터를 읽고, 클러스터 넘버에 해당하는 FAT 엔트리로 가서 그 내용을 읽어, 다음 클러스터 번호를 가져온다.

...

...

... 이런식으로 파일이 끝날 때까지 반복하는 것입니다.^^



이제 실제로 FAT을 읽어보도록 하겠습니다.^^

먼저 이전글에서 말한 바와 같이, 루트 디렉토리에는 디렉토리 엔트리가 있다고 했습니다. 즉, 아래의 그림이 루트 디렉토리 섹터이고 여기에 디렉토리 엔트리들이 모여 있다고 했습니다. 여기서 ABBA.mp3 파일에 대한 디렉토리 엔트리만 파악하면 되므로, 첫 번째 디렉토리 엔트리만 살펴보면, Cluster Number는 = 0x0003 이란 것을 알 수 있습니다. 이 클러스터 넘버를 가지고 FAT으로 가면 됩니다.^^

사용자 삽입 이미지



위에서 Cluster Number가 = 0x0003 이란 것을 알았고, FAT 읽는 방법을 아래와 같습니다.(다시 한 번 적었습니다.^^)


디렉토리 엔트리에서 클러스터 넘버를 확인하고

그 클러스터로 가서 MP3 데이터를 읽고, 클러스터 넘버에 해당하는 FAT 엔트리로 가서 그 내용을 읽어, 다음 클러스터 번호를 가져온다.그 클러스터로 가서 MP3 데이터를 읽고, 클러스터 넘버에 해당하는 FAT 엔트리로 가서 그 내용을 읽어, 다음 클러스터 번호를 가져온다.그 클러스터로 가서 MP3 데이터를 읽고, 클러스터 넘버에 해당하는 FAT 엔트리로 가서 그 내용을 읽어, 다음 클러스터 번호를 가져온다.


위의 절차대로 FAT을 읽어보면,


디렉토리 엔트리에서 클러스터 넘버가 0x0003 인 것을 확인했고

0x0003 클러스터록 가서 MP3 데이터를 읽고, 0x0003번 FAT 엔트리로 가서 그 내용을 읽어 다음 클러스터 번호(0x0004)를 가져온다.

0x0004 클러스터로 가서 MP3 데이터를 읽고, 0x0004번 FAT 엔트리로 가서 그 내용을 읽어 다음 클러스터 번호(0x0005)를 가져온다.

0x0005 클러스터로 가서 MP3 데이터를 읽고, 0x0005번 FAT 엔트리로 가서 그 내용을 읽어 다음 클러스터 번호(0x0006)를 가져온다.

...

... 이런식으로 MP3 파일이 읽혀지네요^^ 이처럼 FAT 영역의 [FAT 엔트리]들은 서로간에 체인연결구조를 가지고 있어서 쉽게 MP3 파일의 끝부분까지 읽을 수 있습니다.



FAT 엔트리 주소 계산하기

--------------------------------------------------------------------------------------------

위에서는 FAT 영역과 클러스터 영역이 서로 어떻게 연결되어 동작하는지를 알아봤습니다.^^ 이제 이 동작(MP3 데이터 읽기)을 프로그램이 알아서 하게 하려면 주소 계산식을 세워야 합니다. 이 부분이 약간 어려운데, 차근차근 따져보면 이해할 수 있습니다.^^

아래의 계산식은 클러스터 넘버(0x0003)에 해당하는 FAT 엔트리를 찾는 방정식입니다. 즉, 0x0003번 FAT 엔트리를 찾는 것입니다. 더 간단히 말하면, 0x0003번 FAT 엔트리가 SD메모리의 몇 번째 섹터(주소)에 있는지를 찾는 것입니다.^^


fat_entry_per_secter = bytes_per_sector / 4

fat_address = fat_start_address + cluster_num / fat_entry_per_secter 한글로 고치면,


[섹터당 FAT 엔트리 개수] = [섹터당 바이트수] / [ 4 ]

[FAT 주소] = [FAT 시작 주소] + [클러스터 넘버] / [섹터당 FAT 엔트리 개수] 가 됩니다.

 

위의 식에 값을 대입하면,

 

[섹터당 FAT 엔트리 개수] = [512] / [4] = 128개(10진수) = 0x80 (16진수) <----- FAT 엔트리가 섹터당 128개가 있군요.

[FAT 주소] = [0x4D] + [0x0003] / [0x80] = 0x4D + 0x00 = 0x4D <----- 0x0003번 FAT 엔트리는 0x4D섹터(FAT의 첫 섹터)에 있군요.


이제 0x4D 섹터내에서 0x0003번 FAT 엔트리가 몇 번째에 있는지 계산하면, (당연히 0x0003 번째에 있겠죠? 하지만 프로그램으로 돌리려면 식을 만들어야 합니다.)

[FAT 엔트리 위치] = [0x0003] - [0x00] * [0x80] = 0x03 번째이므로, 이 위치는 4(FAT엔트리 단위) * 0x03 = 12 (10진수) 입니다. 따라서 FAT 시작주소 0x4D에 4*3을 더하면 = 0x0003번 FAT엔트리의 시작 주소가 됩니다. 간단히 쓰면 0x0003번 FAT 엔트리 주소는 = [0x4D + 4*3] 입니다.^^


그리고 루트 클러스터의 번호는 2번이고 섹터 주소는 0x79F 라는 것도 이미 알고 있습니다. (이전글에서)

(클러스터 번호는 2번부터 시작되는데, 2번 클러스터가 첫 번째 클러스터이므로 루트 클러스터라 부릅니다.^^)



----------------------------------------------------------------------------------------------

위의 내용을 정리하면, (가장 중요한 부분입니다.^^)


루트 디렉토리에서 Cluster Number(0x0003)를 먼저 알아내고, Cluster Number를 Physical Sector Address(0x79F + 1)로 변환 후, 이를 SD카드에 전달하여 첫 번째 MP3 데이터를 꺼내는 것입니다. 그 다음 데이터부터, 아래의 내용이 적용됩니다.

 

클러스터 넘버(0x00000003)에 해당하는 FAT 엔트리(0x4D + 4*3)로 가서 그 내용을 읽어, 다음 클러스터 번호(0x00000004)를 가져온다.

 

그 클러스터(0x00000004 -> 0x79F + 2)로 가서 MP3 데이터를 읽고,

클러스터 넘버(0x00000004)에 해당하는 FAT 엔트리(0x4D + 4*4)로 가서 그 내용을 읽어, 다음 클러스터 번호(0x00000005)를 가져온다.

 

그 클러스터(0x00000005 -> 0x79F + 3)로 가서 MP3 데이터를 읽고,

클러스터 넘버(0x00000005)에 해당하는 FAT 엔트리(0x4D + 4*5)로 가서 그 내용을 읽어, 다음 클러스터 번호(0x00000006)를 가져온다.


그 클러스터(0x00000006 -> 0x79F + 4)로 가서 MP3 데이터를 읽고,

클러스터 넘버(0x00000006)에 해당하는 FAT 엔트리(0x4D + 4*6)로 가서 그 내용을 읽어, 다음 클러스터 번호(0x00000007)를 가져온다.

 

그 클러스터(0x00000007 -> 0x79F + 5)로 가서 MP3 데이터를 읽고,

클러스터 넘버(0x00000007)에 해당하는 FAT 엔트리(0x4D + 4*7)로 가서 그 내용을 읽어, 다음 클러스터 번호(0x00000008)를 가져온다.

...

...

... 파일의 끝을 만날 때 까지 반복


FAT과 클러스터는 위와 같은 연결 구조를 가지고 있어서, MP3 파일이 끝날 때까지 이런 사이클로 데이터 읽기가 이루어 집니다.

(프로그래밍 할 때, 이 부분을 참고하면 될 것 같습니다.^^)




아래부터는 참고 자료이니 간단히 훑어 보세요.^^




클러스터 넘버는 몇 번 부터?

----------------------------------------------------------------------

클러스터 넘버는 0번과 1번이 존재하지 않으며, 2번부터 시작됩니다.^^


사용자 삽입 이미지




클러스터 넘버 0x0003 번의 내용 (MP3 데이터 시작)

사용자 삽입 이미지


위의 데이터를 보면 ID3 태그가 보입니다. 이로서 클러스터 넘버 0x0003 섹터부터 MP3 데이터가 시작된다는 것을 확인하였습니다.^^



아래의 그림에 보이듯, 클러스터 넘버는 0x0002 부터 시작합니다.(0번과 1번 클러스터는 존재하지 않는데, 저도 의문입니다.^^)

0x0002 섹터는 디렉토리 엔트리의 집합체인 루트 디렉토리를 말하고, 0x0003 섹터가 바로 MP3 데이터가 시작되는 곳입니다.^^


클러스터 넘버 0x0003 번의 내용 (MP3 데이터 시작)

사용자 삽입 이미지


이제 FAT32 파일시스템을 프로그램으로 구현하면 될 것 같습니다.^^ 저도 엄두가 안나네요^^;



-----------------------------------------------------------------------------------

지금까지 FAT32 파일시스템에 대해 알아보았습니다.^^

FAT32에 대해 감을 잡으셨나요?^^ 저도 이제 좀 알 것 같습니다.^^

여기까지 해서 FAT32에 대한 설명을 마치도록 하겠습니다.^^

설명이 부족하거나 빠진 부분은 앞으로 업데이트 해 나가도록 하겠습니다.^^

감사합니다.^^* Thank you :-) e-mail: adinewtn@naver.com


p.s. 10개의 FAT32 자료를 하나의 파일로 압축해서 첨부하였습니다.^^



Created       : 2006/04/17

Last updated: 2006/04/17

----------------------------------------------------------------------------------


Reference

http://www.pjrc.com/tech/8051/ide/fat32.html

http://www.project-hf.net/blog/?no=38&category=5 사이트와


http://cafe.naver.com/carroty.cafe 사이트에 있는

kkamcneko님의 MP3 플레이어 소스