본문 바로가기
학교 수업/운영체제

운영체제 || 1. System Call

by Godgil 2021. 3. 11.

 

오늘은 어떻게 OS가 시스템을 보호하는지에 대해서 다룰것이다.

 

운영체제는 먼저, Hardware와 Software의 중간단계에서 user에게 편리한 인터페이스를 제공하고, 또 여러 app들이 하드웨어의 자원을 효율적으로 사용할 수 있도록 관리해준다.

 

그렇다면, OS를 거치지 않고 app들이 하드웨어에 직접 접근할 수 있으면 어떻게 될까?

 

당연히, 보안문제가 생길 수 있고, 특정 application이 하드웨어의 자원을 독점하게 될 수도 있다.

 

우리 컴퓨터는 인터럽트 기반으로 작동하는데, CPU안에 있는 특정 레지스터는 OS가 가지고 있는 인터럽트 핸들러의 코드 주소를 가리키고 있다.

 

근데 나쁜 application이 인터럽트 핸들러의 주소를 자기가 가진 코드의 주소로 바꾸게 되면 사용자가 Input 신호를 보낼 때 사용자가 치는 모든 값을 hooking할 수 도 있다. 물론 여기에는 공동인증서 비밀번호가 될 수도 있고, 내 카카오톡 아이디와 비밀번호, 계좌번호가 포함될 수 있다.

 

또 다른 경우, HLT라고 하는 instruction을 악의적인 application이 호출하는 경우, 전체 시스템이 중단될 수 도있는 상황에 이를 수 있다.

 

그럼, 이런 문제들을 어떻게 해결했을까?

 

바로, CPU를 user mode와 kernel mode로 나누어서 실행하고 권한이 높은 명령(privileged instruction)인 HLT와 같은 명령어들은 kernel 모드에서만 작동할 수 있게 하는 것이다.

 

<privileged instruction은 직접 I/O에 접근할 수도 있고, 인터럽트의 주소를 가리키는 레지스터에 접근할 수도있고, 메모리의 상태관리를 해 줄 수도 있다. >

 

 

cpu가 user mode에서 app을 사용하고 있다가, 인터럽트 신호가 들어오면 cpu를 kernel mode로 바꾼 뒤, 일련의 명령들을 실행하고 다시 user mode로 바꿔서 app을 재실행하게 된다.

 

interrupt & Exception

 

그럼 의문점이 하나 생긴다. interrupt는 전기적 신호이고, 이는 H/W에 의해서 발생하는 신호인데, 그럼 application들도 원하는 때에 kernel 모드로 바꿔달라고 운영체제에게 요청할 수도 있지 않을까?

 

소프트웨어에서 발생하는 인터럽트를 우리는 Exception(예외)라고 부른다. 

Exception은 두 갈래로 나뉘는데, 사용자가 의도해서 발생되는 Trap과 의도하지 않았는데 발생되는 fault로 나뉜다. 0으로 나눈다거나, 권한이 없는 메모리에 접근을 하는 경우가 있다.

 

이 Exception은 동기적으로 일어난다.

이게 무슨 말이냐 하면, 우리가 프로그래밍을 할때 하는 실수를 생각해보자.

 

num1 = 1
num2 = 0
result = num1 / num2

if result:
...

위와 같은 경우, result는 1을 0으로 나눈 결과이기 때문에, 오류가 일어난다. 

즉, 0으로 나눈 그 코드 한 줄 때문에, 다음 코드가 실행이 되지 못하고 있는 것이다. 

 

반면에 H/W에서 발생하는 Interrupt는 언제 발생할 지 모른다. 이를 비동기적으로 작동한다고 한다.

 사용자가 키보드를 입력하거나, 마우스를 클릭하는 경우는 언제 일어 날 지 예상을 할 수 없다.

 

 

아무튼, 현대 OS들은 인터럽트 기반으로 작동된다고 하는데, 여기에서 말하는 인터럽트는, 예외(Exception)도 포함된 워딩이다.

 

그림을 좀 못 그리긴 하지만, 아래와 같은 형식으로 작동이 된다.

System Call은 OS에서 제공하는 서비스를 사용하기 위한 프로그래밍 인터페이스라고 정의할 수 있다. 

그리고 대부분 직접 시스템 호출이 아닌 고급 API를 통해 프로그램에 액세스한다.

API는 application에서 사용할 수 있도록, OS가 제공하는 서비스를 사용할 수 있게 만들어 놓은 인터페이스이다. 

 

설명이 좀 길어졌고, 나도 정확히 이해를 하지 못해서 횡설수설한것 같은데, 요약을 해 보자면

 

운영체제는 시스템을 보호하기 위해, System call을 사용한다. 이는, Applications들이 정해진 로직대로 시스템 콜을 사용하게 만들기 때문에 나쁜 app들의 악의적인 행동을 제한할 수 있다.

댓글