1.파티션 소개

 

1) 파티션이란?

파티션은 연속된 저장 공간을 하나 이상의 연속되고 독립된 영역으로 나누어서 사용할  있도록 정의한 규약이다.

 

간단하게 파티션 사용한 예를 보도록 하자.

- 파티션의 경우 OS혹은 OS 제작한 벤더에서 만든 일종의 약속 같은 것이다.

- 컴퓨터 만드는 제조사와 관계도 있고, OS문제도 있기 때문에 어떤 PC 어떤 OS 사용될지에 따라 파티션과 파일시스템을 어떤걸 사용하게     없게 된다.

- 파티션을 나누기 위해서는 저장장치에 연속된 공간에 있어야 한다.  하나의 하드디스크에는 여러 개의 파티션을 나눌  있지만,  개의 하드디스크를 가지고 하나의 파티션을 만들  없는 것이다.

- 그림 B C 가장  차이점은 MBR 유무이다.  부분은 다음 챕터에서 진행  것이다.

 

 

2) 파티션 정보의 관리

 그림의 경우 PC 부트 시퀀스가 BIOS 거쳐 부팅 가능한 파티션으로 가기 위한 표지판 앞을 지나고 있다.

부트 시퀀스는 컴퓨터에 전원이 들어온 이후부터 메모리에 커널이 적재되기까지의 일련의 과정이다.

, 부팅 과정이라고   있다.

 

- 파티션을 나누어 사용하는 경우 MBR(디스크 0 섹터) 영역 내에 '파티션 테이블' 있다.

- 파티션 테이블에 파티션에 대한 여러가지 자세한 정보를   있다.

 

DOS 파티션 테이블 속성

DOS 파티션 테이블을 이용하여 알아낼  있는 정보

참고

파티션의 부팅 가능 여부

 

하드디스크 읽는 모드

CHS/LBA

파티션의 시작   위치

 

파티션 타입

파일시스템 혹은 사용 용도를 나타냄.

파티션에서 사용되는 섹터의 개수

이를 활용하여 파티션의 크기를   있다.

 

- 부트시퀀스가 BIOS 지나 하드디스크 MBR 영역  파티션 테이블의 위의 속성을 알고 있고,   해당 파티션으로 이동해서 안정적으로 부팅을 하거나 다른 파티션(확장 파티션)으로 이동 하게 된다.

 

3) 파티션의 사용 용도

. 하나의 물리적인 디스크를 여러 논리 영역으로 나누어 관리를 용이하게 한다.

. OS 영역과 Data 영역으로 나누어 OS 영역만 따로 포멧  관리를 하기 위해 사용한다.

. 여러 OS 설치 하기 위해 사용한다.

. 하드 디스크의 물리적인 배드 섹터로 특정 영역을 잘라서 사용하기 위해 사용한다.

- ~  경우 OS 문제시 데이터 영역 전체 손실을 막기 위함이고 라의 경우 하드디스크 물리적 배드 섹터가 생긴 경우  부분을 피해 다른 영역에 정상적으로 사용할  쓰는 방법이다. 하나의 팁이  것이다.

- 혹은 하드 디스크가 구형이라 파일시스템 FAT 16 읽을  있는 경우 효율적으로 활용하기 위해 파티션을 나누는 방법도 있다.

 

 

4) 파티션과 볼륨의 차이점

볼륨 : OS Application 등에서 이용할  있는 저장 공간,  섹터(Sector) 집합이다.

- 연속된 공간이 아니여도 볼륨으로   있다.  2개의 하드디스크를 사용하는 경우 하나의 하드디스크처럼 인식하여 사용할  있다.

 

[2개의 하드디스크를 1개의 볼륨으로 인식한 ]

- 파티션 역시 저장 공간이기 때문에 볼륨으로   있다. 하지만 반드시 연속된 섹터의 집합 이여야만 한다.

- 만약 하나의 파티션에 용량이 부족할  볼륨의 개념을 활용하면 2개의 파티션을 1개의 볼륨으로 사용할  있겠지만, 그렇지 않다면 파티션은 반드시 연속된 공간을 활용해야 하기 때문에 기존의 파티션 2개를 삭제한  새로운 파티션을 다시 설치 해야 한다.

 

[하나의 물리적 디스크를 여러 파티션으로 나눈 경우]

 

2.MBR

1)MBR이란?

Master Boot Record Boot Record 메인 격이다.

