지난번에는 SD 카드의 0번 섹터를 읽어 봤습니다.^^
0번 섹터는 MBR 영역으로 Boot Code + 4개의 파티션 테이블 + 매직코드 = 512 바이트로 구성되어 있음을 알았습니다.^^
SD 메모리에 들어 있는 MP3 파일을 읽기 위해 우선으로 하는 작업은 PBR(부트레코드) 섹터를 읽는 일입니다. 왜냐하면 PBR 섹터에 MP3 파일이 존재하는 섹터 번호가 저장되어 있기 때문입니다.(정확하게 말하자면 약간 다릅니다.^^) 따라서 PBR에 들어 있는 값을 참조하면 MP3 데이터가 있는 섹터를 알 수 있습니다.
MBR은 항상 SD 메모리의 0번 섹터에 위치합니다. 그러나 PBR이 위치하는 섹터는 MBR 섹터로부터 멀리 떨어져 있기 때문에 PBR이 위치하는 섹터를 찾으려면 앞에서 말한 바와 같이 MBR 섹터에 있는 Partition1 테이블에서 LBA Begin 값을 참조하면 됩니다.
앞 부분에서의 LBA Begin은 = 0x00 00 00 27 = 39란 값이 나왔는데, 이것은 64MB SD메모리 카드를 사용했을 때의 값입니다. 128MB 메모리, 또는 다른 용량의 SD메모리 카드를 사용한다면 LBA Begin 값은 다른 값으로 바뀔 수 있으므로 무조건 39번째 섹터가 아니라 LBA Begin 값을 확인하고 나서 PBR 섹터로 점프해야 합니다.^^
아래의 데이터가 39번 섹터(PBR)에 들어 있는 내용입니다. (PBR은 "파티션 부트레코드" = "부트레코드" = "부트섹터"와 같은 말입니다.)
PBR (파티션 부트 레코드)
PBR 섹터에서 찾아야 할 값은 아래의 그림에서 보이듯, 약 7가지 정도로 이 7개의 항목을 Volume ID라 부릅니다.
이 중에서 4개의 변수만 파악하면 된다고 합니다. (후에 다른 값을 더 찾아야 하는지.. 아직 모르겠습니다.^^;)
Volume ID 항목을 나열해 보면,
1. Bytes Per Sector (섹터당 바이트 수)
2. Sectors Per Cluster (클러스터당 섹터 수)
3. Number of Reserved Sectors (예약된 섹터의 개수)
4. Number of FATs (FAT의 개수)
5. Sectors of Per FAT (FAT당 섹터 수)
6. Root Directory First Cluster (루트 디렉토리의 첫 섹터)
7. Signature (매직코드)
이렇게 7개의 항목이 존재합니다. 이 중에서 1, 4, 7번 항목은 위에서 오른쪽 그림에 값이 나와 있습니다. 즉,
1. Bytes Per Sector = 0002 ->리틀엔디안 형식이므로 뒤에서 부터 읽으면 02 00 이 됩니다. 0x0200 = 512로서 섹터당 바이트수를 나타냅니다.
4. Number of FATs = 02 -> FAT의 개수를 나타냅니다. FAT#1, FAT#2가 있으므로 FAT의 개수는 2개가 맞습니다.
7. Signature = 55 AA -> PBR의 매직코드입니다.
이제 위의 그림을 보면서 Volume ID 값을 실제로 찾아보겠습니다.^^
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
이렇게 되는군요.^^
이처럼 Volume ID 정보를 알게 알면 FAT#1, FAT#2 영역과 MP3 파일이 들어있는 Clusters 영역을 찾아갈 수 있습니다.
즉, Volume ID는 (FAT#1, FAT#2, Clusters 영역을 찾아갈 수 있도록) 이정표 구실을 하는 것입니다.^^
아래의 표가 위에서 말한 Volume ID 입니다.
---------------------------------------------------------------------------------------
프로그래밍 부분입니다.^^
아래의 코드는 PBR 섹터의 전체 구조를 나타냅니다. (kkamcneko님의 소스를 참고하였습니다.)
위의 구조체에서 분홍색으로 표시한 부분이 Volume ID 입니다.^^
---------------------------------------------------------------------------------------
지금까지 PBR 섹터에 대해 알아봤습니다.^^
PBR 섹터에는 Volume ID란 항목이 있고, 이 항목의 값을 통해서 FAT 정보가 위치한 섹터(FAT #1, FAT#2)를 찾아갈 수 있다는 것을 알았습니다. 다음에는 Volume ID 정보를 가지고 FAT#1, FAT #2, Clusters 영역에 어떻게 접근하는지 알아보겠습니다.
궁금하시죠? 저도 궁금합니다.^^