본문 바로가기

Job Notes/File System

(5) SD 카드의 MBR 읽기

지난번까지 FAT32의 전체적인 구조에 대해 알아보았습니다.^^

FAT32에 대해 어느 정도 알아봤으니, 이제 실제로 SD카드를 읽어 봐야겠죠?^^


(MBR에 대해서 잠시 기억을 상기시켜 보면... MBR에는 Boot Code가 있고,4개의 파티션 테이블이 있고,

끝 부분에 매직코드가 있다고 했습니다.^^)


아래의 데이터는 SD메모리의 0번 섹터(MBR)를 읽은 것입니다.
 

MBR (마스터 부트 레코드)

사용자 삽입 이미지


분홍색 동그라미 부분이 FAT32 포맷임을 알리는 매직코드입니다.



MBR 섹터에는 매직코드 뿐만 아니라, 파티션 테이블도 4개가 존재합니다. SD메모리 카드는 파티션이 하나이므로

4개의 파티션 테이블 중에서 Partition1만 사용합니다. 이 부분을 아래에 나타내었습니다.


사용자 삽입 이미지


위의 그림을 보면서 파티션 테이블 값을 적어보면,


Partition1 = 80 01 01 00    0B 07 60 DA   27 00 00 00    D9 DB 01 00

Partition2 = 00 00 00 00    00 00 00 00     00 00 00 00    00 00 00 00

Partition3 = 00 00 00 00    00 00 00 00     00 00 00 00    00 00 00 00

Partition4 = 00 00 00 00    00 00 00 00     00 00 00 00    00 00 00 00 입니다.


이 데이터만 보더라도 파티션 테이블이 1개만 쓰인다는 것을 알 수 있습니다. 즉, Partition1만 사용되고 있습니다.^^




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

파티션 테이블 구조

사용자 삽입 이미지


Partition1의 값은 = 80 01 01 00    0B 07 60 DA   27 00 00 00    D9 DB 01 00 로서 우리가 필요로 하는 정보는 빨간색 부분의 값입니다.

따라서 0B와 27 00 00 00 값이 무엇을 의미하는지만 파악하면 됩니다.^^ 위의 파티션 테이블과 Partition1의 값을 비교해 보면,

Type Code는 = 0B 이고, LBA Begin은 = 27 00 00 00 임을 알 수 있습니다.^^ 여기서 한 가지 주의해야 할 점이 있는데, LBA Begin값을 읽을 때 반대로 읽어야 한다는 점입니다. 즉 LBA Begin값은 = 00 00 00 27 이 되고, 이것이 정확한 값이라고 합니다. 그러니까 LBA Begin에 값이 거꾸로 저장되어 있던 것 같습니다. Type Code는 1 바이트이니까, 반대로 저장될 것이 없고, 2바이트 이상의 데이터만 반대로 저장되는 것으로 보입니다. 이렇게 데이터를 반대로 저장하는 방식을 "리틀엔디안(little-endian)" 방식이라 부른다고 합니다.



Type Code = 0x0B 이므로 이 값은 현재의 파티션이 FAT32 파일시스템임을 나타냅니다.

LBA Begin = 0x00 00 00 27로서 PBR의 시작 주소입니다. 따라서 0x00 00 00 27 섹터를 찾아가 보면 그곳의 512 바이트가 파티션 부트 레코드(PBR)영역이 됩니다. 좀 더 자세히 설명하면, 0x00 00 00 27은 섹터 번호를 나타냅니다. 이 값은 16진수이므로 섹터 번호가 몇 번인지 알아보기 위해 10진수로 바꿔보면 0x00 00 00 27 = 39가 됩니다. 즉, SD메모리의 39번째 섹터가 PBR입니다. (39라는 값은 SD메모리의 용량에 따라 변하는 것 같습니다.)



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

프로그래밍 부분입니다.


MBR 섹터에서 가져올 정보는 파티션 테이블입니다. MBR 섹터에 들어 있는 4개의 파티션 테이블 중에서 Partition 1의 정보를 가져와야 하는데, 아래의 코드가 Partition1을 나타냅니다. (kkamcneko님의 소스를 참고하였습니다.)


사용자 삽입 이미지


위의 코드는 아래의 파티션 테이블과 같은 구로조서 구조체로 선언되어 있습니다. 아래의 파티션 테이블과 비교해 보면

Type은 아래의 Type Code에 해당하고, StartLBA는 LBA Begin에 해당하는 값입니다.


파티션 테이블 구조


사용자 삽입 이미지



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

위의 내용을 간단히 정리하면,


MBR의 Partition1에서 "LBA Begin 값 추출" -> 이 주소를 따라서 "PBR 섹터로 이동" 정도로 요약이 됩니다.^^

다음에는 PBR 섹터로 이동해서 PBR 섹터에는 어떤 정보가 들어 있는지 알아보겠습니다.