-   레코드는  파티션의  번째 섹터에 위치하며, 주로 해당 파티션의 설치된 OS 부팅 하는 역할을 하게 된다.  OS 실행을 위한 부트로더(Boot Loader) 호출하는 것이다. 파티션을 나누지 않은 경우라면 부트레코드는 MBR 있을 것이다.

- 단일 파티션을 사용하는 플로피의 경우 부트레코드는 1개만 있을 것이다. 따라서 MBR영역이 필요 없다.

 

[MBR 호출 과정]

- PC 경우 BIOS라는 펌웨어가 시스템 내의 장치들을 검사한  이상 없다면 저장장치의 가장 앞부분으로 점프할 것이다. 이때 단순히  번째 섹터로 이동하는 것이므로 MBR이든 BR이든 부팅 가능한 프로그램만 실행   있으면 될것이다.

- 다른 시스템의 경우 나름대로  번째 섹터를 사용하는 방법이 다르고 부르는 말도 다르다.

 

 

2)MBR 역할

- 디스크 0 섹터에 위치하며 부팅에 필요한 부트 코드와 파티션 테이블을 포함하고 있다.

- MBR 영역 내에 프로그램된 부트 코드의 경우 부팅이 목적이며 커널이 적재되기 전까지 하나하나의 과정들의 목표는 부팅 과정에 있어 다음 단계를 호출 하는 것이 된다.

- MBR 경우 BR 호출하는 과정을 위한 프로그램이  것이다. 따라서 파티션 테이블을 읽고, 각각의 파티션이 부팅 가능한지 확인하며, 파티션이 정상적이지 않거나 부팅 가능한 파티션이 없는 경우 예외 처리도 해야한다.

- 최종적으로 부팅 가능한 파티션의 실제 주소(Address) 계산하여 해당 파티션의 Boot Record 호출하는 것이 주요 목적이 될것이다.

- Microsoft 경우 MBR영역에 파티션 테이블까지 입력하게 되기 때문에 512Byte 작은 공간이 아닐 것이다.

 

 

3)BIOS 부트 시퀀스

- 부트 시퀀스(Boot Sequence) 시스템에 전원이 들어오거나 시스템을 재시작하는 경우 커너을 로드하기까지의 일련의 과정이라고   있다.  과정 중에는 주기억장치에서 커널을 메모리에 적재하는 등의 여러 가지 작업들이 있지만,  중에서도 가장 선행되는 작업은 BIOS(Basic Input/Output System) 의해 행해지는 검증 작업니다.

- BIOS PC에서 전원이 들어오자마자 구동되는 플래시 메모리(Flash Memory) 내의 펌웨어이며, 보통 ROM BIOS라고도 불리낟.

- BIOS CPU 상태를 비록, 메모리와 여러 장치, 포트 등이 사용가능한지 검증  자제 테스트를 진행하고, 커널과 PC 디바이스간의 인터페이스를 제공한다.  우리가 사용하는 OS 내지 응용프로그램에서 하드웨어를 호출할  있는 창구 역할을 하게 되는 것이다.

 

[BIOS 역할]

  1. 시스템에 장착된 모든 하드웨어들이 정상 동작하는지 테스트하는 POST(Power-On-Self-Test) 시행한다.  과정에서 메모리, 하드디스크, CD-ROM, 키보드 등의 문제가 있으면 비프(beep)음이나 화면에 오류를 출력한다.

  2. 동일 시스템에 다른 BIOS 있을 경우 이를 호출하여 활성화 시킨다. 그래픽 카드나 SCSI카드에 동립적인 BIOS 있는 경우 메인보드의 BIOS 이들을 활성화 시켜주어야 한다.

  3. 하드디스크나 보드의 클럭등을 관리 기능을 제공한다. CMOS 셋업을 통해 메인보드를 비롯한 주변장치들의 설정을 변경할  있으며, 여기서 설정한 데이터는 메인보드 내의 EEPROM 저장된다.

  4. POST과정을 정상적으로 마친 경우 시스템에 연결되어 있는 주변장치들을 초기화 하며, 이는 차후 OS  장치들의 인터페이스를 제공할  있게 한다.

  5. 디스크의  번째 섹터를 읽어 들이며, DOS 경우 MBR 부트 코드를 실행시켜 소프트웨어적 부팅을 한다.

 

