[OS] OS, User mode, Kernel mode, Interrupt, System call

정정일·2023년 1월 13일
0

OS란

OS의 User mode, Kernel mode에 대해 알아보기 전,
한가지 먼저 알아야 할 것이 있다.

어찌보면 당연한 사실인데 놓치고 있던 한가지 사실은,
OS, 즉 운영체제또한 하나의 프로그램이라는 것이다.

운영체제 ( Operating System )는 컴퓨터 하드웨어와 소프트웨어 자원을 관리하는 시스템 소프트웨어이다.
컴퓨터 프로그램을 위해 보편적인 서비스를 제공하는 시스템 소프트웨어이다.

운영체제가 존재하는 이유는?

운영체제를 사용하는 가장 주된 목적은 컴퓨터의 하드웨어를 관리하는 것이다. 
컴퓨터에는 수 많은 하드웨어가 존재한다. 
CPU, 메모리, 디스크, 키보드, 마우스, 모니터, 네트워크 등이 있으며 이를 잘 관리해주어야 컴퓨터를 문제없이 효율적으로 사용할 수 있다.
  
운영체제는 사용자에게 편의를 제공하는 목적도 가지고 있다. 
운영체제가 없다면 위에서 말한 하드웨어에 관한 모든 관리를 사용자가 해야한다는 점과 같이 컴퓨터를 사용하는데 매우 불편함을 겪을 것이다. 
하지만 현재 많은 발전을 거쳐온 운영체제가 설치된 컴퓨터는 사용하기에 매우 편리하다는 것을 느낄 수 있다.

커널은 이러한 운영체제의 핵심, 심장과도 같은 역할을 한다.

image url
출처 : 책 - 혼자 공부하는 컴퓨터 구조+운영체제 (강민철 저자님)

User mode? Kernel mode?

운영체제가 위 두가지 모드로 나뉘게 된 이유는 운영체제가 존재하는 이유 중 일부라고 볼 수 있다.

보통 운영체제에서는 커널모드와 유저모드 두가지 프로세서 접근모드를 지원한다. 그 이유는 유저 어플리케이션이 함부로 운영체제의 치명적인 데이터를 수정하거나 삭제하지 못하게 하기 위해서 이다. 커널모드는 모든 시스템과 메모리에 접근이 허가된 프로세스 실행 모드이다. 유저모드보다 커널모드에 더 높은 권한을 줌으로써 유저모드에서 에러가 발생했을 때 시스템 전체의 안전성을 보장해 준다.

  1. 사용자 모드(user mode)

    • 일반적인 명령 실행 가능
    • 응용 프로그램이 사용
    • 시스템 데이터에 제한된 접근만이 허용, 하드웨어 직접 접근 불가.
    • System call시 유저모드에서 커널모드로 잠시 전환됨.
  2. 커널 모드(kernel mode)

    • 특권 명령어 실행과 원하는 작업 수행을 위한 자원 접근을 가능하게 하는 모드
    • OS가 사용(OS가 CPU를 쓸 때 사용하는 모드)

mode bit

image url

CPU에는 mode bit가 존재한다. 기계어를 실행할 때 OS 즉 커널 모드에서 실행되는지, 사용자 모드에서 실행되는 지 구분하기 위해 존재한다.

  • 모니터 모드(= 커널 모드, 시스템 모드): mode bit이 0 일 때를 말하며 운영체제가 CPU를 사용하는 상태이다. CPU가 운영체제 의해서 실행이 될 때는 믿고 CPU를 넘겨줄 수 있어 보안을 해칠 수 있는 중요한 명령어도 수행할 수 있다. (모든 작업 수행 가능한 상태이다)

  • 사용자 모드: mode bit이 1일 때를 말하며 OS가 사용자 프로그램에게 CPU를 넘겨준 상태이다. 사용자 프로그램은 완벽히 믿을 수가 없다. 예를 들어 무한루프를 돌린다든지, 메모리를 무한정 잡아먹든지. 따라서 위험한 기계어는 사용하지 못하고 안전한 기계어만 실행할 수 있도록 제약이 있다.

image url

Kernel mode

image url

운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다. 비유하자면 운영체제(커널)는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 하는 셈이다. 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청해야 한다. 이때 ‘운영체제에 도움을 요청한다’는 말은 ‘운영체제 코드를 실행하려고 한다’는 말과 같다. 응용 프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다.

image url

예를 들어 응용 프로그램이 실행 과정에서 하드 디스크에 접근하여 데이터를 저장하려면 운영체제에 도움을 요청해야 하고, 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램의 작업을 대신 수행해 준다.

사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 호출, System call(시스템 콜)이라고 한다.

System call

Wiki에는 이렇게 적혀있다.

시스템 콜(system call), 간단히 시스콜(syscall)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.

이름에서 알 수 있듯 명령이 아닌 요청(call)이다.

나라는 미천한 존재가 만든 프로그램은 커널에게 무엇인가를 요청하고 허락받아야 하드웨어에 관련된 처리를 수행할 수 있는 것이다.


부탁한다 커널! 하드디스크에 파일을 저장해줘! 같은 느낌으로 말입니다.

image url

