조심스럽게 실행해야 되는 instruction 집합이다.
그만큼 중요한 instruction들 이라는 것이다. 잘못 만지면 컴퓨터에 심각한 이상증상을 초래 할 수 있다. 그래서 아무나 실행할 수 없는 instruction 이다.
시스템 레지스터 접근/조작
interrupt descripter table
Control registers
I/O 에 직접 접근
ex) IN/OUT instructions in IA-32
memory 상태관리
page table update, page table pointers, TLB loads, etc..
HLT instruction in IA-32
CPU는 두가지 mode가 있다.
user mode, kernel mode
user mode는 privileged 빼고 실행 가능하고 kernel mode는 전부다 실행 가능하다.
privileged instruction들은 kernel mode
에서만 실행된다.
만약 user mode에서 privileged instruction을 실행하려고 하면 exception이 발생할 것이다.
OS가 자신과 다른 시스템 구성요소들을 지키게 한다.
일반적인 것과 치명적인 것들을 분리시켜준다.
현대 CPU는 2가지 더많은 모드가 지원된다.
guest VM들을 위한 위한 virtual machine manager(VMM)mode도 있다.
VMs은 메모리 접근 공간이 제한 되어야 한다.
interrupt
보통 하드웨어에서 일어난다.
비동기이다(언제든지 발생할 수 있다)
interrupt handler로 이동하기 전에 kernel mode로 바뀐다.
비동기: 동시에 여러개가 실행 가능, 응답이돌아오기 전에 요청가능
system call
동기이다.(명시적으로 요청할 경우 일어날 수 있다.)
소프트웨어에 의해 일어난다.
동기: 동시에 여러개가 실행될 수 없다. 응답이 들어오면 요청가능
CPU가 interrupt를 잡아서, interrupt handler로 보낸다.
interrupt handler는 kernal mode에서 실행된다.
interrupt handler가 끝나면 다시 user mode로 돌아간다.
Interrupt
hardware device에 의해 생긴다.
asynchronous(비동기)(아무때나 가능)
Exception
- software 실행 instruction에 의해 생성된다.
- software err(e.g..division by zero), 허가되지않은 데이터 접근, 운영체제 서비스 요청 등
- synchronous(동기):CPU가 instruction을 실행했을때 발생
- trap(expected,intende) 나 fault(unexpected)로 분류된다.
- interrupt처럼 다뤄진다.
OS에서 제공하는 서비스에 대한 프로그래밍 인터페이스이다.
일반적으로 high level language이다(c/c++)
대부분 직접적인 system call 사용 보다는 high-level API을 통한 프로그램에 의해 접근 된다.
가장 많은 공통 API
POSIX: Portable OS Interface
UNIX,LINUX,Mac OSX모두를 포함하는 버전이다.
window 위한 Win32 API
java virtual machine(JVM)위한 JAVA API
system call에 의한 user mode -> kernal mode
위 그림에서 볼 수 있듯이 user process에서 system call을 부르면 mode bit= 0이되어, kernal 모드로 switch 된다.
system call을 실행하고 나서는 mode bit = 1이 되어, 다시 user mode로 return 된다.
user program안의 CPU나 memory hardware, I/O 장치 내에서 일어날 수 있다.
올바르고 일관적인 연산을 수행하기 위해 적절한 액션을 취한다.
디버깅 기능은 시스템을 사용하는 유저들이나 프로그래머들의 능력을 크게 향상 시킬 수 있도록 해준다.
– create process, terminate process
– end, abort
– load, execute
– get process attributes, set process attributes
– wait for time
– wait event, signal event
– allocate and free memory
– dump memory if error
– debugger for determining bugs, single step execution
– locks for managing access to shared data between processes
– create file, delete file
– open, close file
– read, write, reposition
– get and set file attributes
– request device, release device
– read, write, reposition
– get device attributes, set device attributes
– logically attach or detach devices
– get time or date, set time or date
– get system data, set system data
– get and set process, file, or device attributes
– create, delete communication connection
– send, receive messages if message passing model to host name or
process name
– Shared-memory model create and gain access to memory regions
– transfer status information
– attach and detach remote devices
– Control access to resources
– Get and set permissions
– Allow and deny user access
C program이 printf() library 를 호출하면, library는 write() system call을 호출한다.
user application(user mode)에서 open()을 호출하면 kernel mode로 바뀌고
system call interface에서 open()이라는 함수를 찾아 실행한후 return 값을 다시 system call interface로 보내준다. 그럼 system call interface가 다시 user application으로 return 값을 보내준다.
리눅스 커널에서는 위 그림처럼 syscall 함수가 저장되어 있다.
interrupt service 루틴은 몇몇 일관성과 보안성 체크를 한다. 이게 system call을 느리게 만든다. (Meltdown의 취약점)
intel은 "fast system call"이라는 기능을 제공한다. 이 기능은 최적화된 system call을 호출을 제공하는 하드웨어 최적화이다.