리눅스 커널의 이해 중에서 4장. 인터럽트와 예외 이성현 네트워크 실험실.

Slides:



Advertisements
Similar presentations
Lee Hoon Copyright(c) 2008 LeeHoon All rights reserved. 제7강제7강.
Advertisements

Embedded System 2009 년 11 월 16 일 Embedded Computer1 ● Hardware 와 Software 가 조합되어 특정한 복적을 수행하는 시스템 ● 특정한 기능을 수행하도록 Micro Processor 와 I/O Device 를 내장하며,
1/15 16 기 장영일 Ext File System. 2/15 처음에 Minix 가 사용되었다 ( 제약사항 ) 최대로 저장할 수 있는 파일의 크기 – 64M : 16bit 정수로 블록 주소 지정 -> 1024( 블록 기본 사이즈 ) * (2^16) = 64M.
J-Stream part1 (Software streaming service) ▪ 팀명 : Jukdori ▪ 팀원 : 16 th 윤병호 (PL) 15 th 송인규 16 th 김영진.
Embedded System Hardware와 software가 조합되어 특정한 목적을 수행하는 시스템
키보드 보안 순천향대학교 정보보호학과 임강빈 교수.
When Poll is Better than Interrupt
CDMA SW 구조 AIITQC 서울본원교육장 양 종 윤.
홍보출판 위원회 출판국 2010년 사역 계획서 발표자 : 출판국 국장 / 박수만권사 일시: 2010년 01월 17일(일) 1.
2002년 낙동고 4기 동기회 모임 낙동고 4기 동기회.
하드웨어특강 (중요장치) 작성자 : 오창중.
인터럽트 종류 인터럽트 요구시 I/O장치 인식 방법
역대 정부개편의 교훈과 새로운 정부조직개편의 방향
임베디드 시스템 개론 8. 임베디드 시스템 개발 환경 8주차 강의 자료 Embedded System Lab.
Part01. 시스템 해킹을 위한 기초 지식 Chapter01. 운영체제에 대한 이해
2장 마이크로프로세서 구성요소 Slide 1 (of 19).
제 2장 컴퓨터 구조.
프로그램 제어 분기(branch)와 점프(jump) 명령어 PC의 값의 변경 순차적인 프로그램의 진행순서가
9장 가로채기(Interrupt) Slide 1 (of 15).
13장. 시스템 버스 다루는 내용 시스템 버스의 개념 다중버스 계층 구조 버스 중재.
마이크로프로세서 메모리 및 입출력장치 인터페이스
김종찬 김정석 이상미 임성규 담당 교수님 최병수 교수님
체위변경과 이동 요양보호 강사 : 이윤희.
제7장 버스와 입출력.
제6장 FUSING.
2 Part 전자계산기 구조 1. 논리 회로 2. 자료 표현 및 연산 3. 명령어 및 프로세서 4. 명령 수행 및 제어 5.
Lecture #12 인터럽트 Interrupt.
System Call Linux Kernel 수업 3번째.
3장 MPU 내부구조 Slide 1 (of 28).
임베디드 하드웨어 Lecture #6.
컴퓨터 과학 개론 √ 원리를 알면 IT가 맛있다 컴퓨터 과학도를 위한 첫 전공서 ehanbit.net.
PCI가 어렵울 거라는 생각을 지금부터 버리도록 합시다.
컴퓨터 구조학 정보보호학과.
컴퓨터 구조론 2001년 10월 22일 발표자 황영선.
임베디드 운영체제 (리눅스 중심) Lecture #2.
Linux를 이용한 Embedded 장비 개발
리눅스 커널의 이해 중에서 1장. 소개 이원구 네트워크 실험실.
Software Exploit and Kernel Protection
Network Programming 가상 스토리지 기술 박치성 손창빈.
컴퓨터 구조.
4장. 컴퓨터 시스템의 구성과 기능 다루는 내용 컴퓨터 분해를 통한 본체 살펴보기 컴퓨터 구성요소 컴퓨터의 기능
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
9장. 중앙처리 장치의 조직과 기능 다루는 내용 컴퓨터 본체에서 CPU의 위치 살펴보기 CPU의 성능, 기능, 조직
2장 운영 체제의 개요 운영체제의 개념 운영체제의 유형 운영체제의 발전 과정 운영체제의 구성 운영체제 서비스 시스템 구조
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
Operating System 5주차 - System Call Analysis -
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
제3장 8086 프로세서의 내부구조.
제 2장 컴퓨터동작의 기본 개념.
Xen and the Art of Virtualization
2011년 하반기 VIP투자자문 인재채용 안내
Buffer Overflow
신 윤 호 ㈜엘림에듀 초등사업본부장, 중앙대학교 체육학박사
운영체제 (Operating Systems) (Memory Management Strategies)
Windows7 – 글꼴, 시스템, 장치관리자, 전원옵션
컴퓨터의 구성 (하드웨어) 기술ㆍ가정 1학년 Ⅴ. 컴퓨터와 정보처리 〉 1.컴퓨터의 구조와 원리 (2 / 5) 1. 제작의도
제7강 PC정비사 1급(필기) Lee Hoon Copyright(c) 2008 LeeHoon All rights reserved.
리눅스 커널의 이해 중에서 9장. 시그널 Database 실험실 안 병 규.
Lecture #6 제5장 기억장치 (1).
9장. 중앙처리 장치의 조직과 기능 다루는 내용 컴퓨터 본체에서 CPU의 위치 살펴보기 CPU의 성능, 기능, 조직
제 3 장 운영체제와 입출력 방식 Section 1 입출력 기능 Section 2 입출력 방식 Section 3 입출력 버퍼링
8. 리눅스의 내부 군자삼락 [君子三樂] 청출어람이청어람 [ 靑出於藍而靑於藍 ] Why Linux ?
6장: 기억장치 대화성, 멀티미디어에 대한 기반들.
화 일 구 조 Chapter 3 화일의 입출력 제어.
양초 한 자루의 과학 과학영재교육 전공 김 연 주 류 은 희 이 상 희.
임베디드 하드웨어 Lecture #6.
Virtual Machine Management
Lecture 7 7-Segment LED controller using u-controller
Presentation transcript:

