티스토리 뷰
Microsoft FAT Specification 문서에는 다음과 같은 FAT 파일 시스템의 간단한 메모리 구조를 설명하는 그림이 있다.
FAT 파일 시스템은 위의 그림에서처럼 크게 네개의 영역으로 나누어져 있다.
BPB는 BIOS Parameter Block의 머리글자이며 흔히 boot sector 혹은 boot record라고 한다. BPB안에 FAT에 대한 세부 정보가 들어 있으므로 이 정보를 가지고 다른 영역의 위치를 찾아낼 수 있다.
FAT은 File Allocation Table의 약자이며 디렉토리와 파일들이 Data 영역의 어디에 위치하고 있는지 그 정보를 알기 위하여 사용된다.
Root Directory는 최상위 디렉토리에 대한 정보가 들어 있다.
Data 영역에는 디렉토리와 파일들이 실재하는 영역이다.
4개의 영역중에서 Root Directory Region은 FAT12/FAT16에서만 존재하고, FAT32는 Root directory가 일반 directory와 같이 취급되기 때문에 별도의 구분된 영역을 할당하지 않고 Data 영역안에 들어가게 된다. 따라서, FAT32는 세개의 영역만 존재한다고 보면 된다.
SD 메모리 카드 전체 영역을 위의 그림처럼 하나의 FAT32 파일 시스템으로 설정하여 사용할 수도 있겠지만, 필요에 따라 컴퓨터의 하드디스크를 C:, D: 드라이브로 나누듯이 여러 파티션으로 독립된 영역으로 나누어서 사용할 수도 있다.
만약, 이런식으로 여러개의 파티션으로 나누게 될 경우 각각의 파티션의 시작 위치와 그 크기에 대한 정보를 SD 메모리 카드의 첫번째 섹터안에 특정 위치에 기록해 놓아야 한다. 이러한 파티션 정보가 들어있는 첫번째 섹터를 MBR(Master Boot Record)이라고 부른다.
MBR에는 최대 4개까지의 파티션 정보를 기록할 수 있는데, 파티션 안에서 새로운 파티션을 만들 수 있으므로 생성할 수 있는 전체 파티션의 개수에는 제한이 없다.
파티션 정보를 제공하는 각각의 partition table entry는 16바이트 크기로 되어 있으며, 모두 4개의 table entry 영역이 있으므로 전체 partition table 크기는 64 바이트가 된다.
Partition table entry 구조는 위와 같으며 각각의 내용은 다음과 같은 의미를 가진다.
Boot Flag는 메모리가 부팅 가능한지(0x80), 부팅이 불가능한지(0x00)를 알려 준다.
Start CHS와 End CHS는 하드디스크에서 말하는 cylinder, Head, Sector 표현하는 메모리의 위치 정보이다. SD 메모리 카드에서는 거의 사용하지 않으므로 무시한다.
Part Type은 파티션 종류를 알려주는 데이터이며 FAT32는 0x0B혹은 0x0C 값을 가진다.
Partition start address는 이 파티션이 어디에서부터 시작되는지 sector 위치를 알려준다.
Partition Size는 이 파티션의 크기가 모두 몇개의 sector로 되어 있는지 그 크기를 알려준다.
각각의 partition table entry가 위치하는 offset 주소는 다음과 같다.
Partition #0는 MBR 영역의 0x1BE ~ 0x1CD에 있고,
Partition #1은 0x1CE ~ 0x1DD,
Partition #2는 0x1DE ~ 0x1ED,
Partition #3은 0x1EE ~ 0x1FD에 정보가 들어있다.
실제로 SD 메모리의 0번 섹터를 읽어 보면 다음과 같은 MBR 데이터를 볼 수 있다.
위 그림의 경우에는 partition #0만 설정되어 있는것으로 나타나 있다.
위에서도 언급하였지만, SD 메모리 카드의 첫번째 섹터에는 MBR 데이터가 올 수도 있고, 다음 글에서 설명할 Boot record(BPB) 데이터가 쓰여 있을 수도 있다.
결국 SD 메모리 카드의 첫번째 섹터에 쓰여져 있는 데이터가 MBR인지 BPB인지 구분할 수 있는 방법을 알아야 할 것이다.
이러한 점을 고려하여 특정 파티션이 SD 메모리 카드의 어디에 위치하고 있는지 알아내는 코드를 만들어 보도록 하겠다.
get_bootsector() 함수를 통해서 원하는 파티션의 시작 위치를 알려주게 된다.
9번 줄은 0번 섹터에서 데이터를 읽어 와서 buf라는 곳에 넣어놓게 된다.
읽어 온 데이터가 유효한 데이터인지 확인하기 위하여 15번줄에서처럼 위의 그림에 보이는 마지막 데이터인 0x55, 0xAA가 쓰여져 있는지 확인한다.
22번줄에서는 Boot flag 값이 0x00이나 0x80값인지 확인한다.
값이 맞으면, Partition type인 FAT에 해당되는 값을 가지고 있는지 확인하기 위하여 loop를 돌면서 26번 줄을 수행하여 해당 값을 비교한다.
해당 partition table entry가 유효하다면 28~31의 코드처럼 파티션의 시작 위치를 알아낸다. 참고로 FAT은 little endian으로 되어 있으므로 낮은 주소에 낮은 데이터가 들어 있게된다.
만약 MBR이 없는 경우에는 0의 값을 리턴하도록 되어 있다.
위의 그림의 경우 0번 파티션은 0x00000800에서 시작 된다고 예상할 수 있을 것이다.
SD 메모리 카드에는 MBR이 없거나 하나의 파티션만 사용하는 경우가 대부분이므로 위의 코드처럼 0번 파티션의 위치를 찾도록 하겠다.
보드에서 실행시켜 보면 0번 섹터가 2048(0x800)에서 시작되는 것으로 나왔기 때문에 예상했던 결과를 얻을 수 있었다.
2048번째 섹터를 읽어 보면 FAT32의 boot record가 쓰여져 있는것을 확인 할 수 있다.
이렇게 찾아낸 FAT32의 boot record에는 어떤 내용이 있는지는 다음 글에서 설명하도록 하겠다.
'프로젝트 > 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 - BPB(BIOS Parameter Block) (0) | 2017.09.12 |
FAT32 - 파일 시스템 (0) | 2017.09.05 |