[MBR] + [예약된 공간] + [PBR] + [예약된 공간]+ [FAT #1] + [FAT #2] + [클러스터]
=================================================================>===========>
위의 파란색 화살표 부분이 현재까지의 진행 상황을 나타냅니다.^^
앞 부분에서 [FAT #1]과 [FAT #2]에 대한 설명이 부족했지만, [클러스터] 영역으로 접근하는 수식은 PBR영역의 Volume ID 정보를 통해 쉽게 계산할 수 있습니다.
그럼 이제 [클러스터] 영역에 존재하는 루트 디렉토리에 대해 알아보겠습니다.^^
(SD메모리에 노래 2곡을 저장해 놓았는데, 파일이름은 ABBA.mp3와 MORNING.mp3 입니다.)
루트 디렉토리란, 예를 들어 C:\를 말합니다. 그럼 일반 디렉토리는 C:\Folder 라고 할 수 있겠네요.^^
루트 디렉토리 섹터
루트 디렉토리는 FAT#2 영역 바로 다음부터 시작합니다. 즉, [클러스터]가 시작되는 첫 번째 섹터부터를 말합니다.^^
루트 디렉토리가 위치하는 곳을 알았으므로, 프로그램을 짜서 돌리려면 루트 디렉토리 주소를 계산하는 식을 세워야겠죠?^^
[루트 디렉토리 주소 ] = [PBR주소값] + [예약섹터개수] + [FAT개수] * [FAT당 섹터수] 이렇게 식이 세워집니다. 다시 써보면,
[Cluster_Begin_LBA] = [LBA Begin] + [Reserved Sectors] + [Number of FATs] * [Sector Per FAT32]로서 실제값을 넣으면,
[루트 디렉토리 주소] = [0x00000027] + [0x0026] + [0x02] * [0x000003A9] = 0x0000079F = 1951로 계산이 됩니다. 식으로만 봐서는 잘 이해가 가지 않습니다.^^ 이 계산식을 쉽게 이해할 수 있도록 아래에 그림으로 나타내었습니다.
Volume ID는 지난번에 알아본 것처럼 아래와 같이 7개의 항목이 있는데, 이중에서 루트 디렉토리 주소 계산에 사용된 항목은
3, 4, 5번 입니다.^^
1. Bytes Per Sector (섹터당 바이트 수) - > 00 02 -> 뒤에서 부터 읽으면 0x02 00 = 512 바이트
2. Sectors Per Cluster (클러스터당 섹터 수) -> 0x01
3. Number of Reserved Sectors (예약된 섹터의 개수) -> 26 00 -> 뒤에서 부터 읽으면 0x00 26 = 38개
4. Number of FATs (FAT의 개수) -> 0x02
5. Sectors of Per FAT (FAT당 섹터 수) -> A9 03 00 00 -> 뒤에서 부터 읽으면 0x00 00 03 A9 = 937개
6. Root Directory First Cluster (루트 디렉토리의 첫 섹터) -> 02 00 00 00 -> 뒤에서 부터 읽으면 0x00 00 00 02
7. Signature (매직코드) -> 55 AA -> 뒤에서 부터 읽으면 0xAA 55
------------------------------------------------------------------------------------------
루트 디렉토리를 찾으셨나요?^^ 그럼 루트 디렉토리의 구조에 대해 알아보겠습니다.^^
루트 디렉토리는 아래의 그림처럼, 디렉토리 엔트리로 구성되어 있습니다.
SD 메모리에 MP3 파일을 2개 넣었으므로 디렉토리 엔트리의 개수도 2개가 됩니다.^^
루트 디렉토리 섹터
디렉토리 엔트리는 32 바이트로 구성되어 있습니다. 위의 그림을 보면 MP3 파일 한 개는 32 바이트의 디렉토리 엔트리를 가지고 있음을 알 수 있습니다.^^ 즉, 디렉토리 엔트리는 MP3 파일이 시작되는 곳을 알려주는 이정표 역할을 하므로 디렉토리 엔트리에 들어있는 값만 파악하면 실제로 MP3 파일이 시작되는 클러스터를 찾아갈 수 있습니다.^^
프로그래밍 부분입니다.
-----------------------------------------------------------------------------------
디렉토리 엔트리는 32 바이트 이므로 아래의 구조체도 32 바이트인 것을 알 수 있습니다. (kkamcneko님의 소스를 참고하였습니다.)
여기서 분홍색으로 표시한 부분만 파악하면 됩니다. 즉, Cluster Number(클러스터 넘버)만이 관심사항입니다.^^
-------------------------------------------------------------------------------------------
SD메모리에 들어 있는 파일은 위에서 말한 바와 같이, ABBA.mp3와 MORNING.mp3 입니다.
그리고 이렇게 파일 2개가 저장되어 있을 때, 루트디렉토리 섹터(클러스터의 첫 번째 섹터)에는 "디렉토리 엔트리"가 2개 생성됨을 알았습니다.^^
이번에는 아래의 그림처럼 SD메모리에 Folder 디렉토리를 추가로 만들고 그 안에 BOA.mp3와 HOT.mp3 파일을 저장한 후 루트 디렉토리 섹터를 다시 읽어 보겠습니다. 어떤 변화가 있을까요.
루트 디렉토리 섹터 (Folder 디렉토리 생성 후 다시 읽은 값)
SD 메모리에 Folder 디렉토리를 만들면 위와 같이 2개의 "디렉토리 엔트리"가 추가로 생성됩니다.
이 2개의 엔트리 중에서 아래의 엔트리만 파악하면 Folder 디렉토리 안으로 들어갈 수 있습니다.^^
Folder 디렉토리에 들어가면 BOA.mp3와 HOT.mp3라는 파일 이름이 보이겠죠?
위의 내용을 간단히 정리하면 SD메모리의
루트 디렉토리 섹터를 읽으면 ABBA.mp3와 MORNING.mp3 그리고 Folder 라는 문자가 보이고(위의 그림),
일반 디렉토리 섹터(Folder 디렉토리)를 읽으면 BOA.mp3와 HOT.mp3라는 문자가 보일 것입니다.^^
이제 Folder 디렉토리 섹터를 찾기 위해 "디렉토리 엔트리" 값을 파악해 보겠습니다.^^
<Folder 디렉토리에 해당하는 "디렉토리 엔트리" 값>
이 중에서 아래의 디렉토리 엔트리만 파악하면 Folder 디렉토리 섹터를 찾을 수 있습니다.^^ 엔트리 값을 나열하면,
디렉토리 엔트리 = [46 4F 4C 44 45 52 20 20 20 20 20 10 00 7D 24 47 91 34 91 34 00 00 25 49 91 34 B9 3B 00 00 00 00]가 됩니다.
Cluster High Cluster Low
여기서 파란색 부분의 값이 Folder 디렉토리를 찾는 열쇠가 됩니다. 아래의 디렉토리 엔트리 구조와 비교하면,
<디렉토리 엔트리 구조>
클러스터 Number = Cluster High + Cluster Low = 0x0000 3BB9 로서 이 값은 Folder 디렉토리가 몇 번째 클러스터부터 시작하는가를 나타냅니다. 따라서 Folder 디렉토리 섹터의 위치를 계산해야 하는데 그 식은,
[Folder 디렉토리 주소] = [루트 디렉토리 주소] + [클러스터 넘버 - 2] * [클러스터당 섹터수]로서, 값을 넣으면
[Folder 디렉토리 주소] = [ 0x0000079F ] + [ 0x00003BB9 - 2 ] * 1 = 0x0086AC00 으로 계산이 됩니다.
0x0086AC00은 섹터번호를 나타내므로 SD메모리의 0x0086AC00 번째 섹터에 Folder 디렉토리가 존재하는 것입니다.
Folder 디렉토리의 내용을 아래에 나타내었습니다.^^
-------------------------------------------------------------------------------
일반 디렉토리 섹터 (Folder 디렉토리 정보)
위의 데이터를 보면 점 한 개와 점 두개가 보입니다. 도스에서 많이 보던 점이네요^^
그리고 디렉토리 엔트리가 2개 있습니다. 노래가 2곡 들어 있으니까 디렉토리 엔트리도 2개 존재합니다.^^ 두 개의 디렉토리 엔트리 중에서 HOT.mp3 파일에 해당하는 디렉토리 엔트리만 살펴보면,
<디렉토리 엔트리>
로서 값을 나열하면,
File Size
[디렉토리 엔트리] = [48 4F 54 20 20 20 20 20 4D 50 33 20 10 3B 4A 47 91 34 91 34 00 00 87 B2 8B 34 95 59 E5 B4 3B 00] 로서
Cluster High Cluster Low
파란색 부분은 클러스터 넘버를, 빨간색은 HOT.mp3 파일 크기를 나타냅니다. "리틀 엔디안" 형식이므로 뒤에서 부터 읽으면
클러스터 넘버는 = 0x00 00 59 95 이고
파일 사이즈는 = 0x 00 3B B4 E5 = 3912933 바이트입니다.
파일 사이즈를 MB 단위로 바꿔보면, (3912933 / 1024) / 1024 = 3.73 MB로서 PC에서 확인한 값과 동일합니다.^^
-----------------------------------------------------------------------------------
쉽게 설명하려 했는데, 이해가 되셨는지 모르겠네요^^;; 지금까지, 루트 디렉토리를 찾고 루트 디렉토리에 들어 있는 정보를 이용하여 일반 디렉토리를 찾아 MP3 파일이 있는 곳까지 왔습니다. (사실 루트 디렉토리에 있는 MP3 파일만 찾아도 됩니다.^^)
이제 디렉토리(루트 디렉토리 또는 일반 디렉토리)에 있는 MP3 파일을 처음부터 끝까지 어떻게 읽어 내는가 하는 문제만 남아 있네요.^^ 다음에는 루트 디렉토리에 있는 MP3 파일(ABBA.mp3) 엑세스에 대해 알아보겠습니다.^^