리눅스 커널의 이해 중에서 4장. 인터럽트와 예외 이성현 네트워크 실험실

목 차 Part I : 인터럽트와 예외 Part II : 리눅스에서의 인터럽트와 예외 Part III : Q & A

Part I : 인터럽트와 예외

인터럽트와 예외 인터럽트(Interrupt) 정의 분류 프로세스가 실행하는 명령의 순서를 바꾸는 사건 하드웨어가 발생시키는 전기적 시그널 분류 동기 인터럽트(Synchronous Interrupt) 명령어 실행 중 CPU 제어 유닛(Control Unit)이 생성 명령어 실행 종료 후 인터럽트 발생 예외(Exception) 비동기 인터럽트(Asynchronous Interrupt) 다른 하드웨어 장치가 CPU 클럭 시그널과 상관없이 생성

인터럽트와 예외 인터럽트 시그널 역할 역할 동작 프로세스가 정상적인 제어 흐름 밖의 코드로 방향을 바꾸는 방법을 제공 cs eip address Interrupt Signal CPU Program Counter Kernel Mode Stack

인터럽트와 예외 인터럽트 시그널 역할 요구 조건 발생한 인터럽트의 빠른 처리 방해 받지 않는 범위내 작업 지연 인터럽트의 중첩 허용 임계 영역(critical region) 축소

인터럽트와 예외 인터럽트와 예외 인터럽트 예외 Maskable Interrupt NonMaskable Interrupt INTR 핀으로 전달 입출력 장치에서 발생하는 모든 IRQ NonMaskable Interrupt 하드웨어 고장같은 몇몇 중요한 사건 예외 프로세스가 감지하는 예외 Fault 예외 처리 후 같은 명령어로 복귀 Trap 예외 처리 후 다음 명령어로 복귀 디버깅 용도

인터럽트와 예외 인터럽트와 예외 예외 프로세스가 감지하는 예외 프로그래밍에 의한 예외 Abort 문제가 발생한 프로세스를 강제로 종료 프로그래밍에 의한 예외 프로그래머의 요구에 의해 발생 Overflow 또는 Bound 명령어가 검사 조건이 맞지 않을 경우 발생 제어 유닛이 예외를 trap으로 처리 software Interrupt라고도 함 용도 시스템 콜 디버깅

