systemcall

반응형


  시스템 보안에 대해 정리하기에 앞서 운영체제(OS, Operating System)에 대해 간략히 정리하려고 한다. 운영체제란 컴퓨터 하드웨어와 사용자 간의 인터페이스 역할을 해주는 것으로서, 사용자 대신 컴퓨터 시스템의 자원들을 효율적으로 관리 및 운영하게 함으로써, 사용자에게 최대의 편리성을 제공해주는 시스템 프로그램을 의미다. 운영체제의 목적은 처리량(throughput)의 향상, 신뢰도(reliability) 향상, 응답 시간(response time)의 최소화, 반환 시간(turn-around time)의 최소화, 사용 가능도(availability)의 향상으로 정리할 수 있다. 처리량 향상이란, 어떤 일정한 단위시간 내에 처리할 수 있는 일의 양으로 수치가 높을수록 좋다. 신뢰도 향상이란, 시스템이 자신에게 주어진 문제를 얼마나 정확하게 해결할 수 있는지를 의미다. 응답 시간의 최소화란, 주어진 입력에 대해서 반응을 나타내기까지의 시간으로 시간이 짧을수록 좋다. 반환시간의 최소화란, 컴퓨터 시스템을 이용하여 하나의 작업이 완료되는데 걸리는 시간을 말하는 것으로 이것 역시 시간이 짧을수록 좋다. 사용 가능도 향상이란, 얼마나 빨리 사용자가 시스템을 사용할 수 있는지를 의미다. 이러한 목적들을 만족시키기 위해서 운영체제는 다양한 기능들을 제공다. 크게 자원 할당과 각종 제어 기능, 사용자 편의 기능 등을 제공다. 자원 할당은, 여러 사용자 또는 여러 작업들이 동시에 CPU, 메모리, 파일과 같은 자원을 사용하고 싶다고 요구할 때, 그들에게 자원을 적절히 할당해주어야 하는 것을 의미다. 운영체제는 또한 다양한 기능들을 제어하게 되는데, 입출력 장치의 제어, 사용자 프로그램의 제어 등을 수행다. 그리고 사용자가 컴퓨터를 쉽게 사용할 수 있도록 CLI(Command Line Interface)나 GUI(Graphical User Interface)와 같은 사용자 인터페이스를 제공다. 이 밖에도 운영체제는 오류를 탐지하거나 추적 및 감사를 하고, 시스템의 보호와 보안 등을 담당다. 대표적인 운영체제에는 리눅스, 유닉스, 마이크로소프트사의 윈도우가 있으며 요즘에는 모바일 운영체제인 안드로이드와 IOS도 있다. 이중 리눅스는 소스코드는 GPL-GNU Public License를 가지고 있는 공개된 소스코드이다.


  운영체제가 잘 동작하기 위해서 운영체제 코드의 실행과 사용자 정의 코드의 실행이 분리된다. 이 때문에 독립된 연산 모드를 제공하게 되는데 이를 이중 모드 혹은 듀얼 모드라고 칭다. 운영체제의 코드를 실행하는 모드는 커널 모드 또는 특권 모드라고 하고, 사용자 정의 코드를 실행하는 모드를 사용자 모드라고 다. 사용자 모드는 시스템 자원에 제한적으로 접근할 수 있는 모드로 제한적인 명령어만 사용 가능다. 커널 모드 또는 특권 모드는 관리자 모드라 고도 하는데, 모든 명령어 사용이 가능해진다. 컴퓨터 시스템이 사용자 응용을 위해서 실행될 때는, 사용자 모드에서 컴퓨터가 동작하게 된다. 그러다가 사용자 응용이 운영체제로부터 무언가를 요구하게 되면, 이 요구는 시스템 호출(system call)이라는 것을 통해 이뤄지게 되고 컴퓨터는 커널 모드로 전환되어서 동작하게 된다. 시스템 호출이란, 컴퓨터 하드웨어와 사용자 사이의 인터페이스 또는 함수로서, 컴퓨팅 자원을 효율적으로 관리하기 위해 허가되지 않는 사용자의 침범을 방지하여 프로그램의 독립적인 수행을 보장하는 것이다. 각 모드는 모드 비트(mode bit)라는 것을 이용해서 구분하게 된다. 이 시스템 호출은 보통 인터럽트 벡터의 특정 위치에 트랩을 거는 식으로 구현되게 된다. 시스템 호출에는 프로세스 관리를 위한 fork(), exec 계열 함수들, getpid() 등의 함수와, 파일 시스템을 조작할 수 있는 open(), read(), write(), close() 등의 함수들, 메모리 관리를 위한 함수들, 네트워크 관리를 위한 socket(), connect()와 같은 함수들 등이 있다. 커널에 사용자 정의 함수를 구현하여 사용자 정의 시스템 호출 함수를 만들 수도 있다. 시스템 호출은, 사용자 프로그램에서 라이브러리를 통해 fork()와 같은 함수를 부르면, 소프트웨어 인터럽트가 발생하여 사용자 모드에서 커널 모드로 전환된다. 커널 모드에서 시스템 호출 번호를 알아내어 시스템 호출 함수를 실행하고, 커널에게 사용자 응용의 요구 사항을 넘겨준다. 그러면 커널에서는 사용자 응용이 요구한 대로 적절하게 동작을 수행하게 된다.

반응형

+ Recent posts