- 화면  콘솔창으로 출력하도록 별도 작업을 하지 않아도 모니터 화면을 통해 결과가 나오는 이유는 표준 출력(Standard Output) 모니터로 되어 있기 때문이다. 이는 OS BIOS 기본 출력을 모니터로 설정하였기 때문이다.  표준 출력을 다른 곳으로 바꿔준다면 파일이든 기타 출력장치(LED, Printer ) 부가 장치로 손쉽게 출력이 가능하다.

 

[BIOS 일반적인 시퀀스]

  1. PC 전원이 들어온  일련의 과정을 거친  BIOS 루틴이 시작됨

  2. 기존에 저장된 CMOS 설정 값을 읽는다. 여기서 읽는 값들은 하드웨어를 직접 제어할  있는 값으로 CPU 클럭 설정부터 주기억장치의 부트 시퀀스까지 많은 데이터들을 가져 온다.

  3. 인터럽트 핸들러와 장치 드라이버 로드한다. 인터럽트 핸들러는 비교적 초기에 설정되며, 인터럽트 벡터 역시 초기화된다.  인터럽트 벡터를 기반으로 대부분의 커널에서 확장된 입터럽트 벡터를 체적으로 생성하여 가지고 있으며, 이를 이용하여 응용프로그램 내외적 통신을 가능케 한다.

  4. 레지스터 영역과 파워 관리 영역을 초기화한다.

  5. POST 수행한다. 문제가 발견되면 그에 해당하는 비프음을 발생   정지한다. 정상이라면 BIOS  INT 19 발생시켜 다음 과정을 진행한다.

  6. 시스템 내의 비디오 카드를 검색하고, 비디오 카드 내의 BIOS 있는지 확인하여 있으면 이를 호출하여 비디오 카드 자체적 초기화를 진행하는데 대부분의 비디오카드는  시점에 비디오 카드의 간략한 정보를 화면에 출력하기도 한다.

  7. 기타 장치를 검색하고, 해당 장치내에 BIOS 있으면 이를 호출, 실행 시킨다. 이때 하드디스크 등을 검색한다.

  8. BIOS 시작 화면이 출력되며 기타 정보들을 화면에 디스플레이한다. BIOS 제조사  버전 정보, 제조일, Setup(F1, Del ), 시스템 로고, 시리얼 번호 등을 확인할  있다. PC 켜면 본격적인 부팅과정을   있는 화면이 나오는 것이다.

  9. 기타 장치들을 추가 테스트 진행한다.  장치들의 제조사에서 자체적으로 체크하는 루틴으로 에러 메시지가 화면에 출력되어 디버깅하기 용이 하며, 이때 메모리, 디스크 드라이브, DMA, 키보드  다양한 테스트를 진행한다.

  10. BIOS에서 검사한 시스템 정보들을 화면에 출력한다. 부트시퀀스  POST 과정이 완료 되는 것이다.

  11. OS 불러오기 위한 작업으로 부팅 가능한 저장장치를 검사하며, COMS 설정되어 있는 부팅 가능 순서대로 검사를 진행한다. 정상적인 저장장치가 검색되면 해당 장치의 부트 섹터를 호출한다.

 

- BIOS PC 시작부터 끝까지 모든 부분에 관여하며, 메인보드와 주변장치 사이의 인터페이스를 제공하고 초기화 하며 이를 이용하여 OS에서 디바이스들을 제어할  있게 한다.

 

4)MBR 구조

 

[Microsoft MBR 구조]

- MBR 부트코드와 파티션 테이블 영역으로 나눌  있다.

- 다른 OS 경우 대부분 부트 코드 영역이  섹터에 걸쳐 저장되거나 파티션 영역을 저장하는 영역도  섹터 또는  섹터에 걸쳐 저장하기도 하지만 Microsoft MBR에는 부트 코드와 파티션 테이블이   들어가 있는 것이 특징이다.

 

 

 그림처럼 0 섹터에서 512byte 부트 코드 영역을 상위 446Byte(블록지정한 부분) 사용 하고 있으며  뒤의 64Byte 파티션 테이블, 마지막의 2byte MBR 시그니처(Signature) 0xAA55 들어간다. IBM 호환 CPU특성상 리틀 엔디언(Little Endial) 의해 덤프를 하면 55 AA 나오는 것을   있다.

 

3.파티션 종류

1) DOS 파티션 테이블

- 가장 많이 알려진 파티션으로 Microsoft에서 출시된 MS-DOS 비롯한 Windows 제품군이 Dos 파티션을 사용하고 있으며 Linux 사용하고 있다.