인터럽트와 예외 인터럽트와 예외 벡터 벡터(Vector) 0 ~ 255사이의 숫자로 구별 NonMaskable Interrupt와 예외 벡터 번호는 고정 Maskable Interrupt와 벡터 번호는 IC(Interrupt Controller)를 프로그래밍 하여 변경 가능 NonMaskable Interrupt Maskable Software 31 32 47 48 255

인터럽트와 예외 IRQ와 인터럽트 IRQ(Interrupt ReQuest) IC 동작 IC(Interrupt Controller)와 입력핀으로 연결 IC 동작 IRQ 선을 감시, 시그널 발생시 이를 검사 시그널일 경우 일련 동작 수행 IRQ 선을 감시하는 단계로 되돌아감

인터럽트와 예외 IRQ와 인터럽트 IC I/O Port 1. 벡터 변환 Interrupt Signal 3. CPU INTR 핀으로 시그널 전송 4. 시그널 수신 확인 5. CPU INTR 0

인터럽트와 예외 IRQ와 인터럽트 PIC(Programmable Interrupt Controller) 8259A 슬레이브 10 11 12 13 14 15 1 3 4 5 6 7 INT IRQ 2 [그림 4-1] 두 8259A PIC를 중첩하여 연결하기(Page. 175)

인터럽트와 예외 예외 # 예외 예외 핸들러 시그널 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - 31 나누기 에러 디버그 NMI 중지점 오버플로우 범위 검사 잘못된 연산 코드 장치를 사용할 수 없음 이중 폴트 보조프로세스 세그먼트 범람 잘못된 TSS 세그먼트가 존재하지 않음 스택 세그먼트 일반 보호 페이지 폴트 인텔이 예약함 부동소수점 에러 정렬검사 개발용 예약 divide_error() debut() nmi() int3() overflow() bounds() invalid_op() device_not_available9) double_fault() coprocessor_segment_overrun() invalid_tss() segment_not_present() stack_segment() general_protection() page_fault() 없음 coprocessor_error() alignment_check() SIGFPE SIGTRAP SIGSEGV SIGILL SIGBUS

인터럽트와 예외 인터럽트 디스크립터 테이블 IDT(Interrupt Descriptor Table) 인터럽트, 인터럽트 핸들러, 예외 벡터, 예외 핸들러 연동 각 엔트리는 인터럽트 벡터, 예외 벡터와 대응 8Byte 디스크립터 IDT 종류 태스크 게이트(Task gate) 인터럽트 시그널 발생히 대체 프로세스의 TSS 셀렉터 포함 리눅스에서는 사용하지 않은 인터럽트 게이트(Interrupt gate) 인터럽트나 예외 핸들러의 세그먼트 오프셋 포함 IF 플래그를 0으로 설정(Maksable Interrupt 발생 금지) 트랩 게이트(Trap gate) 인터럽트 게이트와 비슷 IF 플래그를 변경하지 않음

인터럽트와 예외 인터럽트 디스크립터 테이블 [그림 4-2] 게이트 디스크립 형식(Page. 180) p RESERVED L RESERVED SEGMENT SELECTOR OFFSET(0 - 15) 31 30 29 28 27 26 25 24 22 21 20 19 18 23 12 11 10 9 8 7 3 2 1 6 5 4 17 16 15 14 13 63 62 61 60 59 58 57 56 54 53 52 51 50 55 44 43 42 41 40 39 35 34 33 32 38 37 36 49 48 47 46 45 트랩 게이트 디스크립터 OFFSET(16-31) 인터럽트 TSS SEGMENT SELECTOR 태스크 [그림 4-2] 게이트 디스크립 형식(Page. 180)

