저는 현재 Linux 시스템에서 OS 개발을 하고 있습니다. 이 과정에서 파일(예: Disk.img)에 FAT12 파일 시스템을 만들고 싶습니다. mkfs 명령을 다음과 같이 사용합니다.
touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img
16진수 편집기로 볼 때 'SECTORS_PER_FAT'가 기본적으로 2인 것을 확인했습니다. 9로 만들고 싶은데요.. 어떻게 해야 하나요??
편집: BIOS 매개변수 블록에는 다음 정보가 있습니다(단순히 수동으로 수행하고 싶지 않고 대신 mkfs를 사용하고 싶습니다).
(이것은 어셈블리 조각입니다.http://www.brokenthorn.com/Resources/OSDev5.html)
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9 ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
그런데... 총 클러스터 수와 클러스터당 섹터 수에 따라 FAT의 크기(섹터 수)가 자동으로 결정되어야 한다고 생각합니다... 따라서 BPB에서 섹터_당_지방을 정의하는 것은 중복될 수 있습니다... 의미는 다음과 같습니다. 임의의 값....
답변1
기본적으로 'SECTORS_PER_FAT'는 2입니다. 만들고 싶어요 9. 어떻게 해야 하나요?
이 숫자는 자동으로 계산되는 것 같습니다. 파일 할당 테이블에는 클러스터당 하나의 항목이 있고 클러스터 수는 유한하고 미리 알려져 있으므로 FAT에 더 많은 섹터를 할당할 필요가 없습니다.
귀하의 경우 2는 "기본적으로"가 아니며 대부분 파일 시스템 크기(크기 Disk.img
)와 클러스터 크기에 의해 결정됩니다.
가능한 최소 클러스터 크기(예: 최소 논리 섹터 크기( -S512
) 및 클러스터당 최소 섹터 수( -s1
))를 선택합니다.
# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
이는 주어진 파일 크기에 대한 최대 클러스터 수, 즉 FAT의 최대 항목 수, 최대 FAT 크기, FAT당 필요한 최대 섹터 수를 제공합니다. 아직은 6개밖에 안 됐어요.
이론적으로는 공식적으로 더 많은 섹터를 할당할 수 있고 파일 시스템이 유효할 것이라고 생각합니다. 요점은 모든 클러스터가 이미 이 6개 섹터의 항목에 포함되어 있기 때문에 FAT의 추가 섹터는 절대 사용되지 않는다는 것입니다. 실제로는 mkfs.vfat
이와 같은 섹터를 낭비하지 않습니다.
거친1MiB를 계산하고 -S512 -s1
FAT당 6개의 섹터를 제공합니다.
- 우리소홀히 하다클러스터 이외의 구조는 마치 모든 공간이 클러스터에 기여한 것처럼 보입니다. 클러스터 에는
-S512 -s1
0.5KiB가 소요됩니다. 1MiB는 정확히 2Ki의 클러스터를 보유합니다. 이 계산에서 클러스터 수는 다음과 같습니다.부풀어 오른엄격한 가치에 관해서. - FAT12에서는 하나의 항목이 12비트(3바이트당 2개의 항목)를 차지하므로 1.5B입니다. 클러스터당 하나의 항목이 필요합니다. 2Ki 항목에는 3KiB가 필요합니다. 따라서 FAT는 3KiB를 차지해야 하며 이 숫자도부풀어 오른.
- 단일 섹터는 0.5KiB입니다. 3KiB를 저장하려면 6개의 섹터가 필요합니다. 3KiB는 다소 부풀려졌으므로많으면6개 섹터.
도구는 이 수치를 더 엄격하게 계산합니다.
FAT의 수( -f
)는 거의 중요하지 않습니다. 클러스터가 별도의 FAT로 나누어지는 것은 아닙니다. 추가 FAT는 복사본일 뿐이며 각 FAT는 여전히 모든 클러스터에 서비스를 제공합니다. FAT가 많을수록 더 많은 공간을 차지하므로 클러스터 수가 약간 줄어듭니다. 파일 시스템의 일부 "임계값 크기"의 경우 이 현상은 FAT당 섹터 수에 영향을 미칩니다. 그러나 1MiB의 경우 -S512 -s1
FAT당 필요한 섹터 수는 관계없이 6개입니다 -f
(참고: 내 테스트에서는 mkfs.vfat
4개 이상의 FAT 생성을 거부했습니다).
주어진 파일 시스템 크기에 대해 클러스터 수를 최대화한 후 FAT당 섹터 수를 늘리는 가장 쉬운 방법은 파일 시스템을 더 크게 만드는 것입니다. 1MiB에 대해 6개를 얻었으므로 아마도 1.5MiB에 대해 9개를 얻을 것입니다. 물론:
truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
Note 1536k
는 9를 얻기 위한 최소 크기가 아닙니다. 테스트에서 1389k
9를 주었고 1388k
8을 주었습니다. 이제 -f
숫자가 어떻게 영향을 미치는지 볼 수 있습니다. For 1389k
-f2
(기본값)는 9와 -f3
8을 제공합니다. For 1388k
-f1
는 9와 -f2
8을 제공합니다.
내 테스트베드:
- 데비안 GNU/리눅스 9
mkfs.vfat
심볼릭 링크로mkfs.fat
mkfs.fat
버전: 4.1 (2017-01-24)
참고자료:
- FAT 파일 시스템작성자: Andries Brouwer
(2002년의 내용이지만 그 이후로 FAT12가 크게 바뀌지 않은 것 같습니다) - FAT 파일 시스템 설계위키피디아