정리하자면 시스텝 콜이란, 운영체제의 서비스를 제공 받기 위해 커널모드로 전환하는 방법인 것이다.

시스템 호출은 일종의 인터럽트이다. 정확히는 소프트웨어적인 인터럽트이다. 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 한다.

그래서 CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사하다. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나간다.

image url

시스템콜은 크게 6가지로 분류할 수 있다.

  • 프로세스 제어 (Process Control)
    • 끝내기(exit), 중지 (abort)
    • 적재(load), 실행(execute)
    • 프로세스 생성(create process) - fork
    • 프로세스 속성 획득과 속성 설정
    • 시간 대기 (wait time)
    • 사건 대기 (wait event)
    • 사건을 알림 (signal event)
    • 메모리 할당 및 해제
  • 파일 조작 (File Manipulation)
    • 파일 생성 / 삭제 (create, delete)
    • 열기 / 닫기 / 읽기 / 쓰기 (open, close, read, wirte)
    • 위치 변경 (reposition)
    • 파일 속성 획득 및 설정 (get file attribute, set file attribute)
  • 장치 관리 (Device Manipulation)
    • 하드웨어의 제어와 상태 정보를 얻음 (ioctl)
    • 장치를 요구(request device), 장치를 방출 (relese device)
    • 읽기 (read), 쓰기(write), 위치 변경
    • 장치 속성 획득 및 설정
    • 장치의 논리적 부착 및 분리
  • 정보 유지 (Information Maintenance)
    • 시간과 날짜의 설정과 획득 (time)
    • 시스템 데이터의 설정과 획득 (date)
    • 프로세스 파일, 장치 속성의 획득 및 설정
  • 통신 (Communication)
    • 통신 연결의 생성, 제거
    • 메시지의 송신, 수신
    • 상태 정보 전달
    • 원격 장치의 부착 및 분리

Interrupt

그렇다면 인터럽트란 무엇일까?

CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.

인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.

  • 하드웨어 인터럽트

    • 하드웨어가 발생시키는 인터럽트로, CPU가 아닌 다른 하드웨어 장치가 cpu에 어떤 사실을 알려주거나 cpu 서비스를 요청해야 할 경우 발생시킨다.
  • 소프트웨어 인터럽트

    • 소프트웨어가 발생시키는 인터럽트이다. 소프트웨어(사용자 프로그램)가 스스로 인터럽트 라인을 세팅한다.
    • 종류: 예외 상황, system call

인터럽트를 발생시키기 위해 하드웨어/소프트웨어는 cpu내에 있는 인터럽트 라인을 세팅하여 인터럽트를 발생시킨다.
cpu는 매번 명령을 수행하기 전에 인터럽트라인이 세팅되어있는지를 검사한다.

하드웨어 인터럽트 종류

  • 입출력 인터럽트 (I/O interrupt) - 입출력 작업의 종료나 입출력 오류에 의해 CPU의 기능이 요청됨
  • 정전,전원 이상 인터럽트(Power fail interrupt) - 전원 공급의 이상
  • 기계 착오 인터럽트(Machine check interrupt) - CPU의 기능적인 오류
  • 외부 신호 인터럽트(External interrupt) - I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우

소프트웨어 인터럽트 종류

  • 프로그램 검사 인터럽트 (Program check interrupt)
    • 0으로 나누는 경우
    • OverFlow/UnderFlow
    • 페이지 부재
    • 부당한 기억장소의 참조
    • 등등...
  • SVC(Supervisor Call: 감시프로그램 호출)인터럽트
    • 사용자가 프로그램을 실행시키거나 supervisior을 호출하는 동작을 수행하는 경우
    • 프로그래머에 의해 코드로 짜인 감시 프로그램을 호출하는 방식

인터럽트 과정

process A 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받았다고 가정해보자.

  • process A는 system call을 통해 인터럽트를 발생시킨다.
  • CPU는 현재 진행 중인 기계어 코드를 완료한다.
  • 현재까지 수행중이었던 상태를 해당 process의 PCB(Process Control Block)에 저장한다. (수행중이던 MEMORY주소, 레지스터 값, 하드웨어 상태 등...)
  • PC(Program Counter, IP)에 다음에 실행할 명령의 주소를 저장한다.
  • 인터럽트 벡터를 읽고 ISR 주소값을 얻어 ISR(Interrupt Service Routine)로 점프하여 루틴을 실행한다.
  • 해당 코드를 실행한다.
  • 해당 일을 다 처리하면, 대피시킨 레지스터를 복원한다.
  • ISR의 끝에 IRET 명령어에 의해 인터럽트가 해제 된다.
  • IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행 위치로 복원한다.

image url

인터럽트 우선순위

image url


별첨:
https://didu-story.tistory.com/311

https://hongong.hanbit.co.kr/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80-%EC%BB%A4%EB%84%90%EC%9D%98-%EA%B0%9C%EB%85%90-%EC%9D%91%EC%9A%A9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%A4%ED%96%89%EC%9D%84-%EC%9C%84%ED%95%9C/

https://structuring.tistory.com/115

https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8

https://doh-an.tistory.com/31

profile
하루하루 더 발전하는 사람이 되기 위해 노력하는 개발자가 되고자 합니다.

0개의 댓글