인터럽트와 예외 하드웨어적인 인터럽트와 예외 처리 제어 유닛 동작 인터럽트 벡터 확인 IDT에서 해당 벡터를 읽어 들임 세그먼트의 기본 주소 지정 인터럽트 발생 여부 검사 권한 수준 변화 확인 예외 발생 명령의 재수행이 가능하도록 설정 레지스터의 내용을 스택에 저장 하드웨어 에러 코드를 스택에 저장 레지스터를 IDT의 세그먼트와 오프셋으로 지정

인터럽트와 예외 하드웨어적인 인터럽트와 예외 처리 예외 핸들러와 인터럽트 핸들러의 중첩 실행 제어권 이양 커널 제어 경로 스택으로부터 레지스터 값 복구 권한 수준 확인 권한 수준의 변경이 있을 경우 연계 스택으로 복구 레지스터 값 검사 후 변경 값 삭제 예외 핸들러와 인터럽트 핸들러의 중첩 실행 커널 제어 경로 커널 모드에서 인터럽트와 예외를 처리하는 일련의 명령어 경로 첫번째 명령어 : 커널 모드 스택에 레지스터 내용 저장 마지막 명령어 : 레지스터의 내용을 복구, CPU를 사용자 모드로 돌림 커널 제어 경로 중첩 이유 프로그래밍 가능한 인터럽트 컨트롤러와 장치 컨트롤러의 처리량 증가 우선 순위가 없는 인터럽트 모델 개발

인터럽트와 예외 인터럽트 디스크립터 테이블 초기화 IDT 초기화 사용자 모드 프로세스에서 int 명령으로 흉내낸 불법 인터럽트와 예외를 차단 DPL 필드를 0으로 설정 프로세스가 불법 인터럽트와 예외를 발생시키려고 하면 ‘일반보호’ 예외 발생 사용자 모드 프로세스가 프로그래밍된 예외 발생 DPL 필드를 3으로 설정

Part II : 리눅스에서의 인터럽트와 예외

리눅스에서의 인터럽트와 예외 인터럽트와 트랩, 시스템 게이트 리눅스에서의 IDT 인터럽트 게이트 시스템 게이트 트랩 게이트 사용자 모드 프로세스에서 접근할 수 없음 게이트의 DPL 필드가 0으로 설정 모든 리눅스 인터럽트 핸들러는 인터럽트 게이트를 통해서만 실행 가능 인터럽트 핸들러를 커널 모드로 제한 시스템 게이트 사용자 모드 프로세스에서 접근할 수 있음 게이트의 DPL 필드가 3으로 설정 벡터 3, 4, 5, 128에 해당하는 예외 핸들러는 시스템 게이트를 통해서 실행 int3, into, bound, int 0x08 트랩 게이트 시스템 게이트에서 실행되는 예외 핸들러를 제외한 모든 예외 핸들러 수행

리눅스에서의 인터럽트와 예외 인터럽트와 트랩, 시스템 게이트 함수(게이트 -> IDT) set_intr_gate(n, addr) n번째 IDT 엔트리에 인터럽트 게이트 삽입 DPL 필드를 0으로 설정 세그먼트 셀렉터 -> 커널 코드의 세그먼트 셀렉터 오프셋 필드 -> 인터럽트 핸들러 주소 addr set_system_gate(n, addr) n번째 IDT 엔트리에 트랩 게이트 삽입 DPL 필드를 3으로 설정 오프셋 필드 -> 예외 핸들러 주소 addr set_trap_gate(n, addr)

리눅스에서의 인터럽트와 예외 임시적인 IDT 초기화 ignore_int() 인터럽트 핸들러 실행 동작 절대 실행되어서는 안됨 레지스터의 일부 내용을 스택에 저장 printk() 함수 호출 ‘Unknown interrupt’ 시스템 메시지 출력 스택에서 레지스터 내용을 복구 iret 명령러를 실행 인터럽트된 프로그램으로 복귀 절대 실행되어서는 안됨 하드웨어적인 문제나 커널 문제를 의미

리눅스에서의 인터럽트와 예외 핸들러 흐름도 system_call restore_all tracesys_exit ret_from_sys_call tracesys badsys ret_with_reschedule restore_all ret_from_intr handle_softirq ret_from_exception reschedule signal_return v86_signal_return

