오후 2:59 2004-05-31


조경민 bro(bro@shinbiro.com)


Implementation FAT File System


*본 문서는 편집 중입니당.. 설명에 도움이 되는
그림 추가 및 문체를 수정하는 중입니다. *


 


[Implementation FAT File System]


 


먼저 참조했던 문서 및 소스는


 http://neri.cafe24.com/menu/bbs/zboard.php?id=project&page=1&sn1=&divpage=1&category=5&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=23


에서 찾아볼 수 있다.


 


이중에서 이 문서에서 필요한 FileSystem이란 무엇인가 만 발췌해보겠습니다.


 


파일시스템
조사


2004-05-21
조경민 bro (bro@shinbiro.com)


================================================================


 


file
system ; 파일 시스템


 


1.
컴퓨터에서, 파일 시스템은 파일에 이름을 붙이고, 저장이나 검색을 위해 논리적으로
그것들이 어디에 위치시켜야 하는지 등을 나타내는 방법이다. 도스, 윈도우, OS/2,
매킨토시 및 유닉스 기반의 운영체계들은 모두, 파일들이 어딘가에 계층적인 구조로
위치하는 파일 시스템을 가지고 있다. 파일은 계층구조 내의 바른 위치인 디렉토리
(윈도우95 이후에는 폴더) 또는 서브디렉토리 내에 놓여진다. 파일 시스템들은 파일의
이름을 붙이는 규칙을 가지고 있다. 이러한 규칙에는 파일이름의 길이제한, 어떤
글자들이 사용될 수 있는지 등이 포함되며, 몇몇 시스템에서는 파일이름 확장자의
길이조차 제한을 두고 있다. 파일 시스템은 또한 디렉토리 구조를 통하여 파일까지
가는 경로를 설정하는 형식을 포함한다.


 


2.
때로 이 용어는 1.번에서 정의된 파일시스템을 지원하는 운영체계 또는 부가적인
프로그램의 일부를 지칭한다. 이러한 부가 프로그램의 예로는 NFS (Network File
System)나 AFS (Andrew file system) 등이 있다.


 


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


파일시스템의
구성


 


filesystem
- 일정한 file i/o 함수로 특정 기억 장치 미디어( 하드디스크,플로피 디스크, cd-rom,
플래쉬 메모리, RAM메모리, ROM 메모리, 가상파일 등)



구축되는 시스템으로 파티션/볼륨/디렉토리/파일을 접근/수정/생성/삭제 등의 관리를
하는 OS의 일부분. 조사해 본 결과 OS구현시 해당 OS에 맞는 filesystem을 만들어서
명명짓거나, 새로운 기술을 적용하여 여러 OS에 포팅할 수 있는 filesystem을 만들거나,
기억장치의 특성에 맞춘 파일시스템이 있을 수 있다.


출처
: 조경민 bro (bro@shinbiro.com)


 


예:
SMX rtos의 파일시스템 smxFile ™ Feature이다.


Features


FAT
12/16/32


DOS/Win9x
compatible


Extensive
drivers:  // 지원하는 저장매체이다.


   Floppy


   IDE
Hard Disk


   Compact
Flash


   DiskOnChip®


    PCMCIA-ATA


   Ultra
DMA


   ATAPI


   LS-120


   Zip®


    SCSI


   RAM
disk


   ROM
disk


   BIOS
devices


20
MByte/sec sustained transfer rate ( IDE Ultra-DMA )


Up
to 2 terrabyte disks


55
KB typical code footprint


20
KB typical data footprint


Multitasking
support


Contiguous
file support


Source
code included


Fully
integrated with SMX


출처:
http://www.smxinfo.com/rtos/fileio/smxfile.htm#note1


 


파티션
- 하드디스크경우 물리적 디스크 하나를 그대로 파티션 하나가 될 수 있으며 하드디스크의
공간을 나누어 파티션으로 관리 할 수 있다. 즉 디스크의 저장공간 단위 이다.


출처
: http://www.thinki21.com/os/win2000/05volume.htm


 


볼륨
- 파티션과 반대로 물리적 하드디스크 두개이상 또는 파티션 두개이상을 하나의 볼륨으로
묶을수 있다. 하나의 디스크가 하나의 파티션이되고 주파티션은 볼륨이 될 수 있다.


