2021. 2. 21. 15:31ㆍComputer(인강)/운영체제
안녕하세요 bannavi에요^ㅅ^
오늘은 인터럽트 내부 동작에 대해서 살펴볼거에요
먼저 시스템 콜 실행에 대해서 먼저 살펴볼게요!
두-둥
뭐야뭐야 시스템콜도 인터럽트였어??^ㅅ^??
시스템콜도 내부적으로는 인터럽트 방식으로 처리를 한답니다.
시스템 콜 실행을 위해서는 강제로 인터럽트 명령을 넣어, CPU에게 실행시켜야 합니다.
시스템콜 실제 코드
1. eax 레지스터에 시스템 콜 번호를 넣고,
2. ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고,
3. 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줌
인터럽트와 시스템 콜(고급)
시스템콜 인터럽트 명령을 호출하면서 0x80값을 넘겨줌
1. CPU는 사용자 모드를 커널 모드로 바꿔줌
2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행함
3. system_call()함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동
4. 해당 시스템콜 함수 실행 후(커널모드에서), 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드 진행
사용자/커널 모드와 프로세스, 인터럽트
인터럽트와 IDT
인터럽트는 미리 정의되어 각각 번호(이벤트들은 각각의 번호가 있음)와 실행 코드를 가리키는 주소가 기록되어 있음.
- 이 코드가 어디에 써있는가? IDT(Interrupt Descriptor Table)에 기록(이벤트 번호: 실행 코드의 주소(함수))
-> 함수가 저장되어 있는 코드의 주소를 가리키는것
- 언제? 컴퓨터 부팅 시(컴퓨터 켤때) 운영체제가 기록
- 어떤 코드? 운영체제 내부 코드(커널모드, 커널 영역에 있는 내부코드)
뭔소린지 모르시겠죠,^ㅅ^
다시 예를 살펴볼게요
1. 항상 인터럽트 발생시, IDT를 확인
2. 시스템콜 인터럽트 명령은 0x80 번호가 미리 정의
3. 인터럽트 0x80에 해당하는 운영체제 코드는 system_call()이라는 함수(주소)
4. 즉, IDT에는 0x80 -> system_call()와 같은 정보가 기록되어 있음
인터럽트와 IDT
리눅스의 예
1. 0~31: 예외상황 인터럽트(내부 인터럽트, 소프트웨어 인터럽트) - 일부는 정의안된 채로 남겨져 있음
2. 32~47 : 하드웨어 인터럽트(주변장치 종류/ 갯수에 따라 변경 가능)
3. 128: 시스템 콜(0x80을 십진수로 하면 128)
인터럽트와 프로세스
인터럽트는 번호가 있는것이고, 번호에 해당하는 코드들이 있는것이고, 그 코드들이 운영체제에 있는것이고,
번호와 코드들에 대한 정보들이 IDT라는 테이블에 들어가 있어서 인터럽트가 발생하면
맨처음 참조하는 테이블이 해당테이블이다.
1. 프로세스 실행 중 인터럽트 발생
2. 현 프로세스 실행 중단
3. 인터럽트 처리 함수 실행(운영체제)
4. 현 프로세스 재실행
인터럽트와 스케쥴러
선점형 스케쥴러 구현의 예
범용 레지스터 참고
eax, ecx, edx, esi, edi, esp, ebp
'Computer(인강) > 운영체제' 카테고리의 다른 글
프로세스 구조와 컴퓨터 구조 (0) | 2021.02.21 |
---|---|
프로세스 구조 (0) | 2021.02.21 |
인터럽트 종류 (0) | 2021.02.21 |
인터럽트 란? (0) | 2021.02.21 |
스케쥴링 알고리즘 조합 (0) | 2021.02.21 |