리눅스에서의 인터럽트와 예외 예외 핸들링 목적 표준 구조 프로세스에 비정상적인 상황을 알려주기 위한 목적의 시그널 송신 요구 페이징(demand paging) 처리 표준 구조 커널 모드 스택에 레지스터 내용의 대부분을 저장 C 함수를 사용한 예외 처리 ret_from_exception() 함수를 호출하여 핸들러에서 빠져나오기

리눅스에서의 인터럽트와 예외 예외 핸들러를 위해 레지스터 저장 예외 핸들러에서 복귀 예외 발생 시 error_code 제어 유닛이 자동으로 스택에 하드웨어 에러 코드를 넣지 않으면, 해당 어셈블리어 코드가 push $0 명령어를 추가하여 스택에 빈 값 저장 C 함수의 주소를 스택에 저장 함수명은 예외 핸들러 이름 앞에 do_ 접수어가 붙음 error_code ‘장치를 사용할 수 없음’ 예외를 제외한 모든 예외 핸들러에 사용 예외 핸들러에서 복귀 ret_from_exception() 스택에 저장한 사용자 모드 레지스터 주소와 하드웨어 에러 코드를 스택에서 꺼낸 후, jmp 명령어 수행

리눅스에서의 인터럽트와 예외 eax es 초기 레지스터 edi ecx esi ebx ds eflag 함수 매개변수 +1 do_handler_ name() 주소 es 초기 레지스터 edi ecx esi ebx ds 레지스터 스택 1. 레지스터를 스택에 저장 3. 에러 코드를 eax에 저장 4. ecx를 함수 주소로 설정 5. es 내용을 스택에 저장 eflag 2. 순서 플래그 DF 삭제 +1 6. ds, es를 커널 데이터 세그먼트 셀렉터로 설정 7. ebx 현재 프로세스 디스크립터로 설정 함수 매개변수 8. 에로코드, 레지스터 저장 위치 스택에 저장 9. 함수 호출 esp+36 esp+32

리눅스에서의 인터럽트와 예외 예외 핸들러 호출 ret_from_exception() die_if_kernel() 프로세스의 시그널 수신 여부 확인 die_if_kernel() 커널 모드에서의 예외 발생 검사, do_exit() 호출 현재 프로세스 강제 종료 die_if_no_fixup() die() 호출 전에 시스템 콜에 잘못된 인자가 넘겨졌는지 검사 동적 주소 검사 수행 장치를 사용할 수 없음 부동 소수점 레지스터를 실제로 복구하는 작업을 미루기 위해 사용 페이지 폴트 프로세스에 새로운 페이지 프레임을 할당하는 작업을 미루기 위해 사용

리눅스에서의 인터럽트와 예외 인터럽트 핸들링 예외 인터럽트 프로세스에 시그널을 보내 처리 예외 발생시 프로세스가 시그널을 받을 때까지 미루어짐 예외를 빠르게 처리 인터럽트 인터럽트와 관련된 프로세스가 중단된 후 한참 후 또는 관련없는 프로세스가 실행 중일 경우 시그널이 도착하는 경우가 많음 현재 수행중인 프로세스에 시그널을 보내면 안됨 하드웨어적 제한에 의해 IRQ 선 공유 인터럽트 벡터만으로 알 수 없음 ISR(Interrupt Service Routine) 사용

리눅스에서의 인터럽트와 예외 인터럽트 핸들링 ISR(Interrupt Service Routine) 처리 작업 분류 해당 IRQ 장치 확인 해당 장치의 인터럽트 작업 수행 처리 작업 분류 중요함 PIC에 인터럽트 응답, PIC 재 프로그래밍, 장치와 프로세스가 동시에 접근하는 자료 구조 갱신 Maskable Interrupt를 금지한 상황에서 즉시 수행 중요하지 않음 프로세스에만 접근하여 자료 구조를 갱신하는 작업(키보드) 인터럽트 핸들러 내의 인터럽트가 허용된 상태에서 즉시 수행 중요하지 않으며 미룰 수 있음 버퍼 내용을 프로세스 주소 공간으로 복사하는 작업(키보드 -> 터미널 핸들러) Bottom half 함수를 이용하여 수행