- DOS 파티션 테이블이 물리적으로 위치하는 곳은 디스크 0 섹터  MBR 영역의 부트코드 바로 다음에 해당된다.

- 446번지로부터 64 Byte 경간을 파티션 테이블이 사용한다.

- 파티션 테이블은  4개의 파티션을 기록할  있으며 파티션 1개의 정보는 16Byte 표현한다.

- 파티션 테이블에 기록할  있는 파티션의 개수 제한극복을 위해 확장파티션을 지원하며 이를 이용하면 논리적으로 생성할  있는 파티션 개수의 제한이 없어지지만 결과적으로 DOS 파티션을 복잡하게 만드는 원인이기도 하다.

 

[DOS 파티션

 

 

 그림처럼 16Byte 마다 1나의 파티션에 대한 정보가 들어가게 된다  4개의 파티션까지 기록 가능 하다.

 

 

2) Apple Partition Map

- Apple 파티션 정보는 다른 벤더의 기록 방법과 약간 차이가 있다. Apple에서 사용하는 OS 기원인 Unix 점을 생각 해보면 Apple 파티션은 BSD 계열의 파티션 기록 방법을 보안한 느낌으로 애플에는 Apple Partition Map 라는 파티션이 존재하며  디스크에서 사용하는 파티션 정보를 기록 하고 있다.

- 파티션을 위한 파티션을 고려하여 제작 하였기 때문에 파티션 최대 개수는 Apple Partition Map 파티션의 크기와 관계가 있다.

- Apple Partition Map 파티션은 1 섹터에 있으며 0 섹터는 사용하지 않는다.

- 부트코드의 경우 Apple 컴퓨터의 경우 디스크에 기록하지 않고 PC 치면 BIOS레벨의 펌웨어에 기록하고 있으며  섹터의 512Byte 걸쳐 하나의 Partition Map Entry 기록 되며,  영역에 파티션의 위치  크기 정보 등이 함께 기록 된다.

- 파티션 영역의 크기는 '파티션 개수 X 512Byte' 된다.

- 그러나 하나의 Partition Map Entry 경우 136Byte 지나지 않아 낭비되는 것처럼 느껴질 수도 있으나, 여러 파티션들의 단점을 보안한 부분이기도 하다.

[Apple Partition Map]

 

 

3) BSD 디스크 레이블(BSD Disk Label)

- Unix 계열의 대표적인 BSD 시스템의 파티션으로 BSD 파티션은 하나의 섹터 안에 파티션 정보를 포함한 디스크 정보를 모두 담아 놓는다.

- DOS 파티션에 비해 매우 간단한 구조를 가지며, Apple Partition Map 보다 생성할  있는 파티션 개수에 제한이 있으나,  16개의 파티션을 가질  있다.

- 실제 저장되는 위치는 1 섹터이며, 148~403번지까지 256Byte 사용하며 하나의 파티션은 16Byte 표현 가능하다.

- 섹터 0번에는 부트 코드가 저장되어 있으며, 부트 코드 영역이 512Byte보다 크면 0 섹터에 이어서 2 섹터부터 16 섹터까지 추가로 기록할  있다.  이후부터는 파일시스템이 기록되므로 16 섹터를 벗어나선 않된다.

- FreeBSD, OpenBSD, NetBSD등이 있으며, 같은 뿌리를 가지고 있으나 사용방법부터 다른점이 많이 있다.

 

[BSD Disk Label]

 

 

 

4) 솔라리스 디스크 레이블(Solaris Disk Label)

- Sun사의 Solaris Disk Label BSD Disk Label 크게 다르지 않은 구조이다.

- BSD 마찬가지로 파티션 정보를 포함한 디스크 정보를 Disk Label 기록하며 512Byte 걸쳐 데이터를 저장한다.

- 선스팍과 PC   설치 가능 하며, 플랫폼에 따라 Disk Label 위치  데이터 구조가 달라진다.

 

 

Sun Sparc

- 0 섹터에 Disk Label 위치, 부트 코드는 1 섹터부터 15 섹터까지 위치

- 파티션의 위치  크기 정보를 나타내는 부분과 기타 추가적인 정보들을 저장하고 있는 영역으로 나뉘는데, 위치와 크기 정보는 Disk Label 444번지부터 64Byte 걸쳐 8개의 파티션을 기록할  있다.

- 파티션의 타입, 상태정보, Time stamp 등의 추가정보는 VTOC(Volume Table of Contents)라는 데이터 영역에 기록된다.

