pintos 2주차로, 유저 프로그램을 실행시키는 과제를 수행하면서 인터럽트 프레임이라는 처음 듣는 키워드가 나왔다.
인터럽트 프레임이 유저 스레드를 동작시키는 시스템 안에서 매우 중요한 요소인 것 같다.
이번 포스팅을 통해 인터럽트 프레임이 무엇인지,
인터럽트 프레임을 통해서 프로세스를 실행할 때 어떤 작업들을 수행하는지 알아보자.
Interrupt Frame 이란 ?
인터럽트 프레임은 실행 중이던 프로세서에서 인터럽트 서비스 루틴이 실행되면,
현재 상태를 사후 복구하기 위해 실행 중이던 상태를 저장하는 데이터 구조(struct)이다.
이는 현재 수행중인 프로세스가 작업을 중단하고 인터럽트에 응답해서 특정한 코드가 실행될 때 사용된다.
인터럽트 프레임은 프로세스의 커널 스택에 위치하는데,
이 때 커널 스택이란 일반적으로 커널 모드의 프로세스가 커널 코드에서 실행 될 때 사용되는 스택이다.
이 커널 스택은 커널 코드 안에서 함수 호출(시스템 콜)이나 인터럽트 서비스 루틴 실행(타이머 인터럽트, I/O 인터럽트) 중에 사용된다.
인터럽트가 발생하면 현재 실행 중인 프로세스의 상태를 저장하기 위해서 현재 프로세스의 커널 스택에 인터럽트 프레임이 할당된다.
이 인터럽트 프레임에는 프로세스의 레지스터 상태, 프로그램 카운터, 플래그 등이 저장된다.
현재 실행 중이던 코드와 기억 중인 데이터들을 인터럽트 함수를 시작하기 위해
미리 모두 보존 시켜 놓기 위해 프레임에 저장해 놓는 것이다.
이를 통해 인터럽트가 발생하면 커널 스택에 있는 인터럽트 핸들러가 실행되고
이후 다시 컨텍스트를 되돌리며 현재 실행되던 순간으로 복구할 수 있다.
pintos : intr_frame 구조체 분석
핀토스의 인터럽트 프레임 구조체 각 멤버를 분석하여, 어떠한 값들이 저장되어 컨텍스트 전환시 현재 상태를 보존할 수 있는지 살펴보자.
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
스택 세그먼트 레지스터 값이다. 스택 접근 시 사용된다.
'Jungle' 카테고리의 다른 글
[TIL] 운영체제 개념 퀴즈 정리 (0) | 2023.12.12 |
---|---|
[TIL] pintos : 유저 프로세스 생성 / 실행파일 인자 파싱 (1) | 2023.12.07 |
[TIL] DP 알고리즘적 접근법 (1) | 2023.12.04 |
[TIL] pintos - MLFQ 스케줄링 구현하기 - 트러블 슈팅 (0) | 2023.12.02 |
[TIL] pintOS : synchronization 우선순위 스케줄링 구현 (2) (0) | 2023.11.29 |