리눅스에서의 인터럽트와 예외 인터럽트 핸들링 수행 작업 IRQ 값과 레지스터 내용을 커널 모드 스택에 저장 PIC에 응답 시그널 송신, 다음 인터럽트를 받아들일 수 있음 IRQ를 공유하는 모든 장치와 연관된 ISR 실행 ret_from_intr() 주소로 점프하여 종료

리눅스에서의 인터럽트와 예외 인터럽트 핸들링 IRQn PIC IRQn_interrupt() do_IRQ(n) 인터럽트 서비스 루틴 1 서비스 루틴 2 INT 장치 1 하드웨어 IDT[32+n] IRQn [그림 4-3] 인터럽트 핸들링(Page. 196)

리눅스에서의 인터럽트와 예외 인터럽트 벡터 특정 장치의 정적 IRQ 연결 장치를 위한 IRQ 선택 방법 Interval Timer : IRQ0 Slave 8259A PIC : IRQ2 External Mathematics Coprocessor : IRQ13 장치를 위한 IRQ 선택 방법 장치를 설치할 때 실행하는 유틸리티 프로그램으로 선택 사용자가 사용 가능한 IRQ 번호를 선택하거나, 스스로 사용 가능한 값을 결정 시스템을 시작할 때 실행하는 하드웨어적 프로토콜 주변 장치에서 인터럽트 선의 사용을 선언 장치간의 충돌을 줄이는 쪽으로 결정 PCI 표준과 호환되는 장치의 경우 pci_read_config_byte() pci_write_config_byte()

리눅스에서의 인터럽트와 예외 인터럽트 벡터 입출력 장치에 IRQ를 할당하는 예 IRQ INT 하드웨어 장치 1 2 3 4 6 1 2 3 4 6 8 11 12 13 14 15 32 33 34 35 36 38 40 43 44 45 46 47 타이머 키보드 PIC 중첩(cascading) 둘째 직렬 포트 첫째 직렬 포트 플로피 디스크 시스템 시계 네트워크 인터페이스 PS/2 마우스 수학 보조프로세스 EIDE 디스크 컨트롤러의 첫째 체인(chain) EIDE 디스크 컨트롤러의 둘째 체인

리눅스에서의 인터럽트와 예외 IRQ 자료 구조 handler action next irq_desc irq_desc_t hw_interrupt_type irqactionc i 63 [그림 4-4] IRQ 디스크립터(Page. 198)

리눅스에서의 인터럽트와 예외 IRQ 자료 구조 irq_desc_t 디스크립터 status handler action depth IRQ 선을 처리하는 PIC 회로를 나타내는 hw_interrupt_type 디스크립터에 대한 포인터 action IRQ가 발생했을 때 호출하는 인터럽트 서비스 루틴, irqaction 디스크립터 리스트의 첫째 항목을 가리킴 depth IRQ 선을 허용 : 0으로 설정 IRQ 선을 금지 : 양수로 설정 disable_irq() 함수를 호출 시 필드 증가 enable_irq() 함수를 호출 시 필드 감소

리눅스에서의 인터럽트와 예외 IRQ 자료 구조 hw_interrupt_type 디스크립터 irqaction 디스크립터 특정 PIC 회로에 동작하는 입출력 함수에 대한 포인터 지칭 irqaction 디스크립터 handler 입출력 장치의 인터럽트 서비스 루틴을 가리킴, 같은 IRQ를 공유할 수 있도록 하는 핵심 필드 flags 플래그 집합 내의 IRQ 선과 입출력 장치 사이와의 관계 설명 name 입출력 장치명 dev_id 입출력 장치를 구분하는 주 번호와 부 번호 next irqaction 디스크립터의 다음 항목을 가리킴

리눅스에서의 인터럽트와 예외 인터럽트 핸들러를 위한 레지스터 저장 레지스터 저장 인터럽트 핸들러에서 처음으로 해야 하는 작업 인터럽트에 해당하는 값을 스택에 저장 SAVE_ALL 제어 유닛이 자동으로 저장한 레지스터 외에 인터럽트 핸들러에서 사용하는 모든 레지스터를 스택에 저장 ds, es를 커널 데이터 세그먼트로 지정 ret_from_intr() 주소로 점프

