무플 무서워요
유익하셨나요? 아래의 RSS로 구독 하세요! 가젯으로 구독하시려면 클릭!
올블로그추천버튼 블로그코리아 구독버튼 블로그뉴스 구독버튼 믹시 구독버튼 한RSS 구독버튼 구글리더기 구독버튼 올포스트 구독버튼

안녕하세요, 구름팡팡입니다.
오늘은 드디어 미루고 미뤄왔던 주제에 대한 포스팅을 하겠습니다.

지난 번에 하드디스크의 날아간 파티션을 말끔히 복구해 주는 프로그램인 TestDisk를 소개해 드린 적이 있습니다.
그 TestDisk를 통해 파티션을 복구하다가 느낀 의문이 있었는데요, 이 프로그램이 실린더를 분석한다고 하면서 표시하는 숫자는 19,457이었습니다.
이 프로그램이 어떤 식으로 파티션을 복구하는지도 몰랐거니와 사실상 파티션이 정확히 무슨 역할을 하는 지도 몰랐기 때문에 생긴 궁금증일 수도 있었겠습니다만,
이 녀석이 실험대상이었던 160GB 하드디스크의 19,457개의 실린더를 검색하는 데 이것이 160GB 하드 디스크 전체를 대상으로 분석하는 것인지,
아니면 파티션을 복구하는 데에만 필요한 일부만을 분석하는 것인지가 묘했던 것입니다.


그래서 하드디스크 표면에 실린더 갯수가 표시 되어 있는지를 확인해 봤지만, 하드디스크 표면에는 CHS가 아닌 LBA가 표기되어 있더라구요.
분석을 기다리면서 궁금하여 CHS와 LBA간에 어떤 관계가 있는지를 찾아보았습니다.



