ostep / 가상화 / CPU / 원리: 제한적 직접 실행 (한글판 9장, 영문판 6장)
들어가며
이 책에서는 어떤 문제를 해결하는 개념을 다룰 때 다음의 2가지로 나누어 설명하고 있습니다.
저수준 기법 (mechanism)
어떻게 문제를 해결할 것인지
예: 어떻게 CPU 가상화를 할 것인지 -> 제한적 직접 실행
고수준 정책 (policy)
문제를 해결해서 무엇을 할 것인지
예: 가상화한 CPU자원을 어떤 프로세스에게 할당할 것인지 -> CPU 스케줄링
CPU 가상화
들어가며
CPU라는 자원은 시분할로 가상화하는 것이 자연스럽다.
CPU 가상화 기법의 필요조건들
빨라야 한다.
기법: 제한적 "직접 실행"
사용자 프로세스는 가상의 명령어를 해석하는 것이 아니라, 하드웨어에서 지원하는 명령어를 직접 실행한다.
예를 들어서 x86 CPU에서 돌아가는 OS의 경우 x86 기계어를 직접 실행한다.
일부 명령어는 사용자 프로세스가 사용할 수 없어야 한다.
예: 입출력장치에 직접 접근하는 명령어는 사용자 프로세스가 아닌 커널에서만 사용할 수 있다.
기법: "제한적" 직접 실행
하드웨어 지원 기능: mode bit, trap 및 return-from-trap 명령어
OS의 특정 기법을 구현하기 위해서는 하드웨어가 지원하는 기능과 운영체제 소프트웨어가 협력하는 경우가 많다.
mode bit
mode bit은 CPU에 존재하며 mode bit의 세팅 여부에 따라 커널 모드(kernel mode)와 사용자 모드(user mode)로 나뉜다.
CPU는 사용자 모드인 경우 일부 명령어들의 실행만 지원한다.
지원하지 않는 명령어를 실행할 경우 interrupt가 발생하여 OS가 문제의 프로세스를 kill할 수 있다.
trap, return-from-trap 명령어
위와 같이 사용자 프로세스는 일부 명령어를 직접 실행하지 못하고 OS를 통해 간접적으로 실행해야 한다. 이 과정에서 사용할 수 있는 명령어들이 trap 및 return-from-trap 명령어들이다.
trap 명령어
kernel mode로 전환하고, 해당 trap과 관련된 커널의 코드가 실행된다.
이 때
trap 0xdeadbeef
와 같이 trap 명령어에 임의의 주소값을 전달할 수 있다면 사용자 프로세스가 임의의 커널 코드를 실행시킬 수 있는 큰 문제가 일어난다.따라서 trap 명령어 실행 시 실행시킬 수 있는 handler가 몇 개로 정해져 있다. 이를 trap table이라 한다.
trap 0x80
과 같이 trap 명령어는 index를 전달하는 방식으로 동작한다.CPU에서 trap handler를 등록하는 방법을 별도로 제공해주며, 커널은 이를 사용하여 부팅 시 trap table을 초기화한다.
x86 아키텍처에서는 trap 명령어를
int
라고 부르지만, 교재와 강의에서는 trap 명령어와 인터럽트를 구분해서 설명하고 있다.필자 주: 공룡책에서 시스템 호출은 소프트웨어 인터럽트 중 하나로 처리된다고 말하는 것으로 볼 때, 여기서 ostep에서 구분하고자 하는 인터럽트는 하드웨어 인터럽트로 추정됩니다.
return-from-trap 명령어
user mode로 전환하고 trap 명령어를 호출한 곳으로 되돌아간다.
⚠ 필자 주: 인터넷에서 잠깐 찾아보았을 때 trap이라는 단어가 다른 맥락에서도 사용됨을 확인했습니다. 조사한 바로는 trap 및 여러 단어들의 용례가 사용되는 의미가 하나로 합의되지는 않았다고 합니다. 하지만 여기서도 공룡책에서도 "trap instruction"라는 용어가 일관적으로 사용되는 것으로 보았을 때 OS 공부할 때 "trap 명령어"라는 말을 사용해도 무방해 보입니다.
사용자 프로세스 하나가 실행 중일 때 제어권을 가져와서 다른 사용자 프로세스로 넘기는 과정이 필요하다.
예전에 사용했던 기법: 협조(cooperative) 방식
사용자 프로세스가 제어권을 양보할 때까지 OS가 기다린다.
문제: 사용자 프로세스가 프로그래머의 실수든 고의든 오랫동안 제어권을 양보하지 않으면 OS는 제어권을 가져올 수 없다.
현재 사용하는 기법: 비협조 방식
하드웨어 지원 기능: timer interrupt
CPU에서 일정 갯수의 클럭 실행 후 발생시키는 인터럽트
timer interrupt 발생 시 제어권이 interrupt handler로 넘어가 OS가 다시 제어권을 가져올 수 있다.
문맥 전환 (context switch)
문맥 전환 시 저장해야 하는 데이터: 레지스터, PC, SP
출처
댓글을 작성해보세요.