[SW_Jungle] Kernel mode vs User mode

Jin Lee·2022년 1월 2일
0

PintOS

목록 보기
8/16
post-thumbnail

커널

운영체제의 핵심 부분으로 운영체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러가지 서비스를 제공함, 자원을 효율적으로 관리하기 위해 CPU 스케줄링, 메모리관리, 입출력관리, 파일시스템 관리 등의 업무를 수행

커널의 3가지 역할

  • 보안 : 하드웨어와 프로세스의 보안을 책임짐
  • 자원관리 : 한정된 시스템 자원을 효율적으로 관리하여 프로그램의 실행을 원활하게 함
  • 추상화 : 운영체제의 복잡한 내부를 감추로 일과성있는 인터페이스를 하드웨어에게 제공하기 위함

커널 관련 이슈

  • 커널은 시스템 호출을 통해 호출되는 단순 함수/데이터의 집합으로 스스로 실행되는 프로세스가 아님
  • 커널은 시스템 호출/인터럽트를 통해 커널코드/ISR이 실행되고 있을 뿐 실행되고 있는 상태가 아님
  • 각 프로세스/스레드가 스택/힙을 소유하고 있고 커널은 스택이나 힙을 가지고 있지 않음

디바이스 드라이브

  • 특정 하드웨어나 장치를 제어하기 위해 커널의 일부분으로 동작하는 프로그램. 컴퓨터를 구성하는 다양한 입출력 장치마다 각각 장치 드라이버가 프로그램에 커널에 통합되어 실행
  • 모든 입출력장치와 컴퓨터가 서로 알아들을 수 있게 통역해 주는 역할
  • 컴퓨터의 버스나 통신 시스템을 이용하여 하드웨어와 커널 사이에서 명령어나 데이터를 전달해주는 역할

커널에서 중요한 자원을 관리하기 때문에, 사용자가 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나눈것이 커널모드유저모드

유저모드와 커널모드

  • 유저모드
    • 유저가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드
    • 코드작성, 프로세스를 실행하는 등의 작업 가능
    • 시스템 데이터에 제한된 접근만이 허용되며 하드웨어 직접 접근 불가
    • 유저 어플리케이션 코드가 유저모드에서 실행된다 라고 요약 가능
  • 커널모드
    • 모든 자원(드라이버, 메모리, CPU 등)에 접근과 명령을 할 수 있음

사용자가 직접적으로 하드웨어 장치를 제어한다면 큰 문제가 발생할 수 있기 때문에 유저 어플리케이션은 system call을 통해 직접적인 하드웨어 요청이나 중요한 시스템을 요청

system call

운영체제의 저널이 제공하는 서비스에 대해 응용프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
보통 C나 C++과 같은 고급언어로 작성된 프로그램들은 직접 시스템 호출 방법을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법

유저모드와 커널 모드의 전환 : 프로세스가 실행되는 동안에 프로세스는 수없이 유저모드와 커널모드를 왔다갔다 하면서 실행

(유저모드 -> 커널모드 요청)
프로세스가 유저모드에서 실행되다가 특별한 요청이 필요할때 system call을 이용해서 커널에 요청

(커널모드 -> 유저모드로 반환)
system call의 요청을 받은 커널이 그 요청에 대한 일을 하고 결과값을 system call의 리턴 값으로 전함

전체적인 흐름


흐름1) 유저모드에서 실행되고 있는 유저 어플리케이션에서 시스템콜이나 라이브러리 함수를 통해서 I/O 요청
-> 커널 모드로 전환. 커널의 I/O 관리자가 키보드나 모니터의 장치드라이버에 요청
-> 장치드라이버에서 키보드나 모니터에서 받은 return 값을 커널에 return
-> 커널은 해당 값을 user application으로 return
-> 유저모드로 전환.
흐름2) 유저모드에서 C언어로 작업중 malloc 를 통해서 메모리 할당을 받으려고 system call 호출
-> 커널 모드로 전환. 메모리 [관리 할당 or 잘못된 접근] return값을 user application으로 전달
-> 유저모드로 전환.

ref)
1. https://blockdmask.tistory.com/69
2. https://www.youtube.com/watch?v=t8VWeIkaBe8
3. https://medium.com/pocs/%EC%BB%A4%EB%84%90-kernel-c5e19f8b34c0

profile
깃허브 : https://github.com/jinlee9270

0개의 댓글