winnt서버에서는
볼륨 셋 [Volume Set] - Spanned Volume, 스트라이프 셋 [Stripe Set] - Striped
Volume, 미러 셋 [Mirror Set] - Mirrored Volume, 디스크 듀플렉싱 [Disk Duplexing],
패러티 사용 스트라이프 셋 [Stripe Set With Parity] - RAID 5 Volume 등으로 볼륨
종류를 나누고 있다.


 


디렉토리
- 여러개의 파일을 담아 놓는 논리적 공간 디렉토리는 속해있는 파일들의 위치 정보를
갖고 있다.


 


파일
- 파일시스템에서 데이타를 저장하는 물리적 단위


출처
: 조경민 bro (bro@shinbiro.com)


 


가장 추천하고 싶은 FAT 문서는 아래와 같습니다.


 


참조
문서:


 MS의
WhitePager:


 http://www.nondot.org/sabre/os/files/FileSystems/FatFormat.pdf


 


 GNU
Parted FAT file system documentation:


 http://www.polarhome.com:793/manual/parted-1.6.3/FAT


 


 Understanding
FAT32 Filesystems:


 http://www.pjrc.com/tech/8051/ide/fat32.html


 


 FAT
Guide:


 http://home.freeuk.com/foxy2k/disk/disk3.htm


 


[파일 시스템을 접근하는 방법]


 


FAT의 종류


FAT12 : 보통 20MB 이하의 디스크 또는 플로피에 적용


FAT16 : 보통 20MB 이상 512MB이하의 디스크에 적용 2GB까지 가능


FAT32 : 보통 512MB 이상이며 테라바이트까지 지원 가능하다.


 


먼저 FAT 파일시스템을 만들기 위해서는 기존 FAT 파일 시스템에 접근해서 읽어보는
것이 좋을것이다.


 


세가지 방법이 있습니다.


 


- 자신의 하드 HDD를 읽어본다. (용량상 FAT16/FAT32 테스트 가능하다)


 


- 자신의 플로피 FDD를 읽어본다. (용량상 FAT12만 테스트 가능하다)


 


- 하드의 해당 파티션 하나 또는 플로피 FDD 하나를 이미지 떠서 바이너리 파일로
만든후 해당 파일을 Ram 메모리에 올려 메모리에서 읽어보는 것이다. (이미지를 뜨거나
가상 파일 시스템을 만드는 툴을 이용하면 FAT12/16/32가능)


 


저의 경우는 개발 환경상 3번째 방법이 간편하여 선택하였습니다.


 


먼저 자신의 하드 HDD를 읽어보는 방법은 먼저 MBR이라는 것을 이해해야합니다.


 이 정보에 대한 문서는 아래의 'MBR/ 파티션 부트섹터 읽기' 를 참조하시기
바랍니다.


 


 


오전 4:42 2004-05-29


조경민 bro(bro@shinbiro.com)


MBR/ 파티션 부트섹터 읽기


==============================================


