티스토리 뷰

Study/OS

[OS] Mint64OS 24절 HardDiskDrive

생각많은 소심남 2013. 2. 1. 16:59

Memory도 저장 매체이고, pc 구동에서 중요한 역할을 차지하지만 문제는 전원이 나가면 그 데이터가 없어진다는 것이다. 말그대로 휘발성이라는 것이다. 사람이 필요로 하는 작업의 특성상 데이터를 지속적으로 저장하고 유지할 공간이 필요한 것이고 오랫동안 그 역할을 하고 있는 것이 바로 HardDiskDrive다. 물론 요즘에는 SSD가 등장해 점점 점유율을 넓혀가고는 있지만 가격이나 용량적인 측면에서 대중화는 아직까지는 먼 듯 하다. 아무튼 지금 거의 쓰고 있는 컴퓨터에는 이 하드디스크가 들어가 있을 것이다.

 하드 디스크의 내부에는 platter가 겹겹이 쌓인 Cylinder 형태를 취하고 있고, 특정영역에 대해 Access Arm이 데이터를 읽고 쓰는 방식을 취하고 있다. 그 특정영역에 접근하기 위해서는 platter가 직접 회전도 하고 Access Arm이 움직이기 때문에 이에 대한 소음과 고장 발생 빈도가 타 장치에 비해서 높다.

메모리도 똑같지만 본체에서 하드디스크의 데이터에 접근하기 위해서는 디스크의 주소를 가지고 있어야 하며, 이 주소는 보통 Cylinder, Head, Sector 로 나뉜다. 이 나뉜방식을 그대로 사용해서 데이터를 찾아가는 방식을 앞자만 따서 CHS Address 방식이라고 한다.

그냥 딱보면 몇번 실린더의 몇번 헤드의 몇번 섹터에 있다는게 간단히 묘사한 방식이다.  chs 방식이 여러모로 편리하긴 한데, 문제는 표현할 수 있는 용량에 제한이 있었다는 것이다. 구형 컴퓨터에서는 상관이 없었지만 하드디스크가 발전해가면서 용량이 증대하는데 비해서 이 chs 방식을 적용하면 이 chs address를 표현하는 비트의 한계로 최대 500여MB까지밖에 표현하지 못하게 되는 것이다. 이 때문에 아예 처음부터 chs로 구분하지 말고 Block 단위로 잡아서 계속하는 방식이 등장하는데 이게 Western Digital 사에 개발한 Logical Block Address 방식이다. 초기 방식으로 적용하면 최대 8GB까지 인식가능했었고, 물론 추후에 더 개선이 이뤄져서 지금의 고용량도 인식할 수 있게 되었다.


하여간 이 책에서도 LBA 방식으로 HDD를 만들어서 동작시키는 예제를 보였고, 임의로 20MB의 디스크 이미지를 QEMU에서 만들어서 인식시켰다. 내가 쓰고 있는 bochs에서는 bxImage라는 툴을 사용하면 손쉽게 하드 이미지를 생성할 수 있고, 테스트로 100MB의 HDD.img 파일을 인식시켰다.


참고로 HDD를 다룰때는 주요 관건이 HDD와 컨트롤러간의 정보 교환중 어떤 command를 전달하고, 그 전달할 때 어떤 flag가 설정되어 있는지가 가장 중요하다. 아무래도 이 HDD 본연의 기능은 데이터의 읽기와 쓰기인데, 이 설정과 command에 따라서 그 역할이 확 달라지기 때문이다. 또한 그 정보의 단위가 기존에 다뤘던 것보다 크기가 크기 때문에 데이터를 서로 주고 받는데 시간이 많이 걸린다.  이전에도 한번 다뤘지만 이렇게 시간이 많이 걸리는 process가 존재할 때는 동기화 과정이 필요하며, 여기서는 Critical Section에서도 interrupt를 처리할 수 있는 Mutex방식을 사용해서 동기화를 구현했다.



PIC에 연결되어 있는 하드디스크 컨트롤러를 통하여 하드디스크의 모델과 시리얼번호, 각각의 CHS Count와 총 용량에 대한 정보를 얻어올 수 있다.



지금은 Sector를 임의의 데이터로 쓰고 있는 것이고 저렇게 하드디스크 상에 흔적이 남았다.

본연의 역할을 하는지 알기 위해서는 데이터 삽입후 재 부팅시 그 데이터가 그대로 남아있는지를 확인해보면 된다.




댓글