2014-11-20 9 views
0

C에서 파일 시스템을 직접 구현해야합니다. FAT 시스템과 유사한 시스템을 만들 계획입니다. 크기가 10MB 인 파일 하나가 주어지며,이 파일은 우리 자신의 "디스크"역할을합니다. FAT 테이블에는 클러스터 번호가 저장되고 루트 디렉토리에는 파일 이름, 크기, 마지막 수정 날짜 및 시간, FAT 시작 블록 등 작성한 각 파일에 대한 기타 관련 정보가 저장된다는 사실을 알고 있습니다. 그러나 클러스터 번호가 디스크의 데이터 영역에있는 물리적 주소로 어떻게 변환되는지 혼란 스럽습니다.FAT 파일 시스템에서 메모리 변환이 어떻게 작동합니까?

예를 들어, 루트 디렉토리의 항목에서 FAT 테이블의 블록 100에서 파일이 시작되고 FAT 테이블의 블록 100에서 정수 327이 있다고 가정하면 파일의 다음 클러스터 위치. 이 주소는 디스크의 데이터 영역에있는 물리적 주소로 어떻게 변환됩니까? 이 실제 주소는 어디에서 번역되고 저장됩니까?

+0

아니요. 루트 디렉토리는 파일에 대한 정보를 루트 디렉토리에 저장합니다. FAT 테이블에는 파일에 대한 메타 데이터가 저장됩니다. 시작 클러스터, 크기, 파일 이름, 어쩌구 저쩌구. –

+0

FAT가 어떻게 작동했는지에 대한 오래된 DOS 3 또는 4 시대 참고 자료를 찾고 싶다면 아키텍처를 에뮬레이트하고 싶을 것입니다. 나는 마크 (Marc)와 동의한다. –

답변

2

클러스터는 FAT (FAT12, FAT16 및 FAT32)의 다른 버전간에 크기가 다르지만 일반적으로 클러스터 번호는 기존 파일 시스템의 형식으로 나타나는 크기의 연속적으로 번호가 지정된 클러스터를 나타냅니다. 필자가 기억 하듯이 (적어도 오래전부터) FAT12는 적어도 하드 디스크에서 최대 클러스터 수 2^11 (12 비트는 0으로 시작)을 사용하여 2 개의 키위 바이트 클러스터 (각각 512 바이트 섹터 4 개로 구성)를 사용 했으므로 클러스터 (327)는 디스크의 데이터 영역의 시작으로부터 327 * 2048 바이트가 될 것이다.

데이터 영역에는 FAT, 백업 FAT 및 모든 디렉터리가 포함됩니다. 내 기억은 FAT의 각 클러스터 항목에는 해당 클러스터를 차지하는 파일의 다음 클러스터 포인터, 파일의 마지막 클러스터 인 경우 데이터 길이 및 파일 읽기 또는 쓰기에 필요한 기타 정보가 들어있는 반면 디렉터리 항목은 파일 이름, 첫 번째 클러스터, 크기/날짜/등을 포함합니다.

+0

이 답변은 내가 찾은 것과 가장 비슷합니다. FAT 테이블은 파일 고유의 메타 데이터를 저장하지 않고 체인의 다음 클러스터에 대한 포인터 만 또는 파일의 끝을 나타내는 EOC를 저장합니다. 다른 곳에서 찾은 것부터 FAT 테이블의 i 번째 항목은 데이터 영역의 i 번째 데이터 블록에 해당합니다. 도움 주셔서 감사합니다. –

+0

기꺼이 도와 드릴 수있었습니다. 섹터 편집기를 사용하여 클러스터 크기를 줄이고 과립 낭비를 줄임으로써 공간을 확보하기 위해 파티션 테이블과 FAT를 다시 작성한 이후로 매우 오랜 시간이 걸렸습니다. 이는 30 MB 또는 40 MB 드라이브에 있었던 것입니다 ... –

+0

@ ZeissIkon how is is 2^11 = 12 비트 ?? 왜 안 11? – Mohsin

1

디스크는 섹터로 나뉩니다. 예를 들어 하드 디스크의 섹터 크기는 512 바이트입니다. 디스크의 주소 지정 데이터는 일반적으로 이러한 섹터를 사용하며 데이터는이 크기의 블록으로 읽거나 쓰여집니다. FAT 파일 시스템은 여러 섹터를 클러스터로 그룹화합니다. 예를 들어 클러스터 당 8 개의 섹터를 가질 수 있습니다. 이 상수는 파티션의 처음 몇 섹터에있는 파일 시스템에 대한 다른 정보와 함께 저장됩니다. FAT 드라이버는이 값을 사용하여 클러스터 번호에서 섹터 번호를 계산합니다. 이 수식은 다음과 같이이다 :

SectorNumber = SectorsPerCluster * ClusterNumber + 상수 파티션의 데이터 영역의 최초의 섹터의 섹터 번호

정수. 정확한 수식은 FAT 사양에서 찾을 수 있습니다.