INT 13h는 BIOS 인터럽트 콜 13의hex 약자로, x86 기반(IBM PC-descended) 컴퓨터 시스템에서 20번째 인터럽트벡터입니다.일반적으로 BIOS는 이 벡터에 리얼모드 인터럽트 핸들러를 셋업하여 실린더 헤드 섹터(CHS) 어드레싱을 사용하여 섹터 기반의 하드 디스크 및 플로피 디스크 읽기/쓰기 서비스를 제공합니다.또한 최신 PC BIOS에는 IBM과 Microsoft가 1992년에 시작한 INT 13h 확장 기능이 포함되어 있으며, 64비트 LBA 주소를 사용하여 동일한 디스크 액세스 서비스를 제공합니다. 이 기능은 피닉스 테크놀로지스 등에 의해 EDD(Enhanced Disk Drive) BIOS 확장으로 준표준화되었습니다.
INT는 소프트웨어 인터럽트를 트리거하는 x86 명령이며hex 13은 호출되는 인터럽트 번호(16진수치)입니다.
최신 컴퓨터에는 BIOS INT 13h와 UEFI 기능이 모두 탑재되어 있어 CSM이 완전히 삭제되어 INT 13h 및 기타 인터럽트가 없는 UEFI Class 3을 제외하고 동일한 서비스 등을 제공합니다.일반적으로 UEFI 드라이버는 CHS 주소 지정 대신 LBA 주소 지정을 사용합니다.
DOS와 같은 리얼 모드 운영 체제에서는 INT 13h를 호출하면 컴퓨터의 ROM-BIOS 코드에 들어가 프로그램의 물리 섹터 기반 디스크 읽기 또는 쓰기 작업을 수행합니다.DOS 에서는, 하드 디스크나 플로피디스크용의 내장 블록 디바이스 드라이버의 로우 레벨의 인터페이스로서 기능합니다.이를 통해 INT 25h 및 INT 26h는 DOS 커널의 FAT 파일 시스템 드라이버에 논리 섹터용 절대 디스크 읽기/쓰기 기능을 제공할 수 있으며, DOS API(INT 21h) 기능을 통해 파일 관련 요청을 처리합니다.
Microsoft Windows NT 파생 모델(NT4, 2000, XP, Server 2003 등)이나 dosemu를 사용하는 Linux 등의 보호 모드 운영 체제에서는 OS가 콜을 대행 수신하여 운영 체제의 네이티브 디스크 I/O 메커니즘으로 전달합니다.Windows 9x 및 Windows for Workgroups 3.11도32비트 디스크 액세스를 사용하는 경우 BIOS 루틴을 바이패스합니다.INT 13h 콜 및 관련 BIOS 데이터 구조에서는 낮은 수준의 디스크 액세스를 실행하는 것 외에 시스템에 접속되어 있는 디스크(또는 다른 DASD 디바이스)의 종류와 용량에 대한 정보도 제공합니다.보호 모드 OS가 기동할 때 BIOS에서 해당 정보를 사용하여 디스크 하드웨어를 열거하여 애플리케이션을 로드 및 구성할 수 있습니다.디스크 I/O드라이버를 준비합니다.
원래의 BIOS 리얼 모드 INT 13h 인터페이스에서는, 물리 CHS 어드레싱이라고 불리는 것을 사용하고, 최대 8 GB 의 사이즈의 드라이브를 서포트합니다.이 제한은 IBM PC/XT 디스크 하드웨어의 하드웨어 인터페이스에서 발생합니다.BIOS는 INT 13h 콜에서 지정된 Cylindle-Head-Sector(CHS; 실린더 헤드 섹터) 주소를 사용하여 하드웨어 인터페이스로 직접 전송했습니다.BIOS에서 사용되는 CHS 주소 제한과 ATA 하드 디스크에서 사용되는 주소 제한의 조합에 의해 약 504MB라는 작은 제한이 부과되었습니다.BIOS와 ATA의 CHS 주소 제한을 모두 합친 경우(즉, 동시에 적용할 경우), 주소 지정할 수 있는 512바이트 섹터의 수는 총 약 504MB입니다.
504 MB의 제한은 BIOS가 INT 13h 인터페이스에서 가상의 CHS 지오메트리를 시뮬레이트하면서 네이티브 논리 CHS 지오메트리를 사용하여 ATA 드라이브와 통신하는 기술인 CHS 변환을 사용하여 극복되었습니다.(504 MB의 장벽이 가까워졌을 때 ATA 디스크는 실제 물리 지오메트리를 표시하는 것을 오래 전에 중단했습니다.외부 ATA 인터페이스의 미터리 파라미터).변환에 의해, CHS 어드레싱을 사용하고 있는 BIOS 는, BIOS CHS 인터페이스만의 비압축 용량인 최대 8064 MB 의 ATA 디스크에 효율적으로 주소를 지정할 수 있습니다.(ATA 인터페이스는 네이티브 CHS 어드레싱 용량이 훨씬 크기 때문에 어드레싱을 통해 BIOS 및 ATA의 CHS 제한에 대한 "간섭"이 해결되면 BIOS의 제한은 더 작아집니다.)CHS 변환은 논리 CHS 어드레싱이라고 불리기도 하지만, 이 BIOS가 개발되었을 때 ATA CHS 주소는 물리적인 것이 아니라 이미 논리적인 것이었기 때문에 실제로는 잘못된 명칭입니다.8064 MB 제한은 INT 13h 인터페이스에서 사용되는 레지스터 값 기반 호출 규약과 하위 호환성을 유지하는 목표의 조합에서 비롯됩니다.즉, INT 13h에 전달되는 CHS 주소의 형식 또는 크기를 변경하여 Cylinder-number 필드 등의 필드에 비트를 추가할 수 없음을 나타냅니다.이 제한은 1024개의 실린더, 256 헤드, 63 섹터 및 512 바이트 블록을 사용하여 정확히 7.875 GiB(1024 * 256 * 63 * 512 바이트)의 주소 지정을 허용합니다.AWARD AT BIOS 및 AMI 386sx BIOS는 실린더 번호의 비트 10과 11을 레지스터 DH의 비트 6과 7에 배치하여 최대 4096개의 실린더를 처리하도록 확장되었습니다.
MS-DOS의 모든 버전(MS-DOS 7 및 Windows 95 포함)에는 256 헤드의 디스크 드라이브(레지스터 값 0xFF)를 기동할 수 없는 버그가 있습니다.따라서 최신 BIOS에서는 최대 255 [1][2]헤드의 CHS 변환 매핑을 제공하므로 주소 지정 가능한 총 용량이 정확히 8032.5MiB(약 7.844B)[3]로 줄어듭니다.
훨씬 더 큰 디스크의 주소 지정을 지원하기 위해 IBM과 Microsoft가 INT 13h Extensions라고 하는 인터페이스를 도입한 후 나중에 BIOS EDD([4][5]Enhanced Disk Drive Services)의 일부로 Phoenix Technologies에서 다시 게시하고 약간 확장했습니다.또한 INT 13h 서비스 내에서 기능 번호가 40h 이상인 새로운 기능을 정의하고 있으며, 모두 최대 8ZiB(논리블록 주소 지정)를 사용할 수 있습니다(ATA 드라이브는 최대 28비트 또는 48비트 LBA를 지원할 수 있으며, 각각 최대 128GiB 또는 128PiB(512바이트/블럭 크기를 가정할 경우).이것은 원래 INT 13h 인터페이스의 레지스터 기반 호출 규칙이 아닌 정보 패킷에 대한 포인터를 사용하기 때문에 "패킷" 인터페이스입니다.이 패킷은 인터페이스 버전, 데이터 크기 및 LBA를 포함하는 매우 단순한 데이터 구조입니다.소프트웨어의 하위 호환성을 확보하기 위해 확장 기능은 원래의 CHS 기능과 함께 구현되며, 같은 드라이브라도 양쪽 세트의 기능에 대한 콜을 혼재시킬 수 있습니다.또, CHS 기능이 디스크의 최초의 8064 MB를 넘어서는 도달할 수 없는 경고도 있습니다.
일부 캐시 드라이버는 응용 프로그램에서 INT 13h를 직접 발행하여 DOS가 바이패스되었음을 감지하면 버퍼를 플러시합니다.INT 13h를 통한 더미 판독은 미지의 캐시(예를 들어 재부팅 [1][2]전)에 대해 캐시 플러시를 강제하는 몇 가지 방법 중 하나로 사용할 수 있다.
1990~1991년 경의 AMI BIOS는 워드의 정렬되지 않은 버퍼를 폐기합니다.일부 DOS 및 TSR 프로그램 클로버는 활성화 [6]및 등록을 중단하고 이를 방지하기 위해 PC DOS 및 MS-DOS에서 자체 필터를 설치합니다.
EXT: 8GB 이상의 하드 드라이브를 지원하기 위해 1990년대에 작성된 INT 13h Extensions의 일부입니다.
INT 13h AH=00h: 디스크 시스템 리셋
파라미터
아.
00h
DL
드라이브(비트 7은 하드디스크와 플로피디스크를 모두 리셋하는 것을 의미합니다)
결과.
CF
에러로 설정
아.
반품코드
INT 13h AH=01h: 마지막 드라이브 작동 상태 가져오기
파라미터
아.
01h
DL
운전해.
플로피 드라이브의 경우 비트 7=0, 고정 드라이브의 경우 비트 7=1
결과.
아.
반품코드
00h
성공.
01h
유효하지 않은 명령어
2시
주소 표시를 찾을 수 없습니다.
03시
쓰기 보호된 디스크에 쓰기 시도.
4시
섹터를 찾을 수 없습니다.
5시
리셋 실패
06시
디스크 변경 라인 '액티브'
07시
드라이브 매개 변수 활동 실패
08시간
DMA 오버런
09시
64KB 경계 이상의 DMA 시도
0아
불량 섹터가 검출되었습니다.
0Bh
불량 실린더(트랙) 감지됨
0CH
매체 유형을 찾을 수 없습니다.
0Dh
섹터 수가 잘못되었습니다.
0에
제어 데이터 주소 표시가 감지됨
0Fh
DMA가 범위를 벗어남
10시간
CRC/ECC 데이터 오류
11시
ECC 수정 데이터 오류
20시간
컨트롤러 장애
40시간
검색 실패
80시간
드라이브 시간이 초과되었습니다. 준비되지 않은 것으로 간주됩니다.
AAh
드라이브 준비 안 됨
BBH
정의되지 않은 오류
CCh
쓰기 장애
E0h
상태 오류
FH
감지 작업 실패
CF
에러 설정, 에러 없는 경우는 클리어
INT 13h AH=02h: 드라이브에서 섹터 읽기
파라미터
아.
2시
AL
읽을 섹터 수
CH
실린더
CL
섹터
DH
머리
DL
운전해.
ES: BX
버퍼 주소 포인터
결과.
CF
에러 설정, 에러 없는 경우는 클리어
아.
반품코드
AL
실제 섹터 읽기 수
언급
레지스터 CX에는 실린더 번호(10비트, 가능한 값은 0 ~ 1023)와 섹터 번호(6비트, 가능한 값은 1 ~ 63)가 모두 포함됩니다.실린더 및 섹터 비트의 번호는 다음과 같습니다.
CX = ---CH----CL--- 실린더: 76543210 98 섹터: 543210
번역의 예:
CX : = ( ( 실린더 및 255) shl 8 ) 또는 ( 실린더 및 768 ) shr 2 ) 또는 섹터, 실린더 : = (CX 및 0xFF00) shr 8 ) 또는 (CX 및 0xC0) shl 2) 섹터 : = CX 및 63;
버퍼의 어드레싱은 완전한 버퍼가 지정된 세그먼트(segment) 안에 있음을 보증해야 합니다.( BX + size_of_buffer ) <= 10000h그렇지 않으면 일부 BIOS 또는 하드웨어 버전에서 인터럽트가 실패할 수 있습니다.
예
16 섹터(= 2000h 바이트)를 읽으려고 하며 버퍼가 메모리 주소 4에서 시작된다고 가정합니다.FF00h. 메모리 분할을 사용하여 레지스터 값을 계산하는 방법은 다음과 같습니다.
ES = 세그먼트 = 4F00h BX = 오프셋 = 0F00h 섬 = 메모리 주소 = 4FF00h가 좋은 선택입니다. 0F00h + 2000h = 2F00h ES = 세그먼트 = 4000h BX = 오프셋 = FF00h 섬 = 메모리 주소 = 4FF00h가 아니기 때문입니다.
인터럽트 13h의 함수 02h는 하드 드라이브의 첫 번째 16,450,560 섹터의 섹터만 읽을 수 있으며, 8GB 제한을 초과하는 섹터를 읽으려면 INT 13h Extensions의 함수 42h를 사용해야 합니다.또 다른 대안으로는 파티션 내의 섹터를 읽는 DOS 인터럽트 25h가 있습니다.
코드 예시
[ORG 7c00h] ; 코드는 7c00h xor ax, ax에서 시작합니다. ds가 0 mov ds, ax cld로 설정되어 있는지 확인하십시오. mov ah, 2h; int13h 함수 2 mov al, 63; 우리는 63 섹터 mov ch, 0; 실린더 번호 0 mov cl, 2; 섹터 번호 2 - 2 - sector를 읽기를 원합니다(1, dh에서 시작).; head number 0 xor bx, bx mov es, bx, es는 0 mov bx, 7e00h, 원본 주소 7c00h int 13h jmp 7e00h에서 512바이트, 다음 섹터로 점프합니다.이 섹터를 채우고 부트 가능: times 510-($) dw 0AA55h
이 코드 섹션(asm 파일이 시작되어야 함) 뒤에 코드를 쓰면 메모리에 로드되어 실행됩니다.
dl(드라이브)를 변경하지 않은 것에 주목해 주세요.왜냐하면 컴퓨터가 처음 로딩될 때 dl은 부팅된 드라이브 수로 설정되기 때문에 부팅된 드라이브에서 읽기를 원할 경우 dl을 변경할 필요가 없기 때문입니다.