Shine's dev log

시스템 콜 (System call) 본문

운영체제

시스템 콜 (System call)

dong1 2020. 4. 1. 15:42

지난번에 정의한 운영체제란 "사용자와 하드웨어 사이에서 사용을 더 원활하게 해주는 소프트웨어" 였다.

 

즉, 운영체제란 사용자가 사용하는 어플리케이션과 컴퓨터를 구성하는 하드웨어 그 사이 어딘가에 위치해 있다는 것을 알 수 있다.

 

다시말하면, 중간에 위치한 운영체제가 일을 잘못하게 되면, 사용자가 사용하는 어플리케이션이 컴퓨터의 하드웨어, 즉 굉장히 코어한 부분까지 접근이 가능하다는 것이다.

 

운영체제를 경찰에, 어플리케이션을 시민, 하드웨어를 은행으로 비유해보자. 만약 경찰(운영체제)가 해야할 일을 제대로 하지 않으면, 시민(어플리케이션)이 마음대로 은행(하드웨어)에 접근하여 돈을 훔칠 수 있다는 것이다.

 

오늘은 이런 Protection의 관점에서 운영체제를 살펴보자.

 

 

 

1. 유저모드와 커널모드

 

앞서 말한 상황, 즉 유저가 시스템의 중요한 부분에 함부러 접근하는 것을 막기위해서 CPU는 두가지 모드로 나뉘어 운영된다.

 

바로 유저모드 (User mode)  커널모드 (Kernel mode) 이다. (유저모드와 커널모드는 Mode bit로 확인할 수 있다.)

 

유저모드는 어느정도 제한되고, 가벼운 명령어들만 처리 가능하다.

 

반대로 커널모드는 모든 명령어들이 처리 가능한 상태이다. 메모리와 CPU를 직접적으로 건드리는 명령도 가능하기 때문에 자칫 잘못하면 컴퓨터에 치명적인 손상을 줄수도 있다.

 

그리고 운영체제는 CPU의 커널모드를 관리감독하는 역할을 한다.

 

이 유저모드 명령어와 커널모드 명령어의 관계를 살펴보면 다음과 같다.

 

User mode inst. & Kernel mode inst.


위의 그림에서 알 수 있듯이, 유저모드 명령어는 커널모드 명령어의 부분집합이다. 즉, 유저모드에서 가능한 명령어는 커널모드에서 모두 사용 가능하다. 반대로, 커널모드에서 사용가능하지만 유저모드에서는 사용하지 못하는 명령어들이 있는데 이를 Privileged Instruction이라고 한다.

 

 

 

2. Privileged Instruction

 

Privileged Instruction은 정말 조심히 사용해야 하는 명령어들이다. 자칫 잘못하면 시스템에 치명적인 손상을 야기할 수 있기 때문인데, 몇가지 Privileged Instruction의 예를 살펴보자.

 

    1) Direct I/O access

 

키보드나 디스크의 접근 명령에 관한 명령어로 키보드나 디스크의 입력을 함부러 가로챈다면 위험할 수 있기 때문에 Privileged Instruction이다.

 

    2) Accessing / Manipulating system registers

 

레지스터에 관한 명령어로서, 레지스터는 CPU안에 들어있기 때문에 매우 중요하다. control register처럼 중요한 레지스터에 관한 명령어나 interrupt service routine table 처럼 인터럽트에 관여하는 명령어는 Privileged Instruction이다.

 

    3) HLT instruction

 

컴퓨터를 종료시킬 수 있는 명령어이다.

 

이 외에도 메모리상태를 관리하는 명령어, 시스템의 타이머 관련 명령어들도 Privileged Instruction이다.

 

 

그렇다면 만약 유저모드에서 Privileged Instruction을 실행하면 어떻게 될까? CPU는 유저모드에서 Privileged Instruction이 실행하려는 것을 감지하면 (Mode bit 이용) interrupt가 발생하게 되고, CPU의 모드가 커널모드로 바뀌게 된다.

 

커널모드로 바뀐 이상 운영체제가 처리를 하게 되는데, 운영체제는 이 interrupt를 가지고 판단하여 명령을 수행할지 말지 결정한다.

 

사실 여기서의 interrupt는 exception이라고 하는게 더 정확하다. interrupt와 exception의 차이는 다음에 다뤄보도록 하자.

 

 

 

3. 시스템 콜 (System call)

 

일반 유저모드에서 컴퓨터가 동작중이다가 interrupt가 발생하는 순간 CPU는 커널모드로 바꾸고 운영체제는 발생한 interrupt를 가지고 일을 한다.

 

따라서, interrupt가 발생하면 유저모드에서 커널모드로 변환이 일어난다고 할 수 있다. 유저모드에서 커널모드로 변하게 만드는 다른 방법이 한가지 있는데, 그것은 바로 시스템 콜(system call)이다.

 

시스템 콜이란 "운영체제가 제공하는 서비스를 부르기 위한 프로그래밍 인터페이스" 라고 정의할 수 있다.

 

보통 시스템콜은 API (Application Programming Interface)를 통하여 호출이 된다. 즉, 만약 유저가 실행중인 유저 프로세스가 커널모드에서만 수행 가능한 서비스를 사용하고 싶으면, 커널 모드를 관리감독하고 있는 운영체제에게 부탁해야 하는데 운영체제에게 부탁할 때 필요한 인터페이스가 바로 '시스템 콜' 이라는 것이다.

 

system call

 

시스템 콜의 대략적인 개요를 나타낸 것이 위의 그림이다. 시스템 콜을 요청해 제공받을 수 있는 서비스로는 프로그램 로드, I/O operation, 파일 시스템 관리, 에러감지, 자원 배분 등등 수많은 서비스가 있다.

 

우리가 컴퓨터를 사용할 때, 우리도 모르는사이에 운영체제에게 수많은 시스템 콜을 요청하고 있었던 것이다.

 

 

 

오늘 내용을 정리해보면,

 

1. CPU는 유저모드와 커널모드로 나뉘어져있는데, 보안문제 때문이다.

2. 운영체제는 커널모드를 관리하는 역할을 한다.

3. 커널모드로 진입하는 방법은 두가지가 있는데, 하나는 interrupt이고, 다른 하나는 시스템 콜이다.

4. 시스템 콜은 유저가 운영체제가 제공하는 서비스를 사용하기위해 운영체제에게 요청하는 인터페이스이다.

 

 

 

본 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.

 

'운영체제' 카테고리의 다른 글

프로세스 생성, 대체, 종료  (0) 2020.04.09
프로세스의 개념  (0) 2020.04.08
운영체제의 구조 (2)  (0) 2020.04.07
운영체제의 구조 (BIOS, Policy & Mechanism)  (0) 2020.04.05
운영체제란?  (0) 2020.03.31