바이오스 인터럽트 호출

**바이오스 인터럽트 호출**(BIOS interrupt call)은 도스용 프로그램과, 부트 로더와 같은 일부 기타 소프트웨어가 IBM PC 호환기종의 컴퓨터에 위치한 바이오스의 기능을 불러내는데 이용하는 방식이다. 일부 운영 체제 또한 초기 시동 단계에서 바이오스를 이용하여 하드웨어 자원을 탐지하고 초기화할 수 있다.
# 인터럽트 호출
인터럽트는 INT x86 어셈블리어 명령을 이용하여 호출할 수 있다. 이를테면 바이오스 인터럽트 0x10을 이용하여 문자열을 화면에 출력하려면 다음의 x86 어셈블리어 명령을 실행하면 된다: mov ah, 0x0e mov al, '!' int 0x10
# 인터럽트 테이블
일반적인 바이오스 인터럽트 목록은 아래와 같다. 일부 바이오스(특히 오래된 것들)는 아래의 모든 인터럽트 클래스를 갖추고 있지는 않다. {| class="wikitable" border="1" |- ! 인터럽트 벡터 ! 설명 |- |`00h` |CPU: 0으로 나누기를 시도한 뒤 또는 몫이 떨어지지 않을 때 실행된다 |- |`01h` |CPU: 추적 플래그가 설정되어 있는 동안 모든 명령을 마친 후 실행된다 |- |`02h` |CPU: 메모리 오류 등을 위해 POST 등이 사용하는 NMI(Non-maskable interrupt) |- |`03h` |CPU: 가장 낮은 비예비 인터럽트. 디버깅에 예외적으로 사용되며 `INT 03` 핸들러는 늘 디버깅 프로그램이 추가함 |- |`04h` |CPU: 숫자 오버플로. 오버플로 플래그가 설정될 때 `INTO` 명령에 의해 발생. |- |`05h` | Shift-Print screen이 눌릴 때 실행. (`BOUND` 함수가 바운드 실패를 감지할 때에도 발생) |- |`06h` |CPU: 정의되지 않은 Opcode (잘못된 함수) 예외가 발생할 때 호출함. 일반적으로 운영 체제가 설치. |- |`07h` |CPU: 부동소수점 함수를 실행하고 수치 보조 프로세서의 이용이 불가능할 때 호출함 |- |`08h` |IRQ0: 시스템 타이밍 구성 요소가 추가함; PIT에 의해 초당 18.2번(55 ms) 호출함 |- |`09h` |IRQ1: 모든 키가 눌리고 뗐을 때 호출함 (키가 눌리고 있는 동안도 포함) |- |`0Bh` |IRQ3: 필요시 직렬 포트 2, 4 (COM2/4)가 호출함 |- |`0Ch` |IRQ4: 필요시 직렬 포트 1, 3 (COM1/3)이 호출함 |- |`0Dh` |IRQ5: 필요시 하드 디스크 컨트롤러 (PC/XT) 또는 2차 병렬 포트 LPT2 (AT)가 호출함 |- |`0Eh` |IRQ6: 필요시 플로피 디스크 컨트롤러가 호출함 |- |`0Fh` |IRQ7: 필요시 1차 병렬 포트 LPT1 (프린터)가 호출함 |- |`10h` | 비디오 서비스 {| class="wikitable" border="1" |- !`AH` ! 설명 |- |`00h` | 비디오 모드 설정 |- |`01h` | 커서 모양 설정 |- |`02h` | 커서 위치 설정 |- |`03h` | 커서 위치 및 모양 가져오기 |- |`04h` | 라이트 펜 위치 가져오기 |- |`05h` | 디스플레이 페이지 설정 |- |`06h` | 지우기/스크롤 스크린 업 |- |`07h` | 지우기/스크롤 스크린 다운 |- |`08h` | 문자열 및 커서 특성 읽기 |- |`09h` | 문자열 및 커서 특성 쓰기 |- |`0Ah` | 커서 문자열 쓰기 |- |`0Bh` | 커서 테두리 설정 |- |`0Ch` | 그래픽 픽셀 쓰기 |- |`0Dh` | 그래픽 픽셀 읽기 |- |`0Eh` | TTY 모드에서 문자열 쓰기 |- |`0Fh` | 비디오 모드 가져오기 |- |`10h` | 팔레트 레지스터 설정 (EGA, VGA, SVGA) |- |`11h` | 문자 발생기 (EGA, VGA, SVGA) |- |`12h` | 함수 대안 선택 (EGA, VGA, SVGA) |- |`13h` | 문자열 쓰기 |- |`1Ah` | 디스플레이 결합 코드 가져오기 또는 설정 (VGA, SVGA) |- |`1Bh` | 기능 정보 가져오기 (VGA, SVGA) |- |`1Ch` | 비디오 상태 저장 또는 복원 (VGA, SVGA) |- |`4Fh` |VESA 바이오스 확장 함수 (SVGA) |} |- |`11h` | 장비 목록 반환 |- |`12h` | 기본 메모리 크기 반환 |- |`13h` | 낮은 수준의 디스크 서비스 {| class="wikitable" border="1" |- !`AH` ! 설명 |- |`00h` | 디스크 드라이브 초기화 |- |`01h` | 드라이브 상태 검사 |- |`02h` | 섹터 읽기 |- |`03h` | 섹터 쓰기 |- |`04h` | 섹터 유효 여부 확인 |- |`05h` | 트랙 포맷 |- |`08h` | 드라이브 변수 가져오기 |- |`09h` | 고정 드라이브 변수 초기화 |- |`0Ch` | 지정된 트랙으로 찾기 |- |`0Dh` | 고정 디스크 컨트롤러 초기화 |- |`15h` | 드라이브 종류 가져오기 |- |`16h` | 플로피 드라이브 미디어 변경 상태 가져오기 |- |`17h` | 디스크 종류 설정 |- |`18h` | 플로피 드라이브 미디어 종류 설정 |- |`41h` | 확장 디스크 드라이브 (EDO) 설치 검사 |- |`42h` | 섹터 확장 읽기 |- |`43h` | 섹터 확장 쓰기 |- |`44h` | 섹터 확장 유효 여부 확인 |- |`45h` | 드라이브 잠금/잠금 해제 |- |`46h` | 미디어 꺼내기 |- |`47h` | 확장 찾기 |- |`48h` | 드라이브 변수 확장 가져오기 |- |`49h` | 미디어 변경 상태 확장 가져오기 |- |`4Eh` | 하드웨어 구성 확장 설정 |} |- |`14h` | 직렬 포트 서비스 {| class="wikitable" border="1" |- !`AH` ! 설명 |- |`00h` | 직렬 포트 초기화 |- |`01h` | 문자열 전송 |- |`02h` | 문자열 수신 |- |`03h` | 상태 |} |- |`15h` | 기타 시스템 서비스 {| class="wikitable" border="1" |- !`AH` !`AL` ! 설명 |- |`00h` | | 카세트 드라이브 모터 켜기 |- |`01h` | | 카세트 드라이브 모터 끄기 |- |`02h` | | 카세트로부터 데이터 블록 읽기 |- |`03h` | | 카세트에 데이터 블록 쓰기 |- |`4Fh` | | 키보드 가로채기 |- |`83h` | | 이벤트 대기 |- |`84h` | | 조이스틱 읽기 |- |`85h` | | Sysreq 키 호출 |- |`86h` | | 대기 |- |`87h` | | 블록 이동 |- |`88h` | | 확장 메모리 크기 가져오기 |- |`89h` | | 보호 모드로 전환 |- |`C0h` | | 시스템 변수 가져오기 |- |`C1h` | | 확장 바이오스 데이터 영역 세그먼트 가져오기 |- |`C2h` | | 포인팅 장치 기능 |- |`C3h` | | 감시 타이머 기능 - PS/2 시스템 전용 |- |`C4h` | | 프로그래밍 가능한 옵션 선택 - MCA 버스 PS/2 시스템 전용 |- |`D8h` | |EISA 시스템 기능 - EISA 버스 시스템 전용 |- |`E8h` |`01h` | 확장 메모리 크기 가져오기 (1994년 이후 더 새로운 기능). 64 Mb 이상의 메모리 크기에 대한 결과를 제공. |- |`E8h` |`20h` | 쿼리 시스템 주소 맵. |} |- |`16h` | 키보드 서비스 {| class="wikitable" border="1" |- !`AH` ! 설명 |- |`00h` | 문자열 읽기 |- |`01h` | 입력 상태 읽기 |- |`02h` | 키보드 Shift 상태 읽기 |- |`05h` | 키보드 버퍼에 키 눌림 저장 |- |`10h` | 문자열 확장 읽기 |- |`11h` | 입력 상태 확장 읽기 |- |`12h` | 키보드 Shift 상태 확장 읽기 |} |- |`17h` | 프린터 서비스 {| class="wikitable" border="1" |- !`AH` ! 설명 |- |`00h` | 프린터에 문자열 인쇄 |- |`01h` | 프린터 초기화 |- |`02h` | 프린터 상태 검사 |} |- |`18h` | 카세트 BASIC 실행: 실제 IBM 컴퓨터에는 시동 실패 이벤트의 해당 루틴이 해석, 실행을 목적으로 ROM에 BASIC이 포함되어 있다. (BIOS가 호출) |- |`19h` | POST 이후 이 인터럽트는 운영 체제를 불러오기 위해 바이오스가 사용함 |- |`1Ah` | 실시간 시계 서비스 {| class="wikitable" border="1" |- !`AH` ! 설명 |- |`00h` | RTC 읽기 |- |`01h` | RTC 설정 |- |`02h` | RTC 시간 읽기 |- |`03h` | RTC 시간 설정 |- |`04h` | RTC 날짜 읽기 |- |`05h` | RTC 날짜 설정 |- |`06h` | RTC 알람 설정 |- |`07h` | RTC 알람 초기화 |} |- |`1Ah` |PCI 서비스 - PCI 2.0 이상을 지원하는 BIOS가 추가 {| class="wikitable" border="1" |- !`AX` ! 설명 |- |`B101h` |PCI 설치 검사 |- |`B102h` |PCI 장치 찾기 |- |`B103h` |PCI 클래스 코드 찾기 |- |`B106h` |PCI 버스 관련 기능 |- |`B108h` |구성 Byte 읽기 |- |`B109h` |구성 Word 읽기 |- |`B10Ah` |구성 Dword 읽기 |- |`B10Bh` |구성 Byte 쓰기 |- |`B10Ch` |구성 Word 쓰기 |- |`B10Dh` |구성 Dword 쓰기 |- |`B10Eh` |IRQ 루틴 정보 가져오기 |- |`B10Fh` |PCI IRQ 설정 |} |- |`1Bh` |Ctrl-Break 핸들러 - Ctrl-Break가 눌릴 때 `INT 09`가 호출 |- |`1Ch` |타이머 틱 핸들러 - `INT 08`가 호출 |- |`1Dh` |호출되지 않음. VTP(비디오 변수 테이블) 포인터로서 비디오 모드의 데이터를 포함 |- |`1Eh` |호출되지 않음. DPT (디스켓 변수 테이블) 포인터로서 디스켓 드라이브에 관한 다양한 정보 포함 |- |`1Fh` |호출되지 않음. VGCT(비디오 그래픽 문자 테이블) 포인터로서 아스키 문자열 `80h` ~ `FFh`의 데이터 포함 |- |`41h` |주소 포인터: FDPT = 고정 디스크 변수 테이블 (1차 하드 드라이브) |- |`46h` |주소 포인터: FDPT = 고정 디스크 변수 테이블 (2차 하드 드라이브) |- |`4Ah` |알람을 위해 RTC가 호출 |- |`70h` |IRQ8: RTC가 호출 |- |`74h` |IRQ12: 마우스가 호출 |- |`75h` |IRQ13: 산술 보조 프로세서가 호출 |- |`76h` |IRQ14: 1차 IDE 컨트롤러가 호출 |- |`77h` |IRQ15: 2차 IDE 컨트롤러가 호출 |}
# 도스 훅
MS-DOS 시스템에서 IO.SYS는 플로피 디스크 변경 감지, 포맷 호출 추적, DMA 바운더리 오류 정정, 최초의 호출 이전 모델 코드 0xFC와 더불어 IBM의 ROM BIOS "01/10/84" 관련 문제 우회를 위해 INT 13을 훅 처리한다.