OS의 User mode, Kernel mode에 대해 알아보기 전,
한가지 먼저 알아야 할 것이 있다.
어찌보면 당연한 사실인데 놓치고 있던 한가지 사실은,
OS, 즉 운영체제또한 하나의 프로그램이라는 것이다.
운영체제 ( Operating System )는 컴퓨터 하드웨어와 소프트웨어 자원을 관리하는 시스템 소프트웨어이다.
컴퓨터 프로그램을 위해 보편적인 서비스를 제공하는 시스템 소프트웨어이다.
운영체제를 사용하는 가장 주된 목적은 컴퓨터의 하드웨어를 관리하는 것이다.
컴퓨터에는 수 많은 하드웨어가 존재한다.
CPU, 메모리, 디스크, 키보드, 마우스, 모니터, 네트워크 등이 있으며 이를 잘 관리해주어야 컴퓨터를 문제없이 효율적으로 사용할 수 있다.
운영체제는 사용자에게 편의를 제공하는 목적도 가지고 있다.
운영체제가 없다면 위에서 말한 하드웨어에 관한 모든 관리를 사용자가 해야한다는 점과 같이 컴퓨터를 사용하는데 매우 불편함을 겪을 것이다.
하지만 현재 많은 발전을 거쳐온 운영체제가 설치된 컴퓨터는 사용하기에 매우 편리하다는 것을 느낄 수 있다.
커널은 이러한 운영체제의 핵심, 심장과도 같은 역할을 한다.
출처 : 책 - 혼자 공부하는 컴퓨터 구조+운영체제 (강민철 저자님)
운영체제가 위 두가지 모드로 나뉘게 된 이유는 운영체제가 존재하는 이유 중 일부라고 볼 수 있다.
보통 운영체제에서는 커널모드와 유저모드 두가지 프로세서 접근모드를 지원한다. 그 이유는 유저 어플리케이션이 함부로 운영체제의 치명적인 데이터를 수정하거나 삭제하지 못하게 하기 위해서 이다. 커널모드는 모든 시스템과 메모리에 접근이 허가된 프로세스 실행 모드이다. 유저모드보다 커널모드에 더 높은 권한을 줌으로써 유저모드에서 에러가 발생했을 때 시스템 전체의 안전성을 보장해 준다.
사용자 모드(user mode)
커널 모드(kernel mode)
CPU에는 mode bit가 존재한다. 기계어를 실행할 때 OS 즉 커널 모드에서 실행되는지, 사용자 모드에서 실행되는 지 구분하기 위해 존재한다.
모니터 모드(= 커널 모드, 시스템 모드): mode bit이 0 일 때를 말하며 운영체제가 CPU를 사용하는 상태이다. CPU가 운영체제 의해서 실행이 될 때는 믿고 CPU를 넘겨줄 수 있어 보안을 해칠 수 있는 중요한 명령어도 수행할 수 있다. (모든 작업 수행 가능한 상태이다)
사용자 모드: mode bit이 1일 때를 말하며 OS가 사용자 프로그램에게 CPU를 넘겨준 상태이다. 사용자 프로그램은 완벽히 믿을 수가 없다. 예를 들어 무한루프를 돌린다든지, 메모리를 무한정 잡아먹든지. 따라서 위험한 기계어는 사용하지 못하고 안전한 기계어만 실행할 수 있도록 제약이 있다.
운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다. 비유하자면 운영체제(커널)는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 하는 셈이다. 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청해야 한다. 이때 ‘운영체제에 도움을 요청한다’는 말은 ‘운영체제 코드를 실행하려고 한다’는 말과 같다. 응용 프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다.
예를 들어 응용 프로그램이 실행 과정에서 하드 디스크에 접근하여 데이터를 저장하려면 운영체제에 도움을 요청해야 하고, 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램의 작업을 대신 수행해 준다.
사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 호출, System call(시스템 콜)이라고 한다.
Wiki에는 이렇게 적혀있다.
시스템 콜(system call), 간단히 시스콜(syscall)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
이름에서 알 수 있듯 명령이 아닌 요청(call)이다.
나라는 미천한 존재가 만든 프로그램은 커널에게 무엇인가를 요청하고 허락받아야 하드웨어에 관련된 처리를 수행할 수 있는 것이다.
부탁한다 커널! 하드디스크에 파일을 저장해줘! 같은 느낌으로 말입니다.
정리하자면 시스텝 콜이란, 운영체제의 서비스를 제공 받기 위해 커널모드로 전환하는 방법인 것이다.
시스템 호출은 일종의 인터럽트이다. 정확히는 소프트웨어적인 인터럽트이다. 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 한다.
그래서 CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사하다. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나간다.
시스템콜은 크게 6가지로 분류할 수 있다.
그렇다면 인터럽트란 무엇일까?
CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.
인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.
하드웨어 인터럽트
소프트웨어 인터럽트
인터럽트를 발생시키기 위해 하드웨어/소프트웨어는 cpu내에 있는 인터럽트 라인을 세팅하여 인터럽트를 발생시킨다.
cpu는 매번 명령을 수행하기 전에 인터럽트라인이 세팅되어있는지를 검사한다.
process A 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받았다고 가정해보자.
별첨:
https://didu-story.tistory.com/311
https://structuring.tistory.com/115
https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8