티스토리 뷰

프로젝트/FAT32

FAT32 - Directory Entry

Just4Fun 2017. 9. 14. 19:38

이번 글에서는 디렉토리와 파일들에 대한 메타 정보를 담고 있는 directory entry에 대해서 알아보도록 하겠다.

첫번째로 할 일은, 디렉토리 정보를 분석하기에 앞서 FAT32에 있는 주요한 세개의 영역이 어디에서 시작하는지 그 정보를 따로 저장해 두는것이 좋다.

예를 들어 앞의 글에서 설명한 내용중에 다음 그림을 볼 수 있는데,

BPB는 2048에서 시작되고, FAT영역은 3466에서, Data 영역은 18432에서 시작되는 것으로 확인 되었다.  이 값들은 SD 메모리 카드마다 다를수 있음을 주의하여야 한다.

이 영역들의 시작 위치는 다음과 같은 코드로 알아낼 수 있다.

이 코드를 실행하여 결과를 확인하면 다음과 같다.

각각의 영역을 정확하게 계산한 것을 확인하였다.

그럼, 이제 SD 메모리 카드에서 root directory에는 어떤 내용들이 알아보기 위하여 root directory가 있는 섹터의 위치부터 찾아보도록 하겠다.

앞의 글에서 설명한 내용중에 몇가지를 다시 요약해 보면, 파일과 디렉토리는 클러스터 단위로 관리되어 지고, FAT의 0, 1번에 대한 클러스터는 예약된 번호이므로 실제 데이터들은 클러스터 2번부터 시작된다.  즉, data 영역의 시작은 클러스터 2에 해당된다.

따라서 어떤 특정한 클러스터 'N'의 시작 섹터는 다음과 같은 공식을 이용하여 찾을 수 있다.

Data영역의 시작이 클러스터2번이므로 원하는 클러스터 번호에서 2를 뺀다음 'SecPerClus'를 곱해서 offset 값을 찾은 다음 data 영역의 시작을 더해 주면 된다.

위에 있는 그림에서 Root cluster num이 2로 되어 있으므로, 시험에 사용된 메모리의 root directory는 data영역이 시작되는 위치에 있다는 것을 알 수 있게 된다.

위에 보이는 그림이 data 영역의 시작이며 root directory에 해당되는 내용들이다.

그림에 32바이트 단위로 나누어 놓았는데 그 이유가 이번 글에서 설명할 directory entry에 해당되기 때문이다.

Directory entry는 위의 표에서 설명하는 것처럼 전체 32바이트로 되어 있으며, 디렉토리/파일 이름을 비롯하여 attribute, 생성,수정,접근한 날짜/시간, 클러스터 위치, 파일 크기등의 정보가 있다.

Directory entry에서 필요한 내용을 알아내려면 다음과 같은 내용을 먼저 이해 하여야 한다.

Directory entry의 가장 첫번째에 해당되는 DIR_Name[0]은 특별한 의미를 가지고 있는데, 그 값이 0xE5이면 그 디렉토리나 파일이 삭제되었다는 것을 의미한다.

만약 이 값이 0이라면 여기까지만 정보가 있고 이후에는 아무 정보가 없다는 directory entry의 끝을 의미한다.

DIR_Name[0]에 0x05가 올 수 있는데, 이 경우는 일본글자를 표현할때 0xE5로 시작되는 경우가 있는데 이때 디렉토리가 비어 있다는 의미인 E5대신 0x05를 사용하게 된다.

따라서 DIR_Name[0]의 값이 0xE5, 0x00이면 해당 디렉토리/파일이 유효하지 않다는 뜻이 된다.

DIR_Attr는 위의 설명처럼 모두 6개의 특성을 표현하는데, 주의할 것은 파일이나 디렉토리의 이름이 8글자 이상인 경우 이를 알려주기 위하여 attribute 값이 0x0F로 설정된다는 것이다.  즉, 0x0F는 LFN(long file name)이므로 이 부분은 별도로 처리해 주어야 한다.

