이 글을 한국외국어대학교 이윤석 교수님의 운영체제 수업을 스스로 복기하고자 작성한 글 입니다.
Privileged Instructions(특권 명령어)
- OS만 할 수 있는 명령어들을 의미한다.
- 종류
- IO 장치에 직접 접근하는 명령어
- 메모리 관리하는 명령어
- page table pointer
- TLB
- 시스템 register 수정 명령어
- CPU mode bit 수정
- cpu안에 mode를 나타내는 field를 둬서 현재 mode가 os인지 user인지 판단한다.
- Halt(프로그램 종료) 명령
- Timer 세팅 명령
- OS와 User를 분리할 수 있다. ⇒ for Protection
Cpu modes of Operation
- User mode와 Kernel(Supervisor) mode로 구분한다.
- OS는 kernel mode에서만 동작한다.
- 모든 자원에 접근 가능
- Privileged Instruction 수행 가능
- 하드웨어 안에 mode bit를 통해 user와 kernel 모드 지정
- trap 명령(System call) 실행 시 user mode를 kernel mode로 변경한다.
- RTI(return from interrupt) 시 kernel mode에서 user mode로 변
- Cpu architectur마다 privilege mode를 내부적으로 구분한다.
Crossing Protection Boundary

- User mode와 Kernel mode 사이의 경계를 Protection Boundary라고 부른다.
- Protection을 위해 user process에서 kernel 모드로 진입하려면 trap이라는 interrupt의 형태로만 가능하도록 설계하였다.
System call
-
user process가 privileged operation을 필요로 하다면 os에게 요청하는 데 이를 system call을 호출한다고 부른다(사실 user mode에서는 wrapper function을 호출)
-
OS가 제공하는 서비스를 호출하는 프로그래밍 인터페이스(함수)
-
실제 System call routine은 OS code안에 존재한다.
-
user mode에서 불리지만 실제 동작은 kernel mode에서 수행된다.
-
OS마다 상이하다.
-
trap이라는 명령어를 사용하여 user mode ⇒ kernel mode로 전환한다.
-
개발자가 직접적으로 system call을 부르기보다는 library(api)들을 통해 system call을 주로 부른다.

- printf : 마지막에 sys call 중 하나 인 write()를 호출
-
Wrapper Library(Function)

- 유저 모드에서 시스템 콜(os가 지니고 있는 실제 서비스 코드)을 부르기 전에 사용하는 함수
- 마지막에는 항상 trap을 호출
-
System call 동작 과정

- user mode에서 wrapper library를 호출(kernel mode로 전환)
- trap안에 있는 실행할 system call number 확인
- OS code안에 있는 일치하는 system call 수행
- 다시 user mode로 전환(return from interrupt)
Implementing System calls

- api의 파라미터들을 stack 저장
- wrapper libray(function) 호출
- 호출할 sys call 번호를 지정된 register에 입력
- trap 발생(제어권을 kernel에 넘김)
- code 담겨져 있는 sys call num을 보고 올바른 handler를 호출, 이를 Dispatch라고 한다.
- Handler가 syscall 처리
- 다시 유저 모드로 전환(return from interrupt)
- 스택에 저장된 api 파라미터를 제거(Increment SP)
Typical OS Structure

