Home

Published

- 8 min read

[ OS ] 2. Limited Direct Execution

img of [ OS ] 2. Limited Direct Execution

들어가며

CPU를 가상화하기 위해서 운영체제는 여러 작업들이 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유한다. 기본적인 아이디어는 간단하다. 한 프로세스를 잠시동안 실행하고 다른 프로세스를 또 잠깜 실행하고, 이런 식으로 계속해서 잠깐씩 실행시키면 된다. 이러한 방식처럼 CPU 시간을 나누어 씀으로써 가상화를 구현할 수 있다.

CPU 시간을 나누어 쓰게 되면 두 가지 문제가 있다. 성능저하 문제와 제어문제가 그 중 일부이다.

시스템에 과중한 오버헤드를 주지 않으면서 가상화를 구현할 수 있을까?

CPU에 대한 통제를 유지하면서 프로세스를 효율적으로 실행시킬 수 있는 방법은 무엇인가?

기본 원리- 제한적 직접 실행

이 아이디어의 “직접 실행”에 해당하는 부분은 간단하다. 프로그램을 CPU 상에서 그냥 직접 실행시키는 것이다. 따라서 운영체제가 프로그램을 실행하기 시작할 때 프로세스 목록에 해당 프로세스 항목을 만들고 메모리를 할당하며 프로그램 코드를 디스크에서 탑재하고 진입점을 찾아 그 지점으로 분기하여 사용자 코드를 실행하기 시작한다. 하지만 이런 접근법은 CPU를 가상화함에 있어 몇가지 문제를 일으킨다.

문제점 1: 제한된 연산(Restricted Operations)

만일 프로세스가 특수한 종류의 연산을 수행하길 원한다면 어떻게 될 것인가? 이러한 연산에는 디스크 입출력 요청이나 CPU 또는 메모리와 같은 시스템 자원에 대한 추가할당 요청 등이 포함된다.

만약 프로세스가 원하는 대로 할 수 있게 하면 문제가 생긴다. 프로세스가 전체 디스크를 읽고 쓸 수 있기 때문에 접근 권한을 검사하는 파일 시스템의 경우 의미가 없다.

애플리케이션은 시스템을 완전히 제어하지 않으면서도 제한된 작업을 수행할 수 있어야 한다.

사용자 모드(user mode)와 커널 모드(kernel mode)

이런 문제 때문에 사용자 모드와 커널 모드라는 두 가지 모드가 도입되었다.

사용자 모드에서 실행되는 코드는 시스템 자원에 대한 직접적인 접근을 제한한다. 예를 들어, 입출력 요청을 하면 운영체제가 예외를 발생시키고 해당 프로세스를 제거한다.

커널 모드는 사용자 모드와 대비되는 모드로, 운영체제의 중요한 코드들이 실행된다. 이 모드에서 실행되는 코드는 모든 특수한 명령어를 포함하여 원하는 모든 작업을 수행 할 수 있다.

system call - trap

그렇다면 프로세스가 특수한 종류의 연산을 수행하기 위해서는 어떻게 해야 할까?

시스템 콜과 같은 예외적인 작업을 수행하기 위해 운영체제는 trap이라는 메커니즘을 사용한다. trap 명령어를 실행하면 사용자 모드에서 커널 모드로 전환되며, 운영체제의 코드가 실행된다. 이후에는 다시 사용자 모드로 돌아간다.

trap은 trap table을 통해 어디로 분기해야 하는지 운영체제에 알려준다. 이 테이블은 부팅 시에 만들어지며, 하드웨어에서 발생하는 예외 이벤트에 대한 처리를 정의한다.

시스템 콜은 고유한 번호를 가지고 있으며, 사용자 프로그램은 이 번호를 이용하여 시스템 콜을 호출한다. 호출된 trap 핸들러는 해당 시스템 콜을 처리한다.

trap table

커널은 부팅 시에 트랩 테이블(trap table)을 만들고 이를 이용하여 시스템을 통제한다. 컴퓨터가 부트될 때는 커널 모드에서 동작하기 때문에 하드웨어를 원하는 대로 제어할 수 있다. 운영체제가 하는 초기 작업중 하나는 하드웨어에게 예외 사건이 일어났을 때 어떤 코드를 실행해야 하는지 알려주는 것이다. 운영체제는 특정 명령어를 사용하여 하드웨어에게 트랩 핸들러(trap handler)의 위치를 알려준다. 하드웨어는 이 정보를 전달받으면 해당 위치를 기억하고 있다. 따라서 시스템 콜과 같은 예외적인 사건이 발생했을 때 하드웨어는 무엇을 해야 할지 알 수 있다.

트랩 테이블(Trap Table)은 운영체제가 하드웨어 인터럽트나 예외 상황을 처리하기 위해 사용하는 데이터 구조이다. 이 테이블은 운영체제가 부팅될 때 생성되며, 각 예외 또는 인터럽트 유형에 대한 처리기(handler)의 주소를 포함한다.

트랩 테이블은 보통 운영체제의 커널 영역에 저장되며, 하드웨어에 의해 사용된다. 이 테이블은 하드웨어가 특정 이벤트를 감지할 때 해당 이벤트를 처리하기 위해 실행할 코드의 주소를 참조하는데 사용된다.

예를 들어, 사용자 프로세스가 시스템 콜을 호출할 때, CPU는 트랩 명령을 사용하여 운영체제의 트랩 핸들러로 전환된다. CPU는 트랩 테이블을 사용하여 해당 시스템 콜 번호에 대한 핸들러의 주소를 찾아내고, 그 주소로 분기하여 시스템 콜을 처리한다.

trap handler

trap handler는 운영체제의 일부분이다. 운영체제는 시스템 콜 번호를 읽어 사용자가 명시한 시스템 콜 번호가 유요한 시스템 콜에 해당하는지를 먼저 파악한다.