- VTOC Disk Label 128번지부터 134Byte 사용하며,  영역에는 파티션 정보뿐만 아니라 Disk 볼륨명, 사용하는 파티션 개수, 부팅 정보등이 추가로 기록 된다.

 

[ Sun Sparc Disk Label ]

 

i386 Solaris

- 반드시 DOS 파티션이 설치 되어야 한다.

- Solaris 부팅 파티션에는 파일시스템은 없어도 상관없지만, 부트코드를 가지고 있어서 Solaris 파일시스템에 있는 Disk Label 읽어 들여야 하며, 이렇게 읽은 Disk Label 위에 Sparc 차이를 보인다.

- 파티션 저보를 한곳에 모두 저장한 구조가 i386 Disk Label이라고   있다.

- 파티션 데이터는 72번지부터 192Byte 걸쳐 저장되며  16개의 파티션을 저장할  있다.

 

[ i386 Solaris Disk Label ]

 

[파티션들의 특징 비교]

구분

위치

크기(Byte)

OS

부트코드 위치

Dos Partition Table

0 섹터 446번지

64

MS-DOS

Windows 

0 섹터의

0~445번지

Apple Partition Map

1 섹터

512X파티션  섹터 

Mac OS X

보드의 펌웨어 

BSD Disk Label

1 섹터

512

Open BSD,

Free BSD,

Net BSD 

0, 2~16 섹터

Solaris Disk Label

Sparc : 0 섹터

i386 : Solaris 파일시스템 기준 0 섹터

512

Solaris

Sparc : 1~15 섹터

i386 : Solaris Boot Partition

 

- BSD Solaris OS 경우 서버시스템을 겨냥해서 만들어진 OS이다. 따라서 연속적인 클러스터 공간을 확보할  있는 가장 간단한 방법인 파티션을 나누는 방법을 사용하므로써 DISK I/O 관련한 성능 향상을 꾀할  있다. 따라서 파티션의 개수가 월등히 많다.

- 이에 반해 DOS 파티션의 경우 생성할  있는 Primary 파티션 개수가 적지만 매우 간단하다.

- Apple 경우 BSD Disk Label DOS 파티션이 가진 복잡성과 개수 제한 등의 단점을 유연하게 개선하였다고   있다.

 

4.DOS 파티션의 구조

 

1) MS-DOS 파티션 테이블의 구성

[MBR영역 내의 파티션 테이블 구조도]

위치(Byte)

크기(Byte)

설명

0

446

부트코드

446

16

파티션 #1

462

16

파티션 #2

478

16

파티션 #3

494

16

파티션 #4

510

2

MBR Signature(0xAA55)

 

[파티션 테이블 항목]

 

 

2) DOS 파티션 영역의 분석

- 파티션의 실질적인 위치 정보를 읽고 기록할  필요한 부분이 CHS 모드와 LBA 모드이다.

 

이름

Bootable Flag

위치

(Offset)

0

크기

(Size)

1 Byte

일반적인 

(Value)

0x80(부팅가능),

0 

설명

부팅 가능한 하드디스크를 나타내는 플래그. 모든 파티션에서 필수적으로 필요하지 않으며 부팅 가능한 파티션에만 0x80 코드(8bit  MSB ON) 설정 되면 된다.

 

이름

Starting CHS Address

위치

(Offset)

1~3

위치

(Offset)

3Byte

일반적인 

(Value)

가변적

설명

CHS 모드로 표현하는 파티션의 시작 번지 .

24bit  Cylinder 10Bit, Header 8bit, Sector 6bit 표현.

Starting CHS Address Starting LBS Address   입력하지 않아도 되며   하나만 입력하여 사용한다. OS또는 그에 해당하는 어플리케이션에 따라 다르다.

 

이름

Partition Type

위치

(Offset)

4 

크기

(Size)

1 Byte

일반적인 

(Value)

아래 파티션 타입 참고

설명

파티션의 타입을 나타내는 고유 값으로 현재까지 나온 모든 파티션들은 각각 고유 값이 있다. 파티션 타입의 경우 파일 시스템의 종류에 따라 다르기 때문에 만약 파티션을 사용하나 파일시스템을 사용하지 않는 경우 0으로 채워진다.

 

 

이름

Ending CHS Address

위치

(Offset)

5~7 

크기

(Size)

3 Byte

일반적인 

(Value)

가변적