- System Call Interface
- kernel 영역 젤 위에 존재
- sys call을 확인하고 이에 해당하는 handler 호출
- Kernel
- handler를 제외하고도 file system과 같은 여러 기능들을 지닌다.
- Arch-dependent kernel code
- 하드웨어에 종속적인 부분(ex. 인터럽트 처리)
Reducing System call Overhead
- sys call을 호출하면 protection boundary crossing이 일어나고 context swtiching(현재 cpu 상태를 저장)과 같은 여러 작업들을 수행하기 때문에 overhead가 크다.
- 이러한 overhead 발생에도 불구하고 user와 kernel을 분리하는 이유는 os를 보호하기 위해서 이다.(ex. os가 trap 발생 시 올바른 trap인지 확인 후 동작)
- 이러한 overhead를 줄이기 위한 방법
- sys call의 결과를 cache에 저장(caching)
- getpid로 얻어온 프로세스 아이디를 캐시에 저장해
- buffering operation 사용(바이트마다 sys call을 호출하는 게 아니라 buffer만큼 읽거나 쓴 후 sys call을 한 번만 호출)
- open ⇒ fopen
- read ⇒ fread
- write ⇒ fwrite
OS Structure
- OS 또한 Software이다.
- main 함수가 존재(컴퓨터 부팅 시 호출됨)
- 자원 사용
- 오류가 발생할 수 있다.
- 다만 OS는 매우 정교한 sw이다.
- 이벤트 당 쓰레드를 생성하여 이를 처리하고 여러 쓰레드들이 동시에 수행된다. ⇒ 동시성이 매우 정교하게 처리됨
- 단순 함수 호출이 아닌 trap이라는 interrupt를 통해 사용 가능하다.
- 컴퓨터를 종료하지 않는 이상 OS가 종료되지 않는다.
- 모든 명령을 수행할 수 있다.
How to start the OS?
- 아주 간단한 프로그램이 read-only 메모리에 미리 로딩되어 있다.(BIOS)
- Firmware : 하드웨어에 탑재되어 있는 프로그램
- CPU가 BIOS를 실행
- BIOS 실행 시 OS를 로딩하는 MBR(Master Boot Record)을 로딩한다.
- 실제 OS kernel이 존재하는 메모리 주소로 분기
- OS의 small version(MBR)이 big version(Kernel)을 호출
💡 OS를 호출하는 데 있어 굳이 두 단계를 거치는 이유는 OS마다 file system이 다른데 **BIOS가 OS의 file system의 구조를 몰라도 되게 하기 위해서** 이다. ⇒ MBR이 호출할 OS의 file system 구조를 이해한 채 big OS 호출
What does the OS do & Control Flow?

- 평소 idel(infinite) loop을 돌며 존재
- OS가 깨어남
- interrupt가 발생 시(from Hardware Devices)
- trap 발생 시(from User Program)
- exception 발생 시(from User Program)
OS Structure
-
Monolithic Structure

- 모든 기능들이 한 몸에 들어있다.
- 어느 한 곳에 버그가 있으면 os 전체에 파급효과를 미친다.
- 모듈을 function call 방식으로 호출했다.
- 모듈간 communication의 비용이 적다.
-
Layered Structure

- 기능을 layer 별로 구분
- 각 layer는 바로 밑에 있는 layer만 사용 가능하다.
- Machine dependent(기계어와 관련 있는 부분)
- context switching 담당
- trap 관련 기능 담당
-
Microkernel Structure

- kernel의 기능을 줄이고(small kernel) 대부분의 기능을 user space로 분리
- 하나의 기능(모듈)에 문제가 생겨도 다른 기능에 영향을 주지 않는다.
- 모듈간의 통신을 위해 os를 매개로 하여 messsage passing 방식을 사용한다.
- communication에 대한 비용이 발생한다.
- 현재는 하드웨어가 발전하여 비용이 적다.
- 특징
-
Module

- 독립적으로 개발되고 관리되는 sw 단위
- layer와 비슷하지만 좀더 유연하다.
- 객체 지향 접근을 사용한다.
- 은닉화(사용자들이 open 된 것들만 사용가능)
Virtual Machine

- 하드웨어 위에 독립된 sw 형태의 가상 머신을 제공하는 것
- 하나의 컴퓨터에서 여러 개의 os를 사용 가능케 해준다.
- Hypervisor : virtual machine을 생성하는 layer
- hypervisor와 virtual machine을 구분해야 한다.
- vm ware, virtual box 등은 hypervisor이지 vm이 아니다.
- vm의 등장으로 kernel 개발이 유용해졌다.
- 하나의 kernel에 문제가 생겨도 문제가 다른 vm에 영향을 미치지 않는다.
- 발생한 문제를 밑에 layer에서 catch 할 수 있다.