티스토리 뷰
이번 글에서는 FAT 파일 시스템의 가장 중요한 시작점이라 할 수 있는 BPB 혹은 boot record에 대해서 알아보도록 하겠다.
Boot record가 무엇인지 간단히 설명하자면, FAT 파일 시스템이 어떻게 구성되어 있는지 알려주기 위한 주요한 파라미터들이 들어있는 영역이라고 보면 될 것이다.
이러한 파라미터를 분석하여 FAT 파일시스템이 FAT12, FAT16, FAT32 중에 어떤 것인지 알 수 있고, 그에 따라 FAT 영역이 어디에서 시작하는지, 그리고 실제 파일과 디렉토리가 저장되는 데이터 영역은 어디에 있는지 찾을 수 있게 되는 것이다.
Boot record는 FAT12/FAT16/FAT32 모두 사용하는 공통 파라미터 영역이 있고, FAT32의 경우 별도로 몇개의 파라미터가 추가되는 형식으로 되어 있다.
Microsoft의 문서를 보면 각각의 boot record에 들어 있는 파라미터들에 대하여 자세히 설명되어 있지만, 여기에서는 그중에서도 FAT32와 관련된 내용중에 필요한 것들에 대해서만 설명하도록 하겠다.
위에 보이는 코드를 실행하면 boot record 파라미터중 중요한 몇가지 파라미터에 대한 값을 볼 수가 있다.
위의 그림에서 초록색으로 칠해진 부분은 FAT12/FAT16/FAT32 모두 적용되는 공통 파라미터 영역이고, 빨간색으로 칠해진 부분이 FAT32 전용 파라미터 영역이다.
FAT32에서 필요한 파라미터는 다음과 같은 것들이다.
Bytes per Sector는 11번째 위치한 2바이트 크기의 데이터이며 하나의 섹터가 몇바이트로 이루어져 있는지 알려주는 파라미터이다. 시험에 사용된 메모리에서 실제로 읽은 값이 512바이트로 되어 있는 것을 볼 수 있는데, 일반적으로 이 값은 512바이트 값을 가지게 된다. 이 크기 단위로 SD 메모리 카드에서 읽어 오거나 쓰게 되는 것이다.
Sector per cluster는 13번째 위치하며 1바이트로 표현되는 값이다. 이 값은 하나의 클러스터가 몇개의 섹터로 이루어져 있는지 알려주기 위하여 사용된다.
클러스터가 무엇인지 꼭 알고 있어야 하는데, 디렉토리나 파일은 클러스터 단위로 처리되기 때문이다. 시험에 사용된 SD 메모리에는 64로 되어 있는데, 즉, 하나의 클러스터가 64개 섹터로 이루어져 있다는 것이다. 섹터 크기가 512바이트이므로 시험에 사용된 메모리는 하나의 클러스터가 32Kbyte 크기라는 것을 계산으로 알 수 있다. 이 말은 비록 1바이트 크기의 데이터를 저장하게 되더라도 32KByte 영역이 할당 되어야 한다는 뜻이다.
그러므로 클러스터당 섹터수가 크게 되면 그만큼 낭비되는 메모리 영역이 많아 진다는 것을 의미 하게된다. 그렇다고 해서 무작정 클러스터 크기를 줄일수는 없다. SD 메모리 카드의 용량이 대용량인 경우 클러스터 크기가 작아지게 되면 FAT 크기가 상대적으로 증가되어야 하고 그만큼 파일을 처리하는데 많은 리소스가 필요하게 되기 때문이다.
Reserved Sector count는 위의 표에서도 설명된것처럼 데이터 영역의 시작 위치를 클러스터 크기를 고려하여 align 용도로 사용된다. FAT 영역은 reserved sector 영역 다음에 바로 위치하게 되므로 이 값을 알고 있어야 한다.
Number of FATs은 메모리 내에 FAT이 몇세트가 들어 있는지 알려주기 위하여 사용된다. 일반적으로는 주로 2개의 FAT이 들어 있게 된다. FAT을 이용하여 파일의 위치를 찾을 수 있기 때문에 만약 FAT 데이터에 손상이 있게되면 필요한 파일을 찾을 수 없게 된다. 이러한 불상사에 대비해서 동일한 FAT을 여러개 두어서 만약 첫번째 FAT이 손상되더라도 나머지 정상적인 복사본을 이용하여 복구할 수 있게 되는 것이다.
Root entry count, FAT16 sector count, FAT16 size 파라미터는 FAT32에서 사용되지 않는 것들이다. 그러므로 이 값들은 반드시 0으로 되어 있어야 한다. 만약 FAT12/FAT16 구조를 가지게 되면 이 값은 0이 아닌 값을 가져야 하고 대신에 FAT32관련 파라미터가 0으로 되어 있어야 한다.
Total FAT32 sector는 전체 볼륨이 몇개의 섹터로 되어 있는지 알려주는 값이다. 시험에 사용된 메모리는 61,313,024개의 섹터로 되어 있으므로 31,392,268,288 바이트, 즉, 32GByte 크기이라는 것을 알 수 있다.
FAT32 size는 FAT 하나가 크기가 몇개의 섹터로 되어 있는지 알려주는 파라미터이다.
시험에 사용된 메모리의 경우 7483 크기로 되어 있고, 2개의 FAT이 있으므로 FAT을 위해 할당된 영역은 7483 x 2 = 14966 섹터라는것을 알 수 있다.
Root cluster number는 FAT32 구조에서 root directory가 몇번째 클러스터에 위치하고 있는지 알려주는 파라미터이다. FAT12/FAT16의 경우에는 FAT영역 바로 뒤에 Root directory 영역이 시작되지만 FAT32의 경우에는 데이터 영역 어디에라도 위치할 수 있다. 다만, 일반적으로 FAT영역 다음에 위치하게 만든다.
FAT 설명 글에서 얘기하겠지만 FAT의 첫번째 2개의 데이터는 예약되어 있기 때문에 일반적으로 Root cluster number는 2의 값을 가지게 된다.
FS info sector는 FSINFO라는 구조체가 들어 있는 섹터의 위치를 알려주기 위하여 사용된다. FSINFO에는 사용가능한 클러스터의 개수와 그 시작 위치에 대한 정보가 들어 있는데 이 값을 읽으면 사용 가능한 남은 용량이 대충 얼마인지 가늠할 수 있게 된다.
위의 파라미터와 실제로 읽은 값들을 이용하여 시험에 사용된 SD 메모리 카드의 구조와 위치를 정리하면 다음과 같다.
위의 그림을 통해서 각각의 영역이 시작되는 섹터 번호를 알 수 있다. 데이터 영역이 시작되는 위치가 헥사 값으로 0x4800임을 알 수 있고, 이렇게 클러스터 단위로 align 시키기 위해서 reserved sector 크기를 1418로 설정하게 된 것을 이해할 수 있을 것이다.
위의 그림은 FAT32 구조의 FAT 데이터를 보여주고 있다.
위의 그림은 root directory 데이터가 시작되는 부분을 읽어 온 것이다. 자세히 보면 디렉토리와 파일 이름을 발견할 수 있다.
위의 그림은 FS_info 데이터 영역을 읽어 본 것이다. 초록색으로 표시되어 있는 부분이 남아 있는 클러스터 개수와 첫번째로 비어 있는 클러스터의 위치를 알려 주는 부분이다.
이 블로그에서는 무조건 FAT32를 다루었지만, 만약 FAT12나 FAT16에 대해서도 고려해야하는 경우라면 boot record 파라미터를 분석하여 어떤 종류의 파일 시스템으로 만들어져 있는지 알아내야 한다.
간단한 방법으로는 boot record 안에 있는 "FAT16" 혹은 "FAT32" 라고 되어 있는 부분을 읽어서 판단할 수 있는데 이 방법은 100% 확실한 방법이 아니다.
가장 확실한 방법은 데이터 영역이 몇개의 클러스터로 되어 있는지 계산하여 그 값이 12비트 값으로 표현 가능하면 FAT12이고, 16비트 값으로 표현가능하면 FAT16이고 그 보다 더 큰 클러스터 개수이면 FAT32이라고 판단한다.
위의 내용은 Microsoft에서 권고하는 FAT type을 알아내는 방법이다.
위의 내용을 참고하여 FAT 종류를 알아보는 프로그램을 만들어 보도록 하겠다.
위의 코드를 이용하여 알아낸 FAT type의 결과는 다음과 같다.
데이터 영역의 클러스터 개수가 957760이므로 FAT32 구조로 되어 있다고 판단할 수 있다.
'프로젝트 > FAT32' 카테고리의 다른 글
FAT32 - fat32_opendir(), fat32_readdir() (0) | 2017.09.20 |
---|---|
FAT32 -FAT Entry (0) | 2017.09.18 |
FAT32 - Directory Entry (0) | 2017.09.14 |
FAT32 - MBR(Master Boot Record) (3) | 2017.09.05 |
FAT32 - 파일 시스템 (0) | 2017.09.05 |