설명

CHS 모드로 표현하는 파티션의  지점. 앞서 나온 Starting CHS Address 매치되어 같이 기록되어야 한다.

 

 

이름

Starting LBA Address

위치

(Offset)

8~11 

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

LBA 모드로 표현하는 파티션의 시작 번지. 0부터 시작하며 LBA 모드를 사용할지 CHS 모드를 사용할 지는 전적으로 어플리케이션에 의존한다.

 

 

이름

Size in Sector

위치

(Offset)

12~15 

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

파티션에서 사용하는 LBA  개수를 의미하며, 하나의 LBA 블록은 512Byte이므로 해당 파티션의  용량은 Size In Sector X 512byte 이다.

 

- CHS모드나 LBA 모드는 어플리케이션에 의존적이라는 것을 기억하자. 또한 Partition Type 정의되어 있는 값들은 파티션 종류뿐 아니라 사용하는 모드가 어떤 모드인지 정의 하고 있으니 어플리케이션 개발  다른 OS 또는 제품과 호환성을 갖고 싶다면 해당 OS에서 읽어 들일  있는 Partition Type 맞게 선택하여야 한다.

 

Partition Type 

설명

0x00

Empty 

0x01

FAT12 primary partition or logical drive, CHS 

0x04

FAT16 partition or logical drive, CHS 

0x05

Microsoft Extended partition, CHS 

0x06

BIGDOS FAT16 pa띠ion or 1얘ical drive(33MB - 4GB), CHS

0x07

Instaliable FileSystem(NTFS partition or logical drive) 

0x0B

FAT32 partition or logical drive, CHS 

0x0C

FAT32 partition or logical drive using BIOS INT 13h extensions, LBA

0x0E

BIGDOS FAT16 partition or logical drive using BIOS INT 13h extensions, LBA 

0x0F

Extended partition using BIOS INT 13h extensions, LBA 

0x11

Hidden FAT12. CHS 

0x14

Hidden FAT16. 16MB - 32MB. CHS 

0x16

Hidden FAT16. 32MB - 2GB. CHS

0x1B

Hidden FAT32, CHS 

0x1C

Hidden FAT32. LBA 

0x1E

Hidden FAT16, 32MB - 2GB, LBA 

0x42

Microsoft MBR, Dynamic Disk 

0x82

Solaris x86 

0x82

Linux Swap 

0x83

Linux 

0x84

Hibernation 

0x85

Linux Extended 

0x86

NTFS Volume Set 

0x87

NTFS Volume Set 

0xA0

Hibernation 

0xA1

Hibernation 

0xA5

FreeBSD 

0xA6

OpenBSD 

0xA8

MacOS X 

0xA9

NetBSD 

0xAB 

MacOS X Boot 

0xB7 

BSDI 

0XB8 

BSDI swap 

0xEE 

EFI GPT Disk 

0xEF 

EFI System Partition 

0xFB 

Vmware FileSystem 

0xFC 

Vmware swap 

 

-  표의 경우 Partition Type 해당하는 미리 정의된 타입니다. 종류가 정말 많은걸   있다.

 

 

(개인 노트북 파티션 테이블 항목)

 

위의 파티션 테이블 분석

분석내용

2진값

Boot Flag : 80

부팅 가능 파티션

1000 0000

Starting CHS Addr : 20 21 00

[Little Endian]

00 21 20

0000 0000 0010 0001 0010 0000

Cylinder(10bit)

Header(8bit)

Sector(6bit)

Part Type : 07

0000 0111

0x07 : NTFS Partition or Logical Dirve) 

Ending Chs Addr : DF 13 0C

[Little Endian]

0C 13 DF

0000 1100 0001 0011 0000 1100

Cylinder(10bit)

Header(8bit)

Sector(6bit)

String LBA Addr : 00 08 00 00

[Little Endian]

00 00 08 00 (2048)

0000 0000 0000 0000 0000 1000 0000 0000

Size in Sector : 00 20 03 00

[Little Endian]

00 03 20 00

=> 204800(Sector) X 512(byte)

= 104857600 byte

104857600/1024 = 102400 Kbyte

102400/1024 = 100 Mbyte

0000 0000 0010 0000 0000 0011 0000 0000

 

 

3) MS-DOS 확장 파티션

- MBR 영역 내의 파티션 테이블에 4 까지 파티션을 가질  있으나 추가로 확장을 해야  경우 확장 파티션(Extended Partition) 사용한다.

