Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture #12 인터럽트 Interrupt.

Similar presentations


Presentation on theme: "Lecture #12 인터럽트 Interrupt."— Presentation transcript:

1 Lecture #12 인터럽트 Interrupt

2 인터럽트 Interrupt (1) 인터럽트 interrupt
주변 장치가 요구된 동작을 완료하였거나 오류 등의 event가 발생하였을 때 또는 실행중인 프로그램에 오류가 발생하였을 때에 CPU에게 알려주기 위해 발생하는 신호 cf) Event Polling 인터럽트 핸들러 Interrupt Handler 인터럽트 서비스 루틴 인터럽트가 발생한 원인을 해결해주는 프로그램 루틴 인터럽트 벡터 테이블 Interrupt Vector Table 인터럽트 핸들러 주소를 저장하고 있는 테이블

3 인터럽트 Interrupt (2) 인터럽트 처리 CPU는 인터럽트가 발생하면 현재 실행하는 프로그램을 중지
CPU의 상태(CS, IP, Flag registers 등)을 스택에 저장 발생한 인터럽트의 핸들러를 실행하여 인터럽트를 처리 인터럽트 벡터 테이블에서 해당 인터럽트의 핸들러 주소를 찾고 CPU의 상태를 변경하여 인터럽트 핸들러를 실행 인터럽트 처리 완료 후에 원래 프로그램을 다시 실행 스택에 저장된 이전 프로그램의 상태를 복구하여 프로그램 실행을 resume

4 인터럽트 Interrupt (3) 인터럽트 처리 source : MOV AX, 1 MOV BX, 2 SUB AX, BX
Interrupt Processing Routine CS/IP/Flag Register를 스택에 저장 인터럽트 번호를 통해 원인 파악 CALL ISP CS/IP/Flag Register를 스택에서 복구 RETURN Interrupt Service Routine Interrupt Processing RETURN INT

5 인터럽트 Interrupt (4) 인터럽트 중첩 처리 인터럽트 처리 루틴을 실행하는 중에 새로운 인터럽트가 발생하는 경우
Interrupt Pending 이전 인터럽트의 처리가 종료될 때까지 인터럽트 처리를 연기 Priority-based Preemption 인터럽트의 우선순위를 따져 새로운 인터럽트의 우선순위가 높으면 현재의 인터럽트 처리를 중지한 다음, 새로운 인터럽트를 먼저 처리하고 중지된 인터럽트를 처리

6 인터럽트 Interrupt (5) 인터럽트 종류 하드웨어 인터럽트 소프트웨어 인터럽트 예외상태에 따른 인터럽트
ROM BIOS 인터럽트 DOS 인터럽트 예외상태에 따른 인터럽트 트랩(Trap)

7 하드웨어 인터럽트 (1) 하드웨어 인터럽트 CPU 또는 주변 장치에서 발생하는 인터럽트
8259 인터럽트 컨트롤러를 사용하여 처리 주변 장치로부터 최대 8개까지의 인터럽트를 받아 우선순위에 기반하여 처리 XT – 1개의 8259 사용  8개의 IRQ(IRQ0~IRQ7) 를 처리 AT – 2개의 8259 사용  16개의 IRQ(IRQ0~IRQ15)를 처리 2개의 8259가 cascading Interrupt 번호가 우선순위를 의미 IRQ0 > IRQ1 >IRQ2 > IRQ8 > … > IRQ15 > IRQ3 > …> IRQ7

8 하드웨어 인터럽트 (2) 8259 인터럽트 컨트롤러 내부 구조 IRR, ISR, IMR 레지스터의 역할

9 하드웨어 인터럽트 (3) 8259 인터럽트 컨트롤러 Cascading

10 하드웨어 인터럽트 (4) 하드웨어 인터럽트 종류 Maskable Interrupt Non-maskable Interrupt
프로그램에서 마스킹 명령어에 의해 인터럽트 발생을 무시할 수 있는 인터럽트 CLI(Clear Interrupt) / STI(SeT Interrupt) Non-maskable Interrupt 어떤 상황에서도 마스킹할 수 없는 인터럽트 CPU가 기억장치나 I/O 채널을 통해 읽을 때의 데이터 오류 CPU Interrupt CPU가 발생시키는 인터럽트 Peripheral Device Interrupt 주변 장치에서 발생시키는 인터럽트

11 소프트웨어 인터럽트 (1) 소프트웨어 인터럽트 프로그램의 요구에 의해 발생하는 인터럽트 인터럽트 핸들러의 위치에 따라
ROM BIOS Interrupt DOS Interrupt DOS에 대한 응용 프로그램의 시스템 콜(System Call) 방법을 제공 응용 프로그램이 DOS에게 일련의 서비스를 요구할 때에 소프트웨어 인터럽트를 발생시킨다 INT 명령어