이제 위의 두가지 경우를 주의해서 root directory에 들어 있는 내용의 주요 파라미터들을 출력해 보도록 하겠다.

먼저 directory_entry 구조에 맞게 위의 구조체를 만든다.

"ls"라는 이름의 명령어를 등록하고, ls를 입력하였을때 실행되는 함수로 list_dir()을 연결 시켰다.

9번 줄에서 root directory가 위치한 섹터 정보를 계산한다.

10번 줄에서는 하나의 섹터만큼 메모리에서 데이터를 읽어 오기 위한 버퍼를 할당 받는다.

14번 줄은 하나의 클러스터에 한해서 directory entry를 검색하기 위한 부분이다.

원래는 디렉토리나 파일의 개수가 클러스터 크기가 제공하는 영역보다 클 경우에는 FAT entry를 참조하여 다른 클러스터에서 연속해서 읽어 와야 하지만, 여기에서는 하나의 클러스터 내부에서만 처리하는것으로 제한을 두었다.

19번 줄은 읽어온 섹터내에 들어갈수 있는 directory entry 개수만큼 반복하기 위한 코드이다.  일반적으로 섹터 크기가 512바이트라면 directory entry 크기가 32바이트이므로 16개의 directory entry가 들어갈 수 있다.  만약 디렉토리와 파일의 개수가 16개보다 클 경우 다음 섹터에서 새로운 데이터를 읽어 와야 한다.

21번 줄은 DIR_Name[0]의 값이 0일 경우 더이상의 entry가 없으므로 전체 loop를 빠져나가도록 해야 한다.

 24번 줄은 DIR_Name[0]의 값과 attribute 값이 모두 정상인것을 검사하는 코드이다.

36번 줄은 다음 directory entry로 위치를 옮기는 코드이다.

39번 줄은 읽어 온 섹터안에 directory entry의 끝이 없을 경우 다음 섹터에서 데이터를 읽어 오기 위하여 섹터 번호를 증가시키는 코드이다.

위의 코드를 이용하여 실제 메모리에서 root directory를 읽어 보면 다음과 같은 내용이 출력되는것을 확인할 수 있다.

위의 그림을 보면 root directory에서 원하는 데이터를 제대로 읽어 온것을 짐작할 수 있다.  하지만, 그냥 눈으로 보기에는 좋지 않으므로 좀더 쉽게 확인할 수 있도록 코드를 좀더 보완해 보도록 하겠다.

디렉토리/파일의 날짜와 시간을 출력하는 코드를 위와 같이 따로 만들어 보았다.

Attribute 내용을 각 비트별로 세분화 하였고, 파일이나 디렉토리의 생성 시점이 아니라 최종 수정 시점으로 출력하는 것으로 바꾸었다.   그리고 다음글에서 설명할 예정인 클러스터 번호까지 출력하도록 하였다.

수정된 코드를 실행하여 좀 더 개선된 결과를 볼 수 있다.

SYSTEM~1이라는 이름의 디렉토리의 attribute를 보면 시스템 디렉토리이며 숨겨진 디렉토리라는 것을 볼 수 있다.  나머지 FAT32, MICROSD, ADC, CM3RTOS는 디렉토리이기 때문에 파일크기가 모두 0으로 표시되어 있고, 유일한 파일인 CM3RTOS.ZIP은 크기가 94,057바이트라는 것을 알 수 있다.

이제, root directory에 어떤 디렉토리와 파일들이 있는지 알아보았으니 해당 파일과 각 디렉토리의 내용을 보려면 어떻게 해야하는지는 다음 글에서 설명하도록 하겠다.


fat32.zip


'프로젝트 > FAT32' 카테고리의 다른 글

FAT32 - fat32_opendir(), fat32_readdir()  (0) 2017.09.20
FAT32 -FAT Entry  (0) 2017.09.18
FAT32 - BPB(BIOS Parameter Block)  (0) 2017.09.12
FAT32 - MBR(Master Boot Record)  (3) 2017.09.05
FAT32 - 파일 시스템  (0) 2017.09.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함