다음 이전 차례

11. 리눅스 IDE 컨트롤러의 8 GiB 제한(The Linux IDE 8 GiB limit)

리눅스의 IDE 드라이버는 디스크의 구조정보와 용량 및 기타 정보를 ATA IDENTIFY 명령(?)을 이용하여 얻는다. 최근까지 드라이버는 C*H*S에 의해 계산된 용량이 반환된 lba_capacity 값보다 10% 이상 큰 경우 이 값을 신뢰하지 않았다.

어쨌거나 업계간의 약정에 의해, 16514064 섹터보다 큰 용량을 갖는 대용량 IDE 디스크는 그들의 실제 크기에 무관하게 7.8 GB 용량을 나타내는 C=16383, H=16, S=63 값을 반환한다. 그러나 그들의 실제 크기는 lba_capacity를 통해 전달한다.

최근의 리눅스 커널(2.0.34, 2.1.90)은 이러한 내용이 반영되어 있어 정상적으로 처리한다. 만약 여러분이 구버전의 커널을 가지고 있으며, 업그레이드를 원하지 않는다면, 그리고 현재의 커널이 전체 대용량 디스크의 크기중 8 GiB 만을 인식할 수 있다면 /usr/src/linux/drivers/block/ide.c 에 있는 lba_capacity_is_ok 의 실행부분을 다음과 같이 변경하도록 하여라.


  static int lba_capacity_is_ok (struct hd_driveid *id) {
          id->cyls = id->lba_capacity / (id->heads * id->sectors);
          return 1;
  }

보다 신중한 패치 작업을 원한다면 2.1.90를 보아라

11.1 BIOS 복잡성(complications)

언급하였듯이, 대용량 디스크는 실제 크기와 무관하게 C=16383, H=16, S=63 값의 구조정보를 반환한다. 반면에 실제 크기는 LBAcapacity을 통해 반환된다.

몇몇 BIOS 들은 이것을 인식하지 못하고 16383/16/63 값에서 실린더수를 줄이고, 헤드의 수를 늘이는 변환을 한다.

그래서 커널은 단일 구조정보 16383/16/63와 부정확한 값을 반환하는 BIOS의 정보도 인식해야 한다.

커널 2.2.2 이후부터 이러한 문제는 정상적으로 작동된다. (BIOS에서 H 와 S값을 구하고 C 값은 전체용량을 (H*S)로 나누어 구함으로서 해결된다.)


다음 이전 차례