말 그대로 잡설

psycho 2013. 9. 27. 15:38

 소위 "운영체제를 만들어 보자"라는 내용의 글들을 보면 반드시 나오는 것이 부트로더이다. 그럴 만도 하다. 최근에 유행하는 UEFI 인터페이스가 아닌 구식 BIOS를 사용한다면, BIOS에서 자동으로 운영체제 커널을 읽어주질 않기 때문에 부트로더가 없다면 제아무리 잘 만든 운영체제라도 실행시킬 방법이 없다. 보통은 이렇게 바닥부터 만드는, 운영체제라 부르기 좀 뭣한 실습물들이 굉장히 작기 때문에 플로피디스크 정도만 가지고 실습을 하지만, 가끔씩은 하드디스크를 가정하고 부트로더를 만드는 글들도 있다. 여기에서 상당히 자주 발견되는 오류가 섹터를 지정하는 방식을 설명하는 곳에서 나온다. 이 글에서는 이것에 대해 알아본다. 필자가 그림 실력이 전무하여 글자들만 도배되어 있는 점은 양해를 바란다.

 

 1. CHS

  Cylinder, Head, Sector의 첫 글자를 따서 CHS라고 부르는 이 방식은, 원래 원통형의 보조 저장장치에서 데이터를 기록하는 영역을 지정하기 위한 가장 직관적인 방법에서 나온 방식이다. 개략적인 구조는 조금만 검색해보면 얼마든지 잘 그려진 그림으로 설명되어 있는 곳이 나오니 그쪽을 참조하자. 옛날에 나온 하드디스크는 그런 그림들에서 나오는 구조처럼 매우 간단했기 때문에, 물리적인 위치를 3차원적으로 지시하는 CHS를 사용하면 추가 연산을 할 필요 없이 원하는 영역을 사용할 수 있었다. 간단하기 때문인지 이 부분에 대한 설명은 다른 글들도 꽤 정확하게 서술되어 있다.

 

 2. LBA

  Logical Block Address의 약자. CHS처럼 3차원적인 주소가 아니라 기억장치의 모든 섹터에 연속적인 번호를 할당해 사용하는 방식이다. ATA 표준1을 제정할 즈음에는 하드디스크를 제조하는 기술이 발전해서 바깥쪽 실린더에는 안쪽보다 더 많은 섹터가 들어갈 수 있게 되었는데, 이렇게 되고 보니 영역마다 섹터 개수가 달라져버리게 되었다. 거기에 트랙 하나에 들어갈 수 있는 섹터 개수가 CHS Spec에서 지정할 수 있는 수치를 초과해버리는 등 CHS를 사용하는 데 많은 무리가 따르게 되자, 이에 대응해 하드웨어마다 복잡한 계산을 해서 입출력을 하느니 간단하게 섹터 번호만 가지고 접근할 수 있도록 만들어진 방법이다. 이를 위해 대개 IDE 컨트롤러들은 하드디스크와 컴퓨터를 연결하는 인터페이스에 지나지 않고, 실질적인 하드웨어 제어는 하드디스크 자체에 탑재된 다른 컨트롤러가 하게 된다. 보통 LBA는 기존의 CHS 방식이 가지고 있던 용량제한들을 해결하기 위해 나온 방법이라고 잘못 알려져 있는데, LBA 방식 자체는 ATA 표준(여기서는 ATA-1이 아니라 IDE다)이 처음 제정될 때부터 있었다23. 단지 AT BIOS는 ATA 표준 제정 이전에 나온 장치들도 사용할 수 있도록 하기 위해 CHS 방법을 고수하도록 설계된 것뿐이고, 보통 528MB 문제로 알려진 기존 BIOS의 용량 제한이 문제가 되자 BIOS 수준에서 따로 변환 작업을 거쳐 좀 더 큰 용량을 똑같은 방식으로 사용할 수 있게 만든 것뿐이다. 요즘 하드디스크들의 CHS 정보를 보면 Head 개수가 255니 하는 터무니없는 값이 적혀있는 것을 볼 수 있는데, 이는 하드디스크의 물리적인 기록면의 개수가 255개라는 이야기가 절대로 아니다! 단지 BIOS 쪽에서 입력으로 넘겨진 그 값을 실제 하드디스크 컨트롤러가 인식할 수 있는 형식으로 원하는 섹터를 지정하도록 변환하기 위해 가상적으로 만들어진 수치일 뿐이다.

 

 필자가 본 글 중에는 심지어 LBA로 하드디스크 접근을 하더라도 실제로는 CHS로 접근한다고 서술된 글도 있었다. 이는 반은 맞고 반은 틀린 이야기다. 맞는 부분이라는 것은 기계적인 동작에 관한 부분으로, 이는 디스크 상의 물리적인 위치를 찾아가기 위해 하드디스크 컨트롤러상에서 정해진 방법에 따라 LBA를 CHS와 매우 유사한 방식으로 변환하여 기계 장치를 제어하는 데 사용하기 때문이다. 예를 들어 1000만번째 섹터를 찾아간다고 할 때 이를 찾기 위해 0번부터 1000만번째 섹터까지 일일이 읽어볼 수는 없지 않은가? 그렇기 때문에 내부적으로 저장된 값들을 이용하여 빠르게 원하는 위치를 찾아갈 수 있도록 하는 것이다. 틀린 부분이라는 것은 인터페이스에 관한 부분이다. CHS와 LBA는 엄연히 I/O 명령 형식이 따로 할당되어 있으며, LBA I/O 명령을 지원하는 장치들은 CHS 방식의 I/O 명령을 받더라도 외부에 노출시키는 CHS 파라미터를 사용하여 내부적으로 LBA로 변환하여 작동한다.

 

 LBA는 표준이 처음 제정될 때부터 있던 규격이기 때문에, 이를 준수하도록 만들어진 장치라면 용량 제한이 존재하는 구형 BIOS를 사용하는 컴퓨터에 연결했다 하더라도 I/O에는 문제가 없다. 단지 BIOS를 사용하도록 설계된 구형 운영체제들이 인식하지 못할 뿐이다. 필자는 산 지 20년이 넘은 286을 가지고 있는데, 당연히 이 녀석은 구식 BIOS의 528MB 용량제한을 가지고 있다. 그렇지만 BIOS를 거치지 않고 직접 장치 I/O를 수행하면 얼마든지 더 큰 용량의 하드디스크도 사용할 수 있다. BIOS를 사용하지 않는 최근의 운영체제(Windows NT계열, Linux, BSD 등)들이 BIOS의 용량 제한과는 관계없이 대용량의 하드디스크를 사용할 수 있는 이유는 자체적으로 이런 하드웨어 I/O를 수행하는 드라이버를 만들어서 사용하기 때문이다.

 

 그렇지만 이런 운영체제를 사용하더라도 UEFI를 지원하지 않는 IBM AT 호환 컴퓨터는 처음 전원이 들어온 직후 사용할 수 있는 "일반적인" 하드웨어 접근 방법이 BIOS밖에 없고, 부팅에 사용할 코드의 용량 문제도 있기 때문에 부트로더는 BIOS call을 사용하여 만들게 된다. BIOS가 가지고 있는 한계와는 별개로 개별 하드웨어 스펙을 신경쓰지 않아도 되는 범용적인 특성이 있기 때문에 이를 자세히 알아두는 것은 여전히 유용하다.

 

 이쯤해서 잡설이라는 단어가 어울리는 뒤죽박죽 내용의 글을 마치도록 하겠다. 필자는 언제나 정확한 지식을 추구하므로, 어떠한 잘못된 부분에 대한 지적도 환영하는 바이다.

각주 1

보통 IDE로 많이 불렸는데, ATA라는 이름을 처음 사용한 규격은 ATA-1이고 이는 IDE 규격을 확장한 것이다.

각주 2

http://en.wikipedia.org/wiki/Parallel_ATA

각주 3

http://en.wikipedia.org/wiki/Logical_Block_Address

  1. 보통 IDE로 많이 불렸는데, ATA라는 이름을 처음 사용한 규격은 ATA-1이고 이는 IDE 규격을 확장한 것이다. [본문으로]
  2. http://en.wikipedia.org/wiki/Parallel_ATA [본문으로]
  3. http://en.wikipedia.org/wiki/Logical_Block_Address [본문으로]