12 소프트웨어 인터럽트 (2) 어셈블리어에서의 인터럽트 사용 INT 명령어를 사용하여 원하는 인터럽트를 발생시킴
인터럽트 처리에 필요한 매개변수를 지정된 레지스터에 먼저 저장하도록 한다 예: MOV DL, ’A’ MOV AH, 2 INT 21H

13 소프트웨어 인터럽트 (3) 어셈블리어에서의 인터럽트 사용 어셈블리 프로그램에서의 인터럽트 사용 예:
STACK SEGMENT STACK DB DUP(?) STACK ENDS ; DATA SEGMENT DATA MSG1 DB ‘I like Computer.’, 0DH, 0AH, ‘$ MSG2 DB ‘Do you like Computer?’, ‘$’ DATA ENDS PROG SEGMENT PARA ‘CODE’ ASSUME CS:PROG, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AH, 09H MOV DX, OFFSET MSG1 INT 21H MOV AH, 09H MOV DX, OFFSET MSG2 INT 21H ; MOV AH, 4CH PROC ENDS END START

14 소프트웨어 인터럽트 (4) C 언어에서의 인터럽트 사용
“dos.h” 헤드 파일에 DOS 인터럽트 호출과 관련된 데이터 타입과 함수 prototype을 정의 레지스터 구조체 예: struct WORDREGS { unsigned int ax, bx, cx,dx, si, di, cflag, flags; }; struct BYTEREGS { unsigned char al, ax, bl, bh, cl, ch, dl, dh; } union REGS { struct WORDREGS x; struct BYTEREGS h; struct SREGS { unsigned int es, cs, ss, ds;

15 소프트웨어 인터럽트 (5) C 언어에서의 인터럽트 사용 인터럽트 호출 함수 Prototype :
int int86(int intno, union REGS *inregs, union *outregs); int int86x(int intno, union REGS *inregs, union *outregs, struct SREGS *segregs); int intdos(union REGS *inregs, union *outregs); int intdosx(union REGS *inregs, union *outregs,

16 소프트웨어 인터럽트 (6) C 언어에서의 인터럽트 사용 인터럽트 호출 C 언어 프로그램 예제
#include <stdio.h> #include <dos.h> union REGS reg; void main() { static char msg1[]=“I like Computer.\r\n$”; static char msg2[]=“Do you like Computer?$”; reg.x.dx = (int)msg1; reg.h.ah = 9; int86(0x21, &reg, &reg); }

17 인터럽트 핸들러 작성 (1) 인터럽트 핸들러 변경 원하는 인터럽트를 처리할 수 있는 인터럽트 처리 루틴을 작성
인터럽트 벡터 테이블에서 인터럽트 벡터(인터럽트 핸들러 주소)를 찾아 새로 작성된 인터럽트 핸들러 주소로 대치 원래의 주소는 저장하였다가 원 상태로 되돌릴 때에 사용

18 인터럽트 핸들러 작성 (2) 인터럽트 벡터 테이블 인터럽트 핸들러 주소를 저장하고 있는 테이블
메모리 영역 0000:0000H ~ 0000:03FFH (1KB)에 위치 구조: 인터럽트 번호를 인덱스로 사용하여 접근 4 8 : 세그먼트 주소 오프셋 : INT 0 인터럽트 핸들러 주소 INT 1 인터럽트 핸들러 주소

19 인터럽트 핸들러 작성 (3) DOS 시스템 콜을 이용한 인터럽트 벡터 접근 DOS 시스템 콜의 함수 35H를 이용
 ES:BX (Segment Address:Offset) 반환 ; 인터럽트 벡터 테이블을 직접 접근 ; GET_INTVEC1 MACRO INTNO CLI XOR AX, AX MOV ES, AX MOV DI, INTNO SHL DI, 2 MOV BX, ES;[DI] MOV AX, ES;[DI+2] STI ENDM ; DOS 인터럽트 함수 35번 이용 ; GET_INTVEC2 MACRO INTNO CLI MOV AH, 35H MOV AL, INTNO INT 21H STI ENDM

20 인터럽트 핸들러 작성 (4) 인터럽트 벡터 변경 인터럽트 벡터 테이블을 직접 변경 DOS 시스템 콜 함수 25H를 사용
CLI/STI 명령을 사용하여 임계영역(Critical Area) 설정 DOS 시스템 콜 함수 25H를 사용 변경하고자 하는 인터럽트 핸들러 주소를 DS:DX (Segment Address:Offset) 에 지정 ; 인터럽트 벡터 테이블을 직접 접근 SET_INTVEC1 MACRO INTNO, SADDR, OADDR CLI XOR AX, AX MOV ES, AX MOV DI, INTNO SHL DI, 2 MOV AX, OADDR MOV ES;[DI], AX MOV AX, SADDR MOV AX, ES;[DI+2] STI ENDM ; DOS 인터럽트 함수 25번 이용 SET_INTVEC2 MACRO INTNO, SADDR, OADDR CLI MOV DX, OADDR MOV AX, SADDR MOV DS, AX MOV AH, 35H MOV AL, INTNO INT 21H STI ENDM

21 인터럽트 핸들러 작성 (5) 인터럽트 핸들러 작성 처리하고자 하는 인터럽트에 대한 처리 루틴을 작성
NEAR PROC을 이용하여 정의 반환 명령으로 RET이 아닌 IRET을 사용 앞에서 제시된 방법을 이용하여 인터럽트 벡터 테이블을 수정 이전의 인터럽트 벡터 테이블 내용은 보관하였다가 프로그램 종료 시에 원래 값으로 복원

22 인터럽트 핸들러 작성 (6) 인터럽트 핸들러 작성 예: DATA SEGMENT PARA ‘DATA’
GET_INTVEC MACRO INTNO CLI MOV AH, 35H MOV AL, INTNO INT 21H STI ENDM ; SET_INTVEC MACRO INTNO, SADDR, OADDR MOV DX, OADDR MOV AX, SADDR MOV DS, AX STACK SEGMENT STATCK DB DUP(‘STACK’) STACK ENDS DATA SEGMENT PARA ‘DATA’ INT_NO EQU 0F3H ORI_CS DW 0 ORI_OF DW 0 SEGADDR DW 0 OFFADDR DW 0 DATA ENDS ; CODE SEGMENT PARA ‘CODE’ START PROC FAR ASSUME CS:CODE, DS:DATA, SS:STATCK PUSH DS MOV AX, DATA MOV DS, AX MOV ES, AX GET_INTVEC INT_NO MOV ORI_CS, ES MOV ORI_OF, BX

23 인터럽트 핸들러 작성 (7) 인터럽트 핸들러 작성 예: MOV AX, SEG CLEARP CLEARP PROC NEAR
MOV SEGADDR, AX MOV AX, OFFSET CLEARP MOV OFFADDR, AX PUSH DS SET_INTVEC INT_NO, SEGADDR, OFFADDR POP DX INT INT_NO SET_INTVEC INT_NO, ORI_CS, ORI_OF POP DS RET START ENDP CLEARP PROC NEAR CLI PUSH DS MOV CX, 0 MOV DX, 2479H MOV BH, 7 MOV AL, 0 INT 10H POP DS STI IRET CLEARP ENDP CODE ENDS END START

24 어셈블리어와 상위레벨 언어의 링킹(1) 어셈블리 서브프로그램과의 링킹 세그먼트 지정 SEGMENT 디렉티브
seg-name SEGMENT [align] [combine] ['class'] 정렬(align) : BYTE, WORD, DWORD, PARA, PAGE 결합(combine) : NONE, PUBLIC, COMMON 클래스(class) : 'Stack', 'Data', 'Code’

25 어셈블리어와 상위레벨 언어의 링킹(2) 어셈블리 서브프로그램과의 링킹 세그먼트내에서의 호출
near CALL : NEAR 프로시저에 대한 호출(32K이내) CALL 연산은 IP를 스택에 push하고 호출 대상 프로시저 주소의 오프셋으로 설정 RET는 스택에서 pop한 값을 IP에 저장함으로써 CALL 다음의 명령으로 리턴 예: E8 2000 CALL nearproc ; Near call : push IP, ... nearproc PROC NEAR RET ;Near return: pop IP, return nearproc ENDP

26 어셈블리어와 상위레벨 언어의 링킹(3) 어셈블리 서브프로그램과의 링킹 세그먼트간 호출 EXTRN과 PUBLIC 속성 인자 전달
far CALL : FAR 혹은 EXTRN 프로시저에 대한 호출 CALL 연산은 CS와 IP를 push하고, 호출대상 프로시저의 세그먼트 주소 및 오프셋으로 설정 예: 9A AF04 EXTRN과 PUBLIC 속성 EXTRN 디렉티브 EXTRN name:type [, ... ] 타입:ABS, BYTE, WORD, DWORD, FAR, NEAR PUBLIC 디렉티브 PUBLIC symbol [, ... ] 인자 전달 스택 프레임 : 인자 전달 및 임시 저장 공간으로 사용

27 어셈블리어와 상위레벨 언어의 링킹 (4) TITLE P23MAIN5 (EXE) Call subprogram
EXTRN P23SUB5:FAR ; STACKSG SEGMENT PARA STACK 'Stack' DW 64 DUP(?) STACKSG ENDS DATASG SEGMENT PARA 'Data' QTY DW 0140H PRICE DW 2500H DATASG ENDS CODESG SEGMENT PARA PUBLIC 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG MOV AX,DATASG MOV DS,AX PUSH PRICE PUSH QTY CALL P23SUB5 ;Call subprogram MOV AX,4C00H ;Exit to DOS INT 21H BEGIN ENDP CODESG ENDS END BEGIN

28 어셈블리어와 상위레벨 언어의 링킹(5) PRICE 0025 BP+8 QTY 4001 BP+6 200F BP+4 1200
TITLE P23SUB5 Called subprogram CODESG SEGMENT PARA PUBLIC 'CODE' P23SUB5 PROC FAR ASSUME CS:CODESG PUBLIC P23SUB5 PUSH BP MOV BP, SP MOV AX, [BP+8] ;Get price MOV BX, [BP+6] ;Get quantity MUL BX ;DX:AX = product POP BP RET 4 P23SUB5 ENDP CODESG ENDS END PRICE 0025 BP+8 QTY 4001 BP+6 200F BP+4 리턴 주소 1200 BP+2 Old BP 0000 BP

29 어셈블리어와 상위레벨 언어의 링킹(6) 상위 레벨에서의 링킹 calling convention
상위레벨 언어가 인자를 전달하는 방식을 뜻함 인자의 PUSH 순서-스택의 정의 방법을 규정 언어 PUSH 순서 전달되는 인자 리턴 타입 BASIC 순서대로 오프셋 주소 RET # FORTRAN 순서대로 FAR 주소 RET # C 역순으로 값 RET PASCAL 순서대로 값 RET # 참조(reference) 혹은 값(value)에 의한 전달 언어 Near Reference Far Reference By Value BASIC everything - - FORTRAN - everything - C Near array Far array 기타 PASCAL VAR, CONST VAR, CONST 기타

30 어셈블리어와 상위레벨 언어의 링킹(7) Protected Mode Intel 80286 이상 NEAR 호출 FAR 호출
31 16 8 15 Protected Mode Intel 이상 NEAR 호출 EIP(32비트)가 반환 주소로서 스택에 저장됨 FAR 호출 selector(16비트)와 EIP 값이 스택에 저장됨. EAX AX CS AH AL SS EBX BX BH BL DS ECX CX ES CH CL FS EDX DX DH DL GS EBP BP Segment Registers ESI SI 31 16 EFLAGS EDI DI FLAGS EIP ESP SP IP Status Registers General Registers

31 어셈블리어와 상위레벨 언어의 링킹(8) ; VOID outportb(UWORD PortNo, UBYTE Value)
; Write a value to a specified port. PUBLIC outportb outportb PROC NEAR PUSH EBP MOV EBP,ESP PUSH EAX PUSH EDX MOV DX,[EBP+8] ; Get the port. MOV AL,[EBP+12] ; Get the value. OUT DX,AL ; Output the value to the port. POP EDX POP EAX POP EBP RET outportb ENDP Value SP+12 Port SP+8 EIP SP+4 EBP SP

32 입력장치 - 키보드 키보드 프로그래밍 기초 BIOS의 이용 키보드 인터럽트 핸들러 키보드 컨트롤러의 제어 프로그래밍 실습
16H 함수 BIOS 변수 키 버퍼의 관리 키보드 인터럽트 핸들러 키보드 컨트롤러의 제어 프로그래밍 실습

33 키보드 프로그래밍 기초 (1) 키보드에서 프로그램까지 스캔 코드(scan code) 변환 Make코드와 break 코드
키가 눌리면, 키의 위치를 식별하는 전기 신호가 발생되며, 이 신호는 키보드 내부의 프로세서(i8042)에 의해 스캔 코드로 변환됨 Make코드와 break 코드 key press(“make”), key release(“break”) 모두에 대해 스캔 코드가 발생됨 break 코드에 대해서는 7번 비트가 설정됨

34 키보드 프로그래밍 기초 (2) 키보드에서 프로그램까지(계속) PC 키보드 ROM-BIOS 키보드 핸들러
키보드는 IRQ 1 하드웨어 인터럽트를 사용 IRQ1은 09H 인터럽트를 발생시킴 키보드 핸들러가 스캔코드를 읽어 들이고 ASCII로 변환하여 키보드 버퍼에 저장 키보드 I/O 포트 주소 : 60H 스캔 코드 / ASCII 코드 변환 256 문자로 구성되는 extended ASCII 문자 집합을 이용 응용 프로그램은 키보드 버퍼로부터 문자들을 읽어 올 수 있음 (ROM BIOS 인터럽트 16H) PC 키보드 PC/XT 와 AT 키보드 : 83 key, 84 key MF-II 키보드 : 101 key(US), 102 key(European)

35 BIOS의 이용 - 16H 함수 (1) 인터럽트 16H 함수들 00H 함수 : 키보드 읽기
10H 함수와 비슷 / 83-key 키보드상의 문자들만을 지원 01H 함수 : 버퍼에 키가 존재하는지 검사 11H 함수와 비슷 / 83-key 키보드상의 문자들만을 지원 02H 함수 : 현재의 <Shift> 상태를 AL에 리턴

36 BIOS의 이용 - 16H 함수 (2) 인터럽트 16H 함수들 (계속) 10H 함수 : 키보드 읽기
키보드 버퍼로부터 문자를 읽어서 AL(ASCII)과 AH(스캔코드)에 반환 버퍼가 비어 있는 경우, 키가 입력될 때까지 기다림 11H 함수 : 버퍼에 키가 존재하는지 검사 버퍼에 키가 존재하면 zero flag를 클리어하고, 키값을 AL/AH에 반환 버퍼에 키가 존재하지 않으면 zero flag를 설정하고, 바로 반환

37 BIOS의 이용 - 16H 함수 (3) 인터럽트 16H 함수들 (계속)
12H 함수 : 현재의 <Shift> 상태를 반환 키보드 shift 상태를 AL과 AH에 반환 / AL은 02H와 동일 AH에는 확장 shift 상태값 반환

38 BIOS의 이용 - BIOS 변수 BIOS 키보드 인터럽트 변수들
BIOS는 키보드 인터럽트 핸들러(09H)와 키보드 함수(16H)를 위해 8개의 변수를 관리

39 BIOS의 이용 - 키 버퍼의 관리

40 키보드 인터럽트 핸들러 키보드 인터럽트 핸들러 09H 인터럽트에 대한 핸들러 루틴 역할
<Shift> 처리 <Caps lock>, <Scroll lock>, <Num lock> 처리 및 LED on/off <Print Screen> 처리 : 05H 인터럽트 발생 모니터 프로그램에서는 IRQ1이 21H 인터럽트로 재배치되어 있음

41 키보드 컨트롤러의 제어 (1) 키보드 컨트롤러의 제어
키보드 컨트롤러로는 i8048(XT), i8042(AT, 386, 486) 프로세서가 사용됨 키보드 컨트롤러는 상태 레지스터, 입력 버퍼, 출력 버퍼로 구성 입출력 버퍼는 60H 번지로 접근 입력버퍼로는 64H 번지도 사용될 수 있음

42 키보드 컨트롤러의 제어 (2) 키보드 컨트롤러의 제어 (계속) 상태 레지스터 (64H)

43 키보드 컨트롤러의 제어 (3) 키보드 컨트롤러의 제어 (계속) 키보드에 바이트 데이터를 보내는 절차

44 키보드 컨트롤러의 제어 (4) 키보드 컨트롤러의 제어 (계속) LED 제어 0EDH 명령 코드 LED 상태 바이트
자료 및 예제 참조

45 프로그래밍 실습 (1) 키보드 인터럽트 핸들러의 구현 키보드 인터럽트 21H에 대한 핸들러의 구현
Shift키에 따른 대소문자 처리 Caps Lock, Scroll Lock, Num Lock LED 처리 입력된 키값은 키보드 버퍼에 저장 키보드 버퍼는 링버퍼, head 및 tail 포인터로 구성 main 함수는 loop를 돌며 키보드 버퍼에 새로운 키가 입력되었는지를 검사 만약 새로운 키가 있다면 이를 읽어서 화면에 출력

46 프로그래밍 실습 (2) 키보드 인터럽트 핸들러의 구현 (계속) 주의 사항
핸들러 및 main loop 에서 포인터를 조작하거나 검사할 때는 반드시 critical section으로 보호할 것 Critical section은 sti와 cli명령을 이용하여 구현가능


Download ppt "Lecture #12 인터럽트 Interrupt."

Similar presentations


Ads by Google