리눅스에서의 인터럽트와 예외 do_IRQ() 함수 인터럽트와 연계된 모든 인터럽트 서비스 루틴을 실행하기 위해 호출하는 함수 호출시 스택 저장 내용 do_IRQ()를 마치고 돌아갈 주소 SAVE_ALL로 저장한 레지스터 그룹 인코딩된 IRQ 번호 인터럽트 발생시 제어 유닛이 자동으로 저장한 레지스터 void do_IRQ(struct pt_regs regs)

리눅스에서의 인터럽트와 예외 do_IRQ() 함수 14 자동 저장된 레지스터 인코딩된 IRQ 9 SAVA_ALL 저장 레지스터 9 14 pt_regs

리눅스에서의 인터럽트와 예외 인터럽트 서비스 루틴 매개 변수 irq dev_id regs IRQ 번호 ISR이 다수의 IRQ 선을 다룰 수 있도록 함 dev_id 장치 식별자 ISR이 여러 장치를 구별할 수 있도록 함 regs 인터럽트가 발생한 직후에 저장한 레지스터를 포함한 커널 모드 스택 영역을 가리키는 포인터 ISR이 인터럽트된 커널 제어 경로의 실행 컨텍스트에 접근 할 수 있도록 함

리눅스에서의 인터럽트와 예외 하반부(Bottom half) 하반부 하반부가 실행되는 경우 우선 순위가 낮은 함수 커널이 실행하기 좋은 시간이 되기를 기다리는 함수 인터럽트 처리와 관련 하반부가 실행되는 경우 커널이 시스템 콜 처리를 끝마쳤을 때 커널이 예외 처리를 끝마쳤을 때 커널이 인터럽트 처리를 끝마쳤을 때 커널이 schedule() 함수를 실행했을 때

리눅스에서의 인터럽트와 예외 하반부(Bottom half) bh_base Table 하반부 핸들러를 모아서 관리하기 위한 테이블 하반부에 관한 포인터 배열로 구성 32개의 엔트리 포함 가능 하반부 각 유형은 엔트리 하나와 대응 리눅스에서는 절반 가량을 사용

리눅스에서의 인터럽트와 예외 리눅스 하반부 하반부 주변 장치 AURORA_BH CM206_BH CONSOLE_BH CYCLADES_BH DIGI_BH ESP_BH IMMEDATE_BH ISICOM_BH JS_BH KEYBOARD_BH MACSERIAL_BH NET_BH RISCOM8_BH SCSI_BH SERIAL_BH SPECIALIX_BH TIMER_BH TQUEUE_BH 오로라(Aurora)의 멀티포트 카드(SPARC) CD-ROM 필립스/ LMS cm206 디스크 가상 콘솔 사이클레이드(Cyclades)의 Cyclom-Y 직렬 멀티포트 디지보드(DigiBoard)의 PC/Xe 헤이스(Hayes)의 ESP 직렬 카드 즉시 실행 작업큐 멀티테크(MultiTech)의 ISI 카드 조이스틱(PC IBM 호환) 키보드 파워 매킨토시의 직렬 포트 네트워크 인터페이스 RISCom/8 SCSI 인터페이스 직렬 포트 스페셜릭스(Specialix)의 IO8+ 타이머 정기적인 작업큐

리눅스에서의 인터럽트와 예외 하반부(Bottom half) 하반부 상태 활성화 프로세스 상태에 의존적 활성화 이전에 초기화가 필요 init_bh() 함수 사용하여 초기화 bh_action() 함수에서 bottom half 처리 remove_bh() 함수가 제거

리눅스에서의 인터럽트와 예외외 하반부(Bottom half) 하반부 확장 도입 이유 접근 방향 확장 인터럽틍 처리와 관련한 몇 안되는 함수가 작업을 미루는 방식으로 처리 접근 방향 인터럽트를 처리하는 함수뿐만 아니라 일반 커널 함수도 하반부로 실행될 수 있게 한다. 하반부 하나에 커널 함수 하나 대신 여러 개가 연계될 수 있게 한다. 확장 작업 큐(task queue)로 표시 연결 리스트로 구성

