Jungle

[TIL] pintos : 인터럽트 프레임이란?

손가든 2023. 12. 5. 19:53

pintos 2주차로, 유저 프로그램을 실행시키는 과제를 수행하면서 인터럽트 프레임이라는 처음 듣는 키워드가 나왔다.

 

인터럽트 프레임이 유저 스레드를 동작시키는 시스템 안에서 매우 중요한 요소인 것 같다.

 

이번 포스팅을 통해 인터럽트 프레임이 무엇인지,

 

인터럽트 프레임을 통해서 프로세스를 실행할 때 어떤 작업들을 수행하는지 알아보자.

 


 

Interrupt Frame 이란 ?

 

인터럽트 프레임은 실행 중이던 프로세서에서 인터럽트 서비스 루틴이 실행되면,

 

현재 상태를 사후 복구하기 위해 실행 중이던 상태를 저장하는 데이터 구조(struct)이다.

 

 

이는 현재 수행중인 프로세스가 작업을 중단하고 인터럽트에 응답해서 특정한 코드가 실행될 때 사용된다.

 

 

인터럽트 프레임은 프로세스의 커널 스택에 위치하는데,

 

이 때 커널 스택이란 일반적으로 커널 모드의 프로세스가 커널 코드에서 실행 될 때 사용되는 스택이다.

 

이 커널 스택은 커널 코드 안에서 함수 호출(시스템 콜)이나 인터럽트 서비스 루틴 실행(타이머 인터럽트, I/O 인터럽트) 중에 사용된다.

 

 

인터럽트가 발생하면 현재 실행 중인 프로세스의 상태를 저장하기 위해서 현재 프로세스의 커널 스택에 인터럽트 프레임이 할당된다.

 

이 인터럽트 프레임에는 프로세스의 레지스터 상태, 프로그램 카운터, 플래그 등이 저장된다.

 

현재 실행 중이던 코드와 기억 중인 데이터들을 인터럽트 함수를 시작하기 위해

 

미리 모두 보존 시켜 놓기 위해 프레임에 저장해 놓는 것이다.

 

이를 통해 인터럽트가 발생하면 커널 스택에 있는 인터럽트 핸들러가 실행되고

 

이후 다시 컨텍스트를 되돌리며 현재 실행되던 순간으로 복구할 수 있다.

 

 

pintos : intr_frame 구조체 분석

 

핀토스의 인터럽트 프레임 구조체 각 멤버를 분석하여, 어떠한 값들이 저장되어 컨텍스트 전환시 현재 상태를 보존할 수 있는지 살펴보자.

pintos 인터럽트 프레임 구조체

 

1. gp_registers R

 

범용 레지스터 구조체이다.

인터럽트가 발생하기 전의 범용 레지스터 속 값들을 저장한다.(rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp)

 

 

2. unit16_t es

 

es 레지스터의 값은 데이터 세그먼트 레지스터 중 하나로, 데이터 접근 시 사용된다.

 

 

3. uint64_t vec_no

 

인터럽트 벡터 번호를 저장한다. 현재 발생한 인터럽트가 어떤 종류의 인터럽트인지 식별하는 값이다.

 

 

4. uint64_t error_code

 

에러 코드를 저장한다. 몇몇 인터럽트에서 발생할 수 있는 에러를 저장하는 역할을 한다.

 

 

5. uintptr_t rip

 

인터럽트가 발생한 시점의 명령어 포인터(IP : Instruction Pointer)를 저장한다.

이를 통해 인터럽트가 끝나면 다시 실행하던 명령어로 복귀할 수 있다.

 

 

6. uint16_t cs

 

코드 세그먼트 레지스터의 값으로, 코드 접근 시 사용된다.

 

 

7. uint64_t eflags

 

플래그 레지스터 값으로, 프로세스 상태와 관련된 여러 플래그들을 저장한다.

 

 

8. uintptr_t rsp

 

스택 포인터(SP) 값을 저장한다. 이는 현재 스택의 최상단을 가리키는 주소이다.

 

 

9. uint16_t ss

 

스택 세그먼트 레지스터 값이다. 스택 접근 시 사용된다.