Welcome to My World (www.dgmayor.com)

소프트웨어/C & 자료구조 & 커널 & DB

17. 하드디스크 드라이버

dgmayor 2022. 6. 14. 11:24
728x90
오늘은 대망의 파일시스템 그 첫 번째 챕터입니다.
 
파일시스템을 위해서는 하드디스크를 읽고 쓸 줄 알아야겠죠?
 
우린 이미 첫 강의때 Real Mode 상에서 지원하는 인터럽트 13으로 플로피디스크를 읽어본 경험이 있습니다.
 
그런데 슬프게도... 우리는 Real Mode 16비트 환경에서 Protected Mode 32비트 환경으로 넘어왔습니다.
 
이 32비트 환경에서 더 이상 인터럽트 13 으로 디스크를 읽지 못합니다. 대신 I/O 레지스터 프로그래밍을 통해 하드디스크에 직접 명령을 내리는 수 밖에 없습니다.
 
이번 포스트에서는 어떤 i/o 레지스터에 명령을 내려야 하드디스크를 읽고 쓸 수 있는지 분석해볼겁니다. 그리고 다음 포스트부터 본격적으로 이를 구현해볼 겁니다.
 
 
 
 
해당 링크엔 아주~ 자세하게 어떻게 하면 하드디스크를 읽을 수 있는지 적혀있습니다.
( 하드디스크 규격엔 여러 가지가 있는데 우린 IDE, 또는 PATA 방식으로 불리는 규격을 사용할 겁니다. )
 
하지만 영어로 되어있고 뭐가 핵심인지 알 수가 없으니.. 우리가 뭘 해야 하는지 간략하게 요약해봅시다.
 
 
무슨 개소리(?) 인가...
 
 
어려워보이지만 한 줄로 요약하면 " 하드디스크에 명령을 내릴 준비를 하고, 명령을 해서, 데이터 값을 읽는다 " 입니다.
 
1~7 단계는 " 하드디스크에 명령을 내릴 준비" 를 하는 겁니다. 각 포트에다 적절한 값을 씁니다.
 
 
 
 
1. 먼저 0x1F6에 0xE0 를 씁니다. 6비트와 4비트는 각각 LBA 모드와 드라이브 번호를 택하는데 1, 0 으로 설정해서 LBA 모드로 읽고, 드라이브는 0번 ( 보통 드라이브가 하나이면 0번에 마운트됩니다. ) 으로 설정합시다.
 
2. 안해도 됩니다
 
3. 0x1F2에 몇 개의 섹터를 읽을 지 입력합니다.
 
4~6. 0x1F3 ~ 0x1F5에 걸쳐 몇 번째 섹터부터 읽을 지 입력합니다. 보통 28비트짜리 LBA 주소를 입력할 수 있습니다. 예를 들어 10 섹터부터 읽고 싶다 합시다. 그럼 10 을 28비트짜리로 나타내서 이를 0x1F3 ~ 0x1F5에 8비트씩 나눠 넣습니다. 그런데 나머지 4비트는 어디에 넣죠? 이는 0x1F6의 하위 4비트에다가 넣으면 됩니다.
 
7. 이제 0x1F7에다 명령을 넣읍시다. 읽기는 0x20, 쓰기는 0x30 입니다!
 
8. 제대로 읽었는지 확인합시다. 우린 Polling 방법을 쓸 겁니다.
 
9. 읽었다면 0x1F0에 한 섹터만큼 분량의 데이터가 들어있습니다. 이를 원하는 메모리 장소에 읽기만 하면 됩니다.
 
 
 
--------------------------------------------------------------------------------
 
 

자 이론적으로는 끝입니다! 적절하게 레지스터에 값을 써 하드디스크에 명령을 내리고, 값을 읽거나 쓰면 됩니다.
 
한 가지 주의할 점은 하드디스크에 명령을 내릴 때 중간중간 체크할 점이 있다는 겁니다.
 
0x1F7의 값을 읽으면 현재 하드디스크의 상태를 알 수 있습니다. 8비트에 어떤 정보가 담긴지는 아래를 참고하세요
 
 
 

상태 레지스터를 읽어서 다음과 같이 쓸 수 있습니다.
 
1. 하드디스크에 명령을 내리기 전 (0x1F7에 쓰기!) BSY 비트가 0 이고 RDY 비트가 1일 경우에만 명령 가능.
 
2. 하드디스크에 명령을 내렸다면, DRQ 비트가 1인 경우에만 0x1F0 에 담긴 데이터를 제대로 읽고 쓸 수 있다.
 
 
 
--------------------------------------------------------------------------------
 
 
 

좋습니다! 이론적인건 이게 답니다! 백문이 불여일견이라 했으니 다음 포스트에서는 직접 코드를 작성해보도록 하겠습니다.
 
안타깝게도 다음 강의부터는 정들었던 VMware Workstation 환경에서 벗어나 Qemu 환경으로 바꿔서 진행하게 될 겁니다. VMware와 다르게 Qemu는 일반적인 .img 파일도 HDD에 마운트할 수 있기 때문에 하드디스크 드라이버 및 파일시스템을 구현하는 데 더 안성맞춤입니다.
 
따라서 다음 강의에서는 윈도우용 Qemu를 설치하고 하드디스크 드라이버 구현에 필요한 환경설정을 해보겠습니다.
 
감사합니다.
728x90