오후 2:59 2004-05-31
조경민 bro(bro@shinbiro.com)
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 파일 시스템을 접근 하는 방법
---------------------------------
FAT의 종류
FAT12 : 보통 20MB 이하의 디스크 또는 플로피에 적용
FAT16 : 보통 20MB 이상 512MB이하의 디스크에 적용 2GB까지 가능
FAT32 : 보통 512MB 이상이며 테라바이트까지 지원 가능하다.

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

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

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

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

각각에 대해서 모두 알아보자. -_-;
결국 필자는 세번째가 가장 쉬웠다. 환경이 열악해서..;

먼저 자신의 하드 HDD를 읽어보는 방법은 먼저 MBR이라는 것을 이해햐아한다.
이 정보에 대한 문서는 따로 아래와 같이 'MBR/ 파티션 부트섹터 읽기'로
만들었으므로 이 문서를 embedded 시키겠다 -_-; embedded document를 보자..

오전 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 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 > Win32/x86' 카테고리의 다른 글

minios 세미나..  (0) 2004.11.04
파일 모니터링  (0) 2004.07.29
MBR/ 파티션 부트섹터 읽기  (0) 2004.05.29
mini os 세미나 ppt  (0) 2004.05.08
C++가상맴버함수 호출..  (0) 2004.04.20

+ Recent posts