리눅스에서의 인터럽트와 예외 하반부(Bottom half) 하반부 확장 *routine() sync next *data tq_struct NULL task_queue

리눅스에서의 인터럽트와 예외 IRQ 선의 동적 핸들링 동적 핸들링 request_irq() setup_x86_irq() free_irq() 인터럽트 공유 허용 error_code IRQ 리스트 활성화 irqaction 디스크립터 1.생성 2.초기화 3. 호출 4. 삽입 6. 중단 5. 검사 6. 수행 7. 제거 예 아니오

리눅스에서의 인터럽트와 예외 IRQ 선의 동적 핸들링 setup_x86_irq()함수 동작 다른 장치가 irq_nr IRQ를 사용하고 있는 지를 검사 있을 경우 : 양쪽 장치의 irqaction 디스크립터의 SA_SHIRQ 플래그 1로 설 정했는 지를 검사 사용할 수 없을 경우 : 에러코드 반환 새로운 irqaction 디스크립터를 irq_desc[irq_nr] -> action이 가리키는 목록의 끝에 추가 같은 IRQ를 공유하는 장치가 없으면 새로운 irqaction 디스크립터의 IRQ_DIS ABLED와 IRQ_INPROGRESS 플래그를 0으로 설정 PIC를 재 프로그래밍하여 IRQ 시그널이 확실한 허용상태로 있게 한다.

리눅스에서의 인터럽트와 예외 인터럽트와 예외에서 복귀 고려 사항 동시 실행 중인 커널 제어 경로의 수 하나밖에 없다면 CPU는 사용자 모드로 돌아가야 함 실행해야 할 활성화된 하반부 존재하면 실행 대기 중인 프로세스 전환 요구 존재하면 프로세스 전환, 그렇지 않으면 현재 프로세스에 제어권 양도 대기 중인 시그널 현재 프로세스에 시그널을 전달했으면 이를 처리 실행 함수 ret_from_intr() 인터럽트 핸들러 종료 ret_from_sys_call() 시스템 콜 종료 ret_from_exception() 예외 핸들러 종료

ret_with_reschedule: 리눅스에서의 인터럽트와 예외 ret_from_exception: 하반부? do_bottom_half() ret_from_sys_call: ret_from_intr: 커널 제어 경로가 중첩되어 있는가? 다시 스케쥴링 해야 하는가? 가상 v86 모드인가? schedule() save_v86_state() do_signal() 하드웨어 컨텍스트 복구 (RESTORE_ALL) 시그널이 대기중인가? 예 handle_bottom_half: 아니오 signal_return(): v86_signal_returnf: ret_with_reschedule: [그림 4-5] 인터럽트와 예외에서 복귀(Page. 214)

리눅스에서의 인터럽트와 예외 인터럽트와 예외에서 복귀 ret_from_intr() 함수 현재 프로세스 사용자 모드에서 수행 do_signal() ret_with_reschedule 커널 제어 경로 재 시작 예 아니오 RESTORE_ALL Macro ebx 중첩? cs eflags schedule() 디스크립터 주소 재 스케쥴? sigpending signal_return v86? save_v86_state() !0

리눅스에서의 인터럽트와 예외 인터럽트와 예외에서 복귀 ret_from_sys_call() 함수 bh_mask 하반부? bh_active do_bottom_half() ret_with_reschedule 예 아니오 ret_from_intr

리눅스에서의 인터럽트와 예외 인터럽트와 예외에서 복귀 ret_from_exception() 함수 bh_active bh_mask 하반부? bh_active ret_from_intr 수행 예 아니오

Reference 참고 웹 사이트 Understanding the LINUX KERNEL, O’REILLY Add-on Linux Kernel Programming, 글로벌 LINUX KERNEL INTERNALS , F1에프원 리눅스 매니아를 위한 커널 프로그래밍, 교학사 UNIX SYSTEM ADMINISTRAION BOOK, 홍릉과학 출판사 LINUX DEVICE DRIVERS, O’REILLY OS 제작의 정석, 가남사 Linux Core Kernel, Maxwell www.kldp.org www.kernelkorea.org

Part IV : Q & A