다음 이전 차례

4. 디스크 접근

디스크상의 데이터를 읽거나 쓰기 위해서는 섹터번호나 블럭번호를 이용하여 디스크상의 위치를 명시해야 한다. 만약 SCSI 디스크의 경우라면, 섹터 번호는 직접 SCSI 명령으로 전달된다. 그리고 디스크에 의해 인식된다. 또한 LBA(Large Block Addressing)를 이용하는 IDE 디스크라면 동일한 방법이 이용된다. 그러나 구형의 RLL 이나 MFM 또는 LBA 이전의 단계의 IDE의 경우, 디스크 하드웨어는 디스크상의 특정 위치를 나타내기 위해 세가지의 정보 (cylinder, head, sector)를 요구한다.

� 일차적인(linear) 번호 매김 방법과 3차원 표기법(CHS) 사이에는 다음과 같이 변환될 수 있다. C 개의 실린더, H 개의 헤드, 트랙당 S 개의 섹터를 갖는 CHS(3D) 표현 방법은 일차적인(linear) 번호 매김 방법이나 LBA 방법으로 표현시 c*H*S + h*S + (s-1) 이 가리키는 위치와 동일하게 된다. (수식 마지막에서 1을 뺀것은 오래전 부터 sector 번호의 경우 0이 아닌 1을 시작값으로 사용했기 때문이다)

결과적으로 매우 오래된 non-SCSI 디스크에 접근하기 위해 C, H, S 와 같은 디스크의 물리적 구조정보(geometry)를 알아야 한다.

4.1 BIOS를 이용한 디스크 접근과 1024 실린더 크기 제한

리눅스는 BIOS를 이용하지 않는다. 그러나 다른 몇몇 시스템은 이와 같은 방법을 사용하고 있다. LBA 방법 이전에 나온 BIOS 들은 C/H/S 를 파라메터로 하는 INT13 디스크 입출력 루틴을 제공한다. (보다 정확하게 얘기하면, AH 레지스터는 실행할 함수를 지정하고, CH는 실린더 번호의 하위 8비트를, CL은 7-6 비트에 실린더의 상위 2비트를 포함하며, 0-5 번 비트는 섹터 번호로 DH 레지스터는 헤드 번호, DL 레지스터는 드라이브 번호를 지정한다. 이후 함수를 실행시키면, C/H/S 정보를 얻을 수 있다)

� 이러한 방법으로 3 바이트에 CHS 정보를 저장할 수 있다. 10 비트 공간에 실린더 번호를 그리고 8 비트 공간에 헤드 번호, 6비트 공간에 섹터번호를 저장할 수 있다. 이와 같은 방법으로는 실린더 번호의 경우 0-1023 까지만 지정이 가능하다. 1024 번 이상의 실린더는 BIOS에서 접근이 불가능 하다는 결론이다.

도스와 윈도우즈 프로그램은 LBA를 지원하는 IDE 디스크가 나왔을 때, 이전의 방식을 고수하고 있었다. 그러므로 도스와 윈도우즈는 실제적인 디스크 입출력을 위해 더이상 필요하지 않는 상태에서도, BIOS를 이용하기 위해 디스크의 물리적 구조정보(Geometry)를 필요로 하는 상황이 계속되었다. 이것은 다시 말해 최근의 디스크일지라도 BIOS나 다른 운영체제와의 통신시이 요구되는 경우 리눅스는 디스크의 물리적 구조정보(Geometry)를 필요로 한다는 것이다.

이와 같은 문제는 4년정도 지속되었고, 이후 생산되는 디스크는 INT13 시스템 함수에 의한 주소 지정을 할 수 없게 되었다. ( (C,H,S)를 위한 10+8+6=24 bits는 8.5 GB 이상의 주소를 지정할 수 없기 때문이다 ) 이후 새로운 BIOS 인터페이스는 설계되었다: 확장 INT13 시스템 함수라고 불려진 이 방법은 DS:SI 레지스터로 8 바이트의 시작 절대 블럭번호를 포함하는 16 바이트의 디스크 주소단위를 가리킨다.

매우 느린속도로 마이크로 소프트 세계도 이러한 확장 INT13 시스템 함수를 이용하는 방향으로 이동하고 있다. 아마도 지금 부터 몇년안에 디스크의 물리적 구조정보(Geometry)를 필요로 하는 최신의 하드웨어는 더 이상 존재하지 않을 것이다.

4.2 BIOS와 IDE 의 제한에 관한 이야기

ATA 사양 (for IDE disks) - 137 GB 제한

최대 65536 개의 실린더(0-65535), 16 헤드 (0-15), 255 개의 트랙당 섹터 (1-255)로서 최대 267386880 섹터(섹터당 512 byte)를 갖으며, 이것은 136902082560 바이트 크기(137 GB)를 의미한다. 이 사양은 1999년 현 시점에선 문제되지 않는다. 그러나 몇년후면 이 사양도 같은 문제점을 겪게 될 것이다.

BIOS Int 13 - 8.5 GB 제한

최대 1024개의 실린더 (0-1023)와 256개의 헤드 (0-255), 63 개의 트랙당 섹터수(1-63)로서 최대 8455716864 바이트의 크기가 가능하다. 이 사양은 현재 심각한 문제다. 이 방법은 DOS에서 최근의 대용량 디스크를 사용할 수 없다는 것을 의미한다.