-  파티션(Primary Partition)  마지막으로 만들어진 파티션이 확장파티션에 해당하며 확장 파티션 영역 안에서 추가로 영역을 나눠야 하기 때문에 MBR 영역 내의 파티션 테이블만 가지고서는 확장 파티션의 레이아웃을 한눈에 알아보기 힘들다.

-  확장 파티션의 계층구조로 인해 다른 파티션에 비해 구현의 번거로움이 있다.

 

[확장 파티션]

 

-  파티션 내에 존재하는 확장 파티션을  확장 파티션(Primary Extended Partition)이라고 한다.

-  확장 파티션을 포함한 모든 확장 파티션은 추가 확장 파티션을 가질  있으며 파티션 개수는 제한이 없어진다.

- 확장파티션에서 파티션을 검색하는 경우 MBR 같은 역할을 하는 것이  파티션 내의 BR(Boot Record)이다.

- 파티션 테이블 역시 MBR 같이 BR 446번지부터 기록되어 찾아가게 된다.

- 이때 확장 파티션의 시작위치(String LBA Address) 주의 해야 한다.  파티션 영역의 시작 위치들은 디스크의 시작 위치인 0 섹터를 기준으로 기록 되지만, 확장 파티션의 내의 파일시스템의 시작 위치는 각각 확장 파티션 별로 시작 위치가 정해지게 된다.

 

[DOS 확장 파티션  파일 시스템 기준]

 

- LBA 모드를 기준으로  확장 파티션이 1000번째 섹터 위치라고   확장 파티션에 존재하는 1번째 파일 시스템은 해당 확장 파티션의 시작 주소를 기준으로 위치와 크기를 지정하게 된다.  1000 섹터 기준으로 64번째 섹터부터 파일시스템이 위치하며, 크기가 3000개의 섹터의 걸쳐 기록 하고 있다.

- 2번째, 3번째 역시 각각의 확장 파티션을 기준으로 시작 위치가 정해지는 것을 확인   있다.

- 그러나 파일 시스템이 64번째부터 시작 되는지 의문이  것인데 0~63번째 까지는 예약된 영역으로 현재 사용되지 않다. 파일 시스템에 따라서 unallocated 영역의 크기가 달라지기도 하기  문에 BR 파티션 테이블을 참조하여 파일시스템 영역으로 이동해야 한다.

- unallocated 영역은 0으로 채워져 있기도 하지만 쓰레기 값이 있을 수도 있으니 데이터로 오해 하지 말도록 하자.

-  파티션에서 사용되는 시작 섹터의 기준과  확장 파티션의 경우와  확장 파티션의 경우가 다른 부분을  이해 해야  것입니다.

-  확장 파티션의 시작 섹터 기준은 저장장치의 0 섹터(절대 위치)

-  파일 시스템이 시작되는 섹터 위치의 기준은  파일 시스템을 포함하고 있는  파티션의 시작 섹터

 

5. 파티션 분석 실습

 

관리자 권한으로 실행을   아래 소스를 입력하면 하드디스크의 파티션 정보를   있게 됩니다.

#include <Windows.h>

#include <stdio.h>

 

typedef unsigned char U8;

typedef unsigned short U16;

typedef unsigned int U32;

 

//섹터 내 파티션 테이블 번지

#define PARTITION_TBL_POS 0x1BE

//확장 파티션 타입

#define PARTITION_TYPE_EXT 0x0F

 

typedef struct _PARTITION  //확장 파티션 타입

{

    U8 active;

    U8 begin[3];

    U8 type;

    U8 end[3];

    U32 start;

    U32 length;

}PARTITION, *PPARTITION;

 

U32 HDD_read (U8 drv, U32 SecAddr, U32 blocks, U8* buf);

 

//디스크 내의 모든 파티션 검색

U32 GetLocalPartition(U8 Drv, PPARTITION pPartition);

//확장 파티션 검색(재귀 호출)

void SearchExtPartition(U8 Drv, PPARTITION pPartition, U32 *pnPartitionCnt);

//디스크 내의 부트 레코드에서 파티션 테이블 저장

void GetPartitionTbl(U8 Drv, U32 nSecPos, PPARTITION pPartition, int nReadCnt);

//파티션 테이블의 속성 출력

void PrintPartitionInfo(PPARTITION pPartition, U32 nIdx);

 

U32 main(void)

