인터럽트 내부 동작
시스템 콜 인터럽트
시스템 콜을 실행하기 위해서는 강제로 코드에 인터럽트 명령을 넣어, CPU에게 실행시켜야 한다.
- 시스템 콜 실제 코드
- eax 레지스터에 시스템 콜 번호를 넣는다. ( 시스템 콜은 각각의 번호가 있음 )
- ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣는다.
- 소프트웨어 인터럽트 명령을 호출하면서 0x80(인터럽트 번호 - 시스템콜은 0x80 으로 정해둠) 값을 넘겨 준다.
- cf ) 무조건 마지막에 CPU 제공하는 op code 중 int 명령어 들어감
- cf ) 다른 인터럽트와 다르게 ( 원래 인터럽트는 외부에서 코드와 별개로 실행) 코드안에서 강제로 실행
인터럽트와 시스템 콜
● 시스템콜 인터럽트 명령을 호출하면서 0x80(인터럽트 값) 값을 넘겨줌
1. CPU는 사용자 모드를 커널 모드로 바꿔줌
2. IDT(Interrupt Descriptor Table) 에서 0x80에 해당하는 주소(함수,코드)를 찾아서 실행
→ IDT 에는 인터럽트 번호가 있고 그에 맞는 주소(함수,코드)가 매칭
3. system_call() 함수에서 eax 에 시스템콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동
4. 해당 시스템콜 함수 실행(커널모드에서 실행) 후, 다시 커널모드에서 사용자모드로 변경하고 다시 해당 프로세스 다음 코드 진행.
사용자 / 커널 모드와 프로세스, 인터럽트
- 사용자/커널 모드와 프로세스
: 프로세스가 사용자모드에서 실행하다가 운영체제 코드가 필요할 때 시스템 콜을 통해 커널모드로 들어간다.
인터럽트와 IDT
- 인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있다.
- 어디에 ? IDT에 기록(이벤트 번호와 실행코드의 주소(함수가 저장되어 있는 코드의 주소)가 매핑 )
- 언제 ? 컴퓨터 부팅 시 운영체제가 IDT 기록
- 어떤 코드 ? 운영체제 내부코드 (커널모드 / 커널 영역)
cf. 커널영역 : 커널모드에서 실행되는 코드들이 저장되어 있는 영역(특정한 메모리 공간)
→ 인터럽트가 걸리면 CPU에서 무조건 IDT 가서 이벤트 번호에 맞는 주소의 코드 실행
정리
1. 인터럽트 발생시, IDT 확인
2. 시스템콜 인터럽트는 0x80 번호가 미리 정의
3. 인터럽트 0x80에 해당하는 운영체제 코드는 system_call() 이라는 함수 (리눅스의 경우)
4. 즉, IDT 에는 0x80 -> system_call() 와 같은 정보가 기록되어 있음
리눅스의 예
- 0~30 : 예외상황 인터럽트( 내부/스프트웨어 인터럽트) -> 일부는 정의안된 채로 남겨져 있음
- 32~47 : 하드웨어 인터럽트 ( 주변장치(ex. 마우스,키보드,저장매체 등) 종류/갯수에 따라 변경 가능 )
- 128 : 시스템 콜 ( 0x80 을 10 진수로 하면 128 )
→ 인터럽트는 번호가 있고 그 번호에 해당하는 코드들이 있고, 그 코드들이 운영체제이 있고, 그 번호와 코드들의 정보들이 IDT에 있다. 그래서 인터럽트가 발생하면 맨 처음 참조하는 테이블이 IDT이다.
인터럽트와 프로세스
1. 프로세스 실행 중 인터럽트 발생
2. 현 프로세스는 실행 중단
3. IDT 가서 그 번호에 해당하는 함수 실행 (커널모드에서)
4. 현 프로세스 재 실행
인터럽트와 스케쥴러
선점형 스케쥴러 구현 예
: 수시로 타이머 인터럽트 발생
→ 운영체제가 타이머 인터럽트 발생 횟수를 기억해서 5번 타이머 인터럽트 발생하면, 현재 프로세스를 다른 프로세스로 바꿔준다.
제로베이스 컴퓨터 공학 전공자 따라잡기 강의 시청 후 정리한 내용입니다.