win nt를 소스 예를 들었으며 win9x는 codeproject( http://www.codeproject.com)


에서 DiskSector 라는 클래스를 가져다 쓰면 된다.


테스트되는 내 pc 는 하나의 물리 하드디스크를 3개의 파티션으로 나누어서


C: NTFS


D: NTFS


E: FAT32


로 한 상태에서 예를 보인다.


 


하드디스크의 물리적인 이름인 PHYSICALDRIVE0으로


열면된다. 두번째 hdd는 PHYSICALDRIVE1 이다.


 


        HANDLE
hDrive;


        TCHAR
szDrv[]=_T("\\\\.\\PHYSICALDRIVE0");


        DWORD
dwRead;


 


        hDrive
= CreateFile(szDrv, GENERIC_READ | GENERIC_WRITE,


                   FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);


 


        //
 how many bytes you want to read


        DWORD
dwSize = 512;


 


        //
Set pointer to begin of file


        SetFilePointer(hDrive,
NULL, NULL, FILE_BEGIN);


 


        //
read the first 512 bytes


        //
Becarefull not to ovrewrite this because it will make you system un-bootable.
 You will lose everything.


        ReadFile(hDrive,
data , len , &dwRead, NULL);


        CloseHandle(
hDrive );


 


이렇게 열면 물리적 하드디스크의 첫번째 섹터에 있는 MBR을 얻게된다.


MBR에는 파티션 정보등의 유용한 정보가 들어 있다. MBR 섹터는 아래와 같은 레이아웃을
갖습니다.


 



 


다음은 MBR 512 bytes 1 sector 내용이다.


 


0012F654
 4E 32 E4 8A 56 00 CD 13 EB E4  N2?V...陰


0012F65E
 8A 56 00 60 BB AA 55 B4 41 CD  둞.`빽U퀮.


0012F668
 13 72 36 81 FB 55 AA 75 30 F6  .r6괎U챬0.


0012F672
 C1 01 74 2B 61 60 6A 00 6A 00  ..t+a`j.j.


0012F67C
 FF 76 0A FF 76 08 6A 00 68 00  .v..v.j.h.


0012F686
 7C 6A 01 6A 10 B4 42 8B F4 CD  |j.j.퀯뗵.


0012F690
 13 61 61 73 0E 4F 74 0B 32 E4  .aas.Ot.2.


0012F69A
 8A 56 00 CD 13 EB D6 61 F9 C3  둞...絨a荷


0012F6A4
 49 6E 76 61 6C 69 64 20 70 61  Invalid pa


0012F6AE
 72 74 69 74 69 6F 6E 20 74 61  rtition ta


0012F6B8
 62 6C 65 00 45 72 72 6F 72 20  ble.Error


0012F6C2
 6C 6F 61 64 69 6E 67 20 6F 70  loading op


0012F6CC
 65 72 61 74 69 6E 67 20 73 79  erating sy


0012F6D6
 73 74 65 6D 00 4D 69 73 73 69  stem.Missi


0012F6E0
 6E 67 20 6F 70 65 72 61 74 69  ng operati


0012F6EA
 6E 67 20 73 79 73 74 65 6D 00  ng system.


0012F6F4
 00 00 00 00 00 00 00 00 00 00  ..........


0012F6FE
 00 00 00 00 00 00 00 00 00 00  ..........


0012F708
 00 00 00 00 00 00 00 00 00 00  ..........


0012F712
 00 00 00 00 00 00 00 00 00 00  ..........


0012F71C
 00 00 00 00 00 00 00 00 00 00  ..........


0012F726
 00 00 00 00 00 00 00 2C 44 63  .......,Dc


0012F730
 FC 8F FC 8F 00 00 80 01 01 00  ??......


0012F73A
 07 FE FF FF 3F 00 00 00 37 16  ....?...7.


0012F744
 71 02 00 00 C1 FF 0F FE FF FF  q......... 파티션0부터 3까지


0012F74E
 76 16 71 02 8A 8F DF 06 00 00  v.q.뒒.... 4개의 파티션 정보


0012F758
 00 00 00 00 00 00 00 00 00 00  .......... 16바이트 4개있음


0012F762
 00 00 00 00 00 00 00 00 00 00  ..........


0012F76C
 00 00 00 00 00 00 00 00 00 00  ..........


0012F776
 55 AA 74 FE 12 00 B4 F7 12 00  U챫...덖..


              ~~~~
<- 여기까지가 512


 


그중 첫번째 파티션0의 16바이트는 0x0012F736 으로 (http://www.pjrc.com/tech/8051/ide/fat32.html
참조)


 


 이 곳의 8번째부터 4칸이 첫번째 파티션이 시작되는 LBA값이다. (LBA는
하드디스크에서 특정 섹터를 찾는 방식이며 그냥 섹터값 번지로 생각하면 된다. 기존
CHS 실린더 헤더 섹터 번지값보다 쉬운 표현이다.)


3F 00 00 00 이 첫번째 파티션의 LBA Begin인데 intel은 리틀인디언이므로 00
00 00 3F 로 0x3F*512 바이트 번재가 실제 파티션의 첫 섹터(부트섹터) 가 된다.


 


SetFilePointer(hDrive, 0x3F*512, NULL, FILE_BEGIN); 이렇게 해서 읽어보면
첫번째 파티션의 부트섹터가 나온다. NTFS 로 시작하는게 보일것이다 (vc 디버거의
메모리창임) 륬TFS 로 나왔는데 한글로 변환되어 보여서 그렇다..


 


0012F578
 EB 52 90 4E 54 46 53 20 20 20  ?륬TFS   


0012F582
 20 00 02 08 00 00 00 00 00 00   .........


0012F58C
 00 F8 00 00 3F 00 FF 00 3F 00  ....?...?.


0012F596
 00 00 00 00 00 00 80 00 80 00  ..........


0012F5A0
 36 16 71 02 00 00 00 00 04 00  6.q.......


0012F5AA
 00 00 00 00 00 00 63 11 27 00  ......c.'.


0012F5B4
 00 00 00 00 F6 00 00 00 01 00  ..........


0012F5BE
 00 00 EC 10 21 14 1F 21 14 08  ....!..!..


0012F5C8
 00 00 00 00 FA 33 C0 8E D0 BC  .....3핉劇


0012F5D2
 00 7C FB B8 C0 07 8E D8 E8 16  .|醯..롔..


0012F5DC
 00 B8 00 0D 8E C0 33 DB C6 06  ....렳3培.


0012F5E6
 0E 00 10 E8 53 00 68 00 0D 68  ...?.h..h


0012F5F0
 6A 02 CB 8A 16 24 00 B4 08 CD  j.?.$....


0012F5FA
 13 73 05 B9 FF FF 8A F1 66 0F  .s....딋f.


0012F604
 B6 C6 40 66 0F B6 D1 80 E2 3F  뗬@f.뚜..?


0012F60E
 F7 E2 86 CD C0 ED 06 41 66 0F  透녝잿.Af.


0012F618
 B7 C9 66 F7 E1 66 A3 20 00 C3  령f投f. ..


0012F622
 B4 41 BB AA 55 8A 16 24 00 CD  퀮빽U..$..


0012F62C
 13 72 0F 81 FB 55 AA 75 09 F6  .r.괎U챬        .


0012F636
 C1 01 74 04 FE 06 14 00 C3 66  ..t.....홨


0012F640
 60 1E 06 66 A1 10 00 66 03 06  `..f...f..


0012F64A
 1C 00 66 3B 06 20 00 0F 82 3A  ..f;. ...:


0012F654
 00 1E 66 6A 00 66 50 06 53 66  ..fj.fP.Sf


0012F65E
 68 10 00 01 00 80 3E 14 00 00  h.....>...


0012F668
 0F 85 0C 00 E8 B3 FF 80 3E 14  ....蘊..>.


0012F672
 00 00 0F 84 61 00 B4 42 8A 16  ...꼆.퀯..


0012F67C
 24 00 16 1F 8B F4 CD 13 66 58  $...뗵..fX


0012F686
 5B 07 66 58 66 58 1F EB 2D 66  [.fXfX..-f


0012F690
 33 D2 66 0F B7 0E 18 00 66 F7  3?.....f.


0012F69A
 F1 FE C2 8A CA 66 8B D0 66 C1  只혡?뗊f.


0012F6A4
 EA 10 F7 36 1A 00 86 D6 8A 16  ...6..녧..


0012F6AE
 24 00 8A E8 C0 E4 06 0A CC B8  $.딂잤..見


0012F6B8
 01 02 CD 13 0F 82 19 00 8C C0  ........뙽


0012F6C2
 05 20 00 8E C0 66 FF 06 10 00  . .렳f....


0012F6CC
 FF 0E 0E 00 0F 85 6F FF 07 1F  .....꿵...


0012F6D6
 66 61 C3 A0 F8 01 E8 09 00 A0  fa횪...        ..


0012F6E0
 FB 01 E8 03 00 FB EB FE B4 01  .....魂

'KB > tutorial' 카테고리의 다른 글

WinDbg 사용법  (0) 2006.08.27
DCOM 로컬서버 하기  (0) 2005.08.04
How to i386 32bit OS Kernel Compile in VC6  (0) 2004.11.04
DDK in VC with SoftICE  (1) 2004.11.04
COM 형식 라이브러리 사용하기  (0) 2004.11.04

+ Recent posts