하드 디스크 접근할때...? 밑에 올렸던 질문 추가입니다...^^;
글쓴이: kkojiband / 작성시간: 토, 2003/07/05 - 11:56오전
먼저 답변해주신 분들 감사드립니다~!
역시 책보고 혼자 하는 것보다 고수님들의 도움을 받으니 진도가 빠르네요^^
밑에 lba mode 에 대한 언급이 있어서 찾아보니까 lba mode 에 대한 접근은 chs 를 lba 로 전환해주면 되는거라서 디스크 콘트롤러 or bios or kernel 등에서 한가지만 허용해도 사용이 가능하다고 하더군요...
그럼 bios 의 int 13h 는 받은 chs정보를 lba mode 로 전환해서 콘트롤러에 넘겨주는 함수인가요? 굳이 트랙당 섹터수를 구해서 입력하는걸 보니 그런거같기도 하고...음...--;
이게 아니라면 bios 에 따로 lba mode 로 접근하는 함수가 있나요??
아...다시 찾아보니까 최근의 bios 들은 lba mode 를 지원하기 위해 확장 int 13h 를 사용한다고 하는데 이건 어떤건가요??
Forums:
우선 Disk 제어는 방법이 몇가지 있습니다.첫번째는 Base가 0x
우선 Disk 제어는 방법이 몇가지 있습니다.
첫번째는 Base가 0x1f0, 0x170, (3f0) I/O port를 통해서 접근하는
PIO1 ~ 4 , DMA 방식이 있습니다.
두번째는 RealMode환경에서 사용하는 13h interrupt가 있습니다.
(반드시 RealMode에서만 되는 것은 아니고 보호모드에서도
GDT를 잘 꾸며주면 가능합니다.)
보통 Bootloader의 크기를 줄이기 위해 초기 부팅시에
13h를 사용하고 실제 커널내에서는 DMA를 사용하는게 주를 이룹니다.
꼭 그렇게 할 필요는 없지만 속도면에서 DMA 또는 PIO4가 제일 빠릅니다.
이론적으로 PIO4가 제일 빠르지만 멀티테스크 환경에서는 불리한점이 많아서
잘 사용하지 않는 편입니다.
그리고 PIO/DMA방식은 LBA sector를 직접 받아들이는 제어방식이 있습니다.
즉, CHS <-> LBA상호변환을 할 필요가 없이 LBA 로만 접근하는 방법이
있습니다.
저는 PIO4를 사용해서 드라이버(리눅스가 아닌)를 만든적이 있는데
멀티테스크환경에서는 상당히 타이밍이 중요하다는 것을 깨달았던 적이 있네요.
즉, "DMA로 할걸..." 이라고 반성한적이 있습니다.
밑의 내용은 HelpPC 2.10 에 나와 있는 인터럽트 도움말입니다.
실린더상위 2비트가 어디에 있는지 확인하시면 도움이 될지 모르겠네요.
I/O 방식
하나 더 추가
BIOS도 내부적으로는 리눅스 커널처럼 다 CHS/LBA로 접근합니다.
정 궁금하시다면 INT13h/AH=4xh를 찾아보세요.
이게 BIOS에서 LBA로 하드디스크 접근하는 인터페이스입니다.
AH=42h일 경우 Read, AH=43일 경우 Write이고요.
이때 인수는 DL에 드라이브 번호 넣고,
DS:SI에 LBA접근 정보를 담은 Disk address packet이라는
정보가 위치하는 주소를 담습니다. 구조가 아래와 같지요.
8G이상 영역을 BIOS로 접근한다면 반드시 이걸 써야합니다.
Written By the Black Knight of Destruction
아...이게 확장 int 13h 군요...^^;책엔 실린더 102
아...이게 확장 int 13h 군요...^^;
책엔 실린더 1024의 한계를 극복하기 위해 확장 int 13h 가 있다는 말만 있고 자세한 내용이 없었는데...
답변 해주신 분들 감사드립니다...^^
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
댓글 달기