528 MB 제한

동일한 C,H,S값이 BIOS INT 13 시스템 호출과 IDE 디스크 입출력에 사용되는 경우, 두가지 제한이 모두 적용된다. 그러므로 1024 개의 실린더와 16개의 헤드, 63 개의 트랙당 섹터로 인해 전체 용량이 528482304 바이트 (528 MB)로 제한되는 문제가 있고, 구형 BIOS를 사용하는 DOS에서는 504 MiB 크기 제한이라는 유명한 문제가 있다. 이러한 문제점은 1993년쯤 부터 시작되었고, 사람들은 모두 LBA와 같은 하드웨어나 BIOS 수준의 변환과 같이 firmware 수준의 편법이나 disk 관리자와 같은 소프트웨어 수준의 편법에 의존하였다. `변환`이라는 개념은 1994년에 나타났다: BIOS 는 드라이브와 통신하는 동안 디스크의 물리적 구조정보(Geometry)를 사용할 수 있고, 다른 방법으로 BIOS가 DOS와 통신하는 경우 구조정보를 속이는 방법으로, 이 둘 사이에 변환을 한다.

2.1 GB 제한 (1996. 4월)

몇몇의 구형 BIOS 들은 CMOS RAM에서 12 비트만을 실린더 수를 위해 할당하였다. 결과적으로 이 수치는 최대 4095 크기를 지정할수 있고, 이것은 다시 4095*16*63*512=2113413120 바이트만을 접근할 수 있다. 대용량의 디스크를 사용하는 경우 부팅시 동작이 멈추게 될 것이다. 이것은 4092/16/63의 구조정보를 갖는 디스크를 기억속에 남게 하였다. 여전히 대용량 디스크 드라이브들은 4092/16/63개의 디스크의 물리적 구조정보(Geometry)를 설정할 수 있도록 하는 점퍼를 가지고 출시된다. over2gb.html 을 참고하기 바란다.

3.2 GB 제한

Phoenix 4.03 과 4.04 BIOS firmware에는 3277 MB 이상의 드라이브를 갖는 시스템에서 CMOS 설정시 멈춰버리는 문제의 버그가 있었다. See over3gb.htm 을 참고하기 바란다.

4.2 GB 제한 (1997. 2월)

간단한 BIOS 변환 작업은 실린더의 수가 1024를 넘지 않는 범위에서 반복적으로 헤드의 수를 배수로 하고, DOS에서 인식되는 실린더의 수를 반으로 감소시키므로 이루어진다. (ECHS=Extended CHS, 때로는 `대용량 디스크 지원' 또는 그냥 `대형'이라고 불려진다.) DOS와 윈도우 95는 256 개의 헤드를 처리할 수 없고, 일반적인 경우 디스크는 16개의 헤드를 갖는 것처럼 할 것이다. 그러므로 이러한 단순한 방법은 단지 8192*16*63*512=4227858432 바이트 까지만 처리가 가능하다. (1024개의 실린더, 128개의 헤드, 트랙당 63개의 섹터를 갖는 것처럼 변환시키는 방법으로) 확장(Extended) CHS 방법은 트랙당 섹터의 수를 변경하지 않는다. 그러므로, 섹터의 수가 63이 아니라면, 그 제한값은 더 낮을 것이다. over4gb.htm 을 참고하기 바란다.

7.9 GB 제한

좀더 잘 설계된 BIOS들은 먼저 헤드의 수를 15로 조정하므로서 240 개의 헤드를 갖는 위조된 구조정보를 얻음으로서 앞에서의 문제점을 피해 나간다. 1024*240*63*512=7927234560 bytes의 결과를 얻을 수 있다.

8.4 GB 제한

마지막으로 BIOS가 이러한 변환작업을 성공적으로 만들기 위해 할수 있는 모든 방법을 행하고 255개의 헤드와 63개의 트랙당 섹터수를 사용하면 이것은 1024*255*63*512=8422686720 바이트 까지 접근 가능하다. 이 수치는 256개의 헤드를 갖는 디스크의 물리적 구조정보를 사용할 수 없는 제한으로 인해 이전의 8.5 GB 제한보다 근소하게 작은 수치가 된다. (이 변환은 전체 디스크의 용량을 1024*H*63*512에 맞추기 위해 H의 수치를 16, 32, 64,128, 255중 하나를 선택하여 사용한다. 그런 다음 전체용량을 H*63*512으로 나눠 실린더의 수를 계산한다.)

이 같은 주제에 대한 다른 토론자료를 원하면 Breaking the Barriers라는 것을 참고하라. 그리고 보다 자세한 것을 원한다면 IDE Hard Disk Capacity Barriers를 참고하기 바란다.

8.4 GB이상의 하드 디스크는 이러한 디스크의 구조정보를 16383/16/63 으로 알려준다. 이것은 결과적으로 디스크의 물리적 구조정보(Geometry)를 진부하게 만들었음을 의미한다. 그리고 전체 디스크 크기는 더이상 디스크의 물리적 구조정보(Geometry)로 부터 계산할 수 없음을 의미한다.


다음 이전 차례