{

    PARTITION PartitionArr[50]; //디스크 내에 파티션 정보를 담는 배열

    U32 nPartitionCnt=0;

    U32 i;

 

    memset(&PartitionArr, 0, sizeof(PARTITION) * 50);

    nPartitionCnt = GetLocalPartition(0,PartitionArr); //0번 물리디스크 내에 존재하는 DOS파티션 읽기

 

    for(i=0; i<nPartitionCnt ; i++) //파티션 정보 출력

        PrintPartitionInfo(&PartitionArr[i], i);

 

    return 0;

}

 

U32 GetLocalPartition(U8 Drv, PPARTITION pPartition)

{

    U32 i;

    U32 pPartitionCnt=0;

    PPARTITION pPriExtPartition = NULL;

 

    //주 파티션이므로 4개의 파티션 읽어옴

    GetPartitionTbl(Drv, 0, pPartition, 4);

    for(i=0;i<4 && pPartition->length !=0; i++){

        if(pPartition->type ==PARTITION_TYPE_EXT) {

            pPriExtPartition = pPartition;

        }

        pPartition++;        //다음 파티션으로 이동

        pPartitionCnt++;    //파티션 카운트 UP

    }

 

    if(!pPriExtPartition)

        return pPartitionCnt;

 

    SearchExtPartition(Drv, pPriExtPartition, &pPartitionCnt);

    return pPartitionCnt;

}

 

void GetPartitionTbl(U8 Drv,U32 nSecPos, PPARTITION pPartition, int nReadCnt)

{ //MBR 및 BR을 읽어 들여 파티션 테이블을 버퍼에 저장하는 함수

    U8 pSecBuf[512];

 

    //물리적 디스크 Drv의 nSecPos번 센터에서 1개의 블록을 읽어온다.

    if(HDD_read(Drv, nSecPos, 1, pSecBuf) ==0) {

        printf("boot sector read failed \n");

        return ;

    }

    //파티션 테이블은 446번지에 있으므로 PARTITION_TBL_POS만큼 포인터 이동

    memcpy(pPartition, (pSecBuf + PARTITION_TBL_POS), sizeof(PARTITION) * nReadCnt);

}

 

void SearchExtPartition(U8 Drv, PPARTITION pPartition, U32 *pnPartitionCnt)

{

    int nExtStart = pPartition->start;

    //데이터를 읽어오기 위해 포인터를 다음 파티션 번지로 이동

    pPartition++;

    //부 파티션과 확장 파티션이 있을 수 있으므로 2개의 파티션을 읽어옴

    GetPartitionTbl(Drv, nExtStart, pPartition, 2);

    while(pPartition->length !=0) {

        (*pnPartitionCnt)++;

        if(pPartition->type == PARTITION_TYPE_EXT) {

            SearchExtPartition(Drv, pPartition, pnPartitionCnt);

        }

        else

            pPartition++;

    }

}

 

void PrintPartitionInfo(PPARTITION pPartition, U32 nIdx) //파티션 정보 출력

{

    fprintf(stdout, "[PARTITION #%d]\n", nIdx);

    fprintf(stdout, " Bootable : 0x%X\n", pPartition->active);

    fprintf(stdout, " Type : 0x%X\n", pPartition->type);

    fprintf(stdout, " start : %d\n", pPartition->start);

    fprintf(stdout, " Length : %d\n", pPartition->length);

    fprintf(stdout, " Partition Size : %d MB\n", pPartition->length/1024*512/1024);

    fprintf(stdout, "=========================\n\n");

}

 

U32 HDD_read (U8 drv, U32 SecAddr, U32 blocks, U8* buf){

    U32 ret;

    U32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;

 

    char cur_drv[100];

    HANDLE g_hDevice;

 

    sprintf_s(cur_drv,sizeof(cur_drv),"\\\\.\\PhysicalDrive%d",(U32)drv);

    g_hDevice=CreateFile(cur_drv, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    

    if(g_hDevice==INVALID_HANDLE_VALUE)    return 0;

 

    ldistanceLow = SecAddr << 9;

    ldistanceHigh = SecAddr >> (32 - 9);

    dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);

    

    if(dwpointer != 0xFFFFFFFF)    {

        bytestoread = blocks * 512;

        ret = ReadFile(g_hDevice, buf, bytestoread, (unsigned long*)&numread, NULL);

        if(ret)    ret = 1;        

        else        ret = 0;        

    }

    

    CloseHandle(g_hDevice);

    return ret;

}

+ Recent posts