"하드디스크 드라이브의 용량은 꾸준히 증가한다." -  2002.06.21 테크노아 기사 중 일부 인용(http://www.technoa.co.kr)

하드디스크의 용량을 계산하는 3요소는 CHS라고 불리는데, CHS는 각각 실린더(Cylinder), 헤드(Head), 섹터(Sector)를 의미합니다.
그리고 하드디스크 내부에는 데이터를 기록하는 금속재질(혹은 유리로 만들어진 것도 있으며, 최근 프라스틱 플래터도 개발되긴 했다.)의 원판이 존재하며 이를 플래터(platter)라고 부릅니다.


이러한 플래터 상에서 데이터의 기록영역은 트랙과 섹터로 나뉘어지는데, 트랙은 운동장에서 트랙이라는 것이 운동장 주변을 두르고 있는 것처럼, 플래터의 축을 중심으로 하는 동심원들을 의미합니다. 그리고 가장 바깥쪽에 있는 것이 0번 트랙이고, 플래터의 중심으로 갈수록 트랙 번호는 증가합니다.

섹터는 트랙을 나누어 놓은 것으로써, 하나의 섹터는 위 그림에서 보이듯 자주색의 부채꼴 영역을 의미합니다. 섹터는 1번부터 시작되어 반시계 방향으로 갈수록 번호가 증가합니다. 그래서 플래터 상에서 데이터가 있는 구역은 섹터 번호와 트랙 번호를 지정함으로써 알 수 있게 되는 것입니다.

그러나 플래터도 앞면과 뒷면이 있으며, 또한 플래터 자체가 여러 장이기 때문에 데이터의 위치를 규정하기 위해서는 하나의 요소가 또 필요합니다. 그게 바로 헤드인데, 헤드는 플래터 표면의 정보를 읽어내고 정보를 기록하는 역할을 합니다. 하나의 헤드는 플래터의 한 면에서만 읽고 쓰는 것이 가능하며 따라서, 모든 면에 하나씩의 헤드가 필요하게 됩니다. 헤드의 순서는 맨 아래에 있는 것이 0번이고, 위로 올라갈수록 하나씩 증가합니다. 그래서 플래터가 2개일 경우에 헤드는 4개 혹은 3개(마지막 면은 사용하지 않을 경우)가 됩니다.

이렇게 여러 장의 플래터를 다루기 때문에 트랙의 개념을 확장해서 실린더라는 개념이 사용되는데, 실린더는 수직 방향으로 같은 위치에 있는 트랙들의 집합이며, 원통의 형태를 가진다고 보면 됩니다. 당연히 번호는 트랙과 같은 방법으로 매겨져서 가장 바깥쪽 실린더가 0번이고, 안쪽으로 들어갈수록 번호는 증가합니다.

그래서, 하드디스크 내에서 데이터의 위치를 지정하는데에는 데이터의 기록면(헤드 번호), 기록되어 있는 트랙(실린더 번호), 기록된 섹터(섹터 번호)라는 세 가지 정보가 필요하며, 이들 세 가지 정보의 조합으로써 하드디스크 드라이브의 용량이 결정됩니다. 한 개의 섹터에는 512byte가 들어가므로, 이를 바탕으로 CHS(Cylinder, Head, Sector) 수치를 알면 용량을 계산할 수 있습니다.

예를 들어서, 128개의 실린더와 8개의 헤드, 63개의 섹터를 가지는 하드디스크 드라이브라면 용량은 다음과 같이 계산할 수 있습니다.

128 × 8 × 63 x 512byte = 33,030,144byte = 32,256kB = 31.5MB

그러나 이러한 물리적 CHS 수치는 최근의 하드디스크 드라이브에서는 사실상 의미가 없어졌습니다. 기록밀도의 지속적인 증가로 인해서 트랙밀도 및 트랙의 선밀도 등이 급격하게 증가했을뿐더러 하드디스크 내부의 기록방법도 표준 레코딩 기법에서 존드-비트(zoned-bit) 레코딩으로 변경되었기 때문에 CHS 수치가 실제 하드디스크 드라이브의 CHS 수치와는 큰 차이를 보이기 때문입니다.

그렇다면 이제 LBA에 대해서 알아보겠습니다.
LBA는 Logical Block Area 또는 Linear Block Addressing의 약자로 CHS와 같이 하드 디스크의 물리적 구조를 생각하지 않고 각각의 섹터가 일렬로 연결되어 있다고 가정하는 구조입니다. 왜 CHS를 사용하다가 LBA로 넘어오게 되었는가 하면, 기존 CHS 방식을 계속 사용할 경우 사용자는 ATA 방식의 하드디스크를 시스템에 연결하고, 시스템의 바이오스는 CHS 어드레싱을 사용해서 하드디스크에 접근하게 되는데, 이러한 구조 상에서 용량제한 문제가 발생하였기 때문에 이를 회피하기 위한 수단으로 새롭게 고안한 개념이기 때문입니다.

ATA 규격상에서는 실린더를 65,536개까지 지원할 수 있지만 CHS 바이오스는 1024개의 바이오스만을 인식할 수 있었습니다. 그 결과, 사용할 수 있는 실린더의 수는 1024개로 제한되어 버렸고, 마찬가지로 헤드와 섹터에 있어서도 각각 16개와 63개로 제한이 걸리게 되었습니다. 결국 하드디스크가 가질 수 있었던 한계는 실린더 1024개, 헤드 16개, 섹터 63개가 되기 때문에 이를 바탕으로 용량을 계산해보면 528MB가 됩니다.

1024 × 16 × 63 x 512byte = 528,432,304byte

즉, 여기서 약 528MB라는 용량제한이 생겨버린 것입니다. 이를 돌파하기 위해서 'CHS 변수 전환(CHS parameter translation)'이라는 방법이 사용되었는데, 이는 하드디스크의 물리적인 CHS 수치를 무시하고 이것을 시스템에서 허용되는 수치로 변경하는 방법을 말합니다.

그러나 이러한 CHS 변수전환을 사용한다고 해도 결국은 CHS 바이오스 상에서 지원할 수 있는 전체 실린더/헤드/섹터 수까지만 지원할 수 있다는 문제가 있었고, CHS 바이오스는 실린더, 헤드, 섹터를 최대 1024개, 256개, 63개까지 사용할 수 있었는데, 이것을 계산하면 바로 8.4GB가 됩니다.

1024 × 256 × 63 × 512byte = 8,455,716,864byte

이러한 장벽을 넘기 위해서 만들어진 것이 LBA 인터페이스입니다. LBA 인터페이스가 적용되면 바이오스는 기존의 CHS 방식 대신 LBA 방식을 사용해서 하드디스크 드라이브에 접근합니다. LBA는 그 이름 그대로, 물리적, 혹은 논리적(변수전환된) CHS 수치를 무시하고 하드디스크 전체를 하나의 영역으로 보면서 이 안에서 일련의 주소를 가지는 블록을 만듭니다. 그리고 이러한 블록의 주소를 지정하기 위한 정보로써 28bit를 사용합니다.
 

그 결과, 본래 바이오스가 가지고 있는 CHS 한계와는 상관없이 ATA 규격이 가지는 한계까지를 모두 사용할 수 있게 되었습니다. 28bit가 사용된 것은 ATA 규격에서 정의하고 있는 CHS 수치에 28bit의 정보가 사용되기 때문입니다. 그리고 섹터의 수는 0이 아닌 1부터 시작되기 때문에 256개가 아닌 255개가 되며, 이와 호환성을 유지하기 위해서 LBA 방식의 어드레싱에서 사용할 수 있는 주소의 총 개수는 다음과 같이 정해집니다.

216 × 24 × (28 - 1) = 220 × (28 - 1) = 267,386,880


따라서 LBA 방식이 528MB밖에 사용할 수 없던 기존의 CHS 방식의 한계를 극복하게 된 것입니다.


위 하드디스크는 사고 당시 룸메이트 형이 실수로 파티션을 날려 버린 웨스턴디지털의 캐비어 그린 1TB 하드디스크입니다(사진은 구글 검색).
여기에서 주목하실 점은 LBA가 1953525168이라고 표시된 부분입니다. 

파티션 복구 당시에는 복구 장면을 캡쳐할 만한 정신적 여유가 없어서 비록 사진은 없지만 TeskDisk에서 CHS는 121,601으로 표시되었습니다.
그리고 위에서 한참동안 언급한 것과 같이 CHS와 LBA는 환산이 가능하다는 점을 토대로 이것이 실제로 1TB 전체에 해당하는가에 대한 의문을 풀기 위해서는
어떻게 해야하는가를 고민하게 되었습니다.

그러다 찾게 된 프로그램! "CHS <-> LBA Translator"


간단한 엑셀의 함수를 통해 만들어져 있지만, 사실 환산과정이 복잡하지는 않아 엑셀로도 충분히 구현할 수 있나봅니다.


시트보호가 설정되어 있어서 셀 크기보다 나타낼 숫자의 길이가 더 길면 숫자가 다 표시가 되지 않고 ############ 으로 나옵니다. 따라서 시트보호를 해제해 주시고,


Start Addr LBA와 End Addr LBA에 1부터 하드디스크 표면에 쓰여져 있는 LBA까지를 입력하면 왼쪽의 eCyl에 실린더의 수가 나옵니다.
121,601이라는 실린더 수는 TeskDisk에서 분석한 실린더의 수와 일치합니다.

정말 말이 장황하게 길어졌습니다.
오늘의 결론은 결국 CHS와 LBA를 서로 변환해주는 이 엑셀 프로그램의 소개에 목적이 있었는데 말이죠.

그런데...CHS가 거의 의미가 없게 된 지금, 이 글은 대체 무슨 소용이 있을까요? 흑흑...ㅠ_ㅠ

이 블로그의 공식 주소는 http://theHermes.kr 입니다.

  1. 잘봤습니다. [2013.01.04 16:26]  수정/삭제  댓글쓰기

    굉장히 자세히 설명해주셨네요
    덕분에 디스크 구조에대해 만히 알아갑니다.
    코멘트가 하나도없군요 어케된일인지;;
    그리고 오타인거같아서여
    "그리고 섹터의 수는 0이 아닌 1부터 시작되기 때문에 256개가 아닌 255개가 되며"
    요부분 숫자가 맞나영?

    • ::IUnknown [2013.01.26 15:08]  수정/삭제

      CHS에서의 Cylinder 및 Header와는 다르게, Sector 주소만은 예외로 Zero-based가 아니고 1부터 시작합니다. Bootsector를 만들 때 흔히들 많이 하는 실수 중 하나가 CHS에서 Sector에 0을 지정하여 읽으려고 시도하는 것인데, 당연히 BIOS에서는 이를 Error로 처리합니다.