<개인공부>/[Operating System]

[운영체제] 유저모드와 커널모드에 대해서.

BlockDMask 2017. 7. 19. 15:52
반응형

  • 안녕하세요, BlockDMask입니다.

  • 오늘은 운영체제의 유저모드와 커널모드에 대해서 알아보도록 하겠습니다.

  • 글로 먼저 설명을 하고, 그림을 통해서 설명하겠습니다.

  • 제가 학교에서 수강했던 Unix system programming 수업과 OS 수업에서 배운 내용을 정리했습니다.

  • 혹시 내용에 이상한 점이 있으면 댓글로 지적해주시면 감사하겠습니다.

<목차>

1. 커널이란?

2. 디바이스 드라이버란?

3. 유저모드와 커널모드란.

4. 유저모드와 커널모드의 전환.

5. 전체적인 흐름.


1. 커널이란?

  • 위키피디아 에서 정의하길  
    "컴퓨터 과학에서 커널(Kernel)은 운영체제의 핵심 부분으로서, 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러가시 서비스를 제공한다." 라고 정의 되어있습니다. 
    제가 말하고 싶은 것은, "운영체제의 중요한 부분"이다. 라는것 입니다.

  • 커널의 역할은 세가지가 있습니다.
    보안, 자원관리, 추상화
    제가 학교에서 중점으로 배운것은 커널의 자원관리 였습니다.

  • 컴퓨터의 자원(resource) 이라는것은 CPU, 메모리, 가상메모리, 뭐 키보드 마우스 등 과 추상적으로는 쓰레드, 패킷, 프로토콜, 테스크 를 말합니다.
    간단히 말해서 컴퓨터 내부의 모든?(거의대부분?)의 것이라고 생각하면 됩니다.
  • 운영체제의 커널은 이러한 자원을 효율적으로 관리하기위해서 CPU 스케줄링, 메모리관리, 입출력관리, 파일시스템 관리 등의 업무를 수행합니다.

2. 디바이스 드라이버란?

  • 위키피디아에서 정의하길
    "특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로 동작하는 프로그램이다. 컴퓨터를 구성하는 다양한 입출력 장치마다 각각 장치 드라이버가 프로그램 커널에 통합되어 실행된다."
    라고 정의 되어있습니다.


  • 쉽게 이야기하면, 우리가 쓰는 모든 입출력장치(블루투스 키보드, 유선 모니터, 마우스, 복합기 등)와 컴퓨터(OS)가 서로 알아들을 수 있게 통역해주는 역할이라고 말할 수 있습니다.

  • 조금 어렵게 이야기하면, 컴퓨터의 버스나 통신 시스템을 이용하여 하드웨어와 커널 사이에서 명령어나 데이터를 전달해주는 역할을 합니다.

  • 이러한 디바이스 드라이버는 장치에 의존적(장치마다 작동하는게 다 다름)이기 때문에 각각 장치마다 장치 드라이버가 존재합니다.
    USB 같은 경우에는 통합 드라이버가 존재하여서, winOS에서 제공해주고 있습니다.

  • 예전에 (저는 91년생) 90년대 2000년대 제가 윈도우 95 98을 사용했을때에 프린터기를 사면 그에 따른 장치 드라이버 CD를 줬습니다. 그래서 그 드라이버를 설치하지 않으면, 컴퓨터가 프린터기를 인식하지 못했었습니다. 이처럼 새로운 하드웨어와 OS는 서로 만난 적이 없기때문에 중간에 처리를 해주는 놈(디바이스 드라이버)이 필요합니다.
    +(유저모드에서 돌아가는 드라이버도 있습니다)

3. 유저모드와 커널모드란.

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

  • 유저모드
    유저(사용자)가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드 입니다.

    : 우리는 여기서 코드를 작성하고, 프로세스를 실행하는 등의 행동을 할 수 있습니다.
    : 간단하게 유저 어플리케이션 코드가 유저모드에서 실행된다. 라고 말할 수 있습니다.
  • 커널모드
    : 모든 자원(드라이버, 메모리, CPU 등)에 접근, 명령을 할 수 있습니다. 

    : 유저모드와는 비교가 안되게 컴퓨터 내부에서 모든 짓? 을 할 수 있다고 생각하면 되겠습니다

4. 유저모드와 커널모드의 전환.

  • 프로세스가 실행되는 동안에 프로세스는 수없이 유저모드와 커널모드를 왔다갔다 하면서 실행 됩니다.

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

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

  • 예를 들어 프로세스가 실행되고있는 중에 라이브러리 함수인 fopen함수를 호출했다고 가정해보겠습니다.
    그렇게되면 fopen 내부에서 system call인 open을 호출하면서
    커널모드로 넘어갑니다.
    open에 대한 입력값이 커널로 전달이 되고 해당 일을 완료하고 커널에서 return을 해주면서
    유저모드로 돌아가게됩니다.

    이해를 돕기위해 오늘도 그림을 그려보았습니다.
    핑크색 형광팬을 친 흐름으로 돌아가게됩니다. 저런흐름이 수없이 반복되면서 프로세스가 실행이됩니다.

5. 전체적인 흐름.

  • 지금까지 설명한 것을 그림으로 나타내 보겠습니다.

  • 흐름1) 유저모드에서 실행되고 있는 유저 어플리케이션에서 시스템콜이나 라이브러리 함수를 통해서 I/O 요청
    ->
    커널 모드로 전환.  커널의 I/O 관리자가 키보드나 모니터의 장치드라이버에 요청
    ->
    장치드라이버에서 키보드나 모니터에서 받은 return 값을 커널에 return
    -> 커널은 해당 값을 user application으로 return
    -> 유저모드로 전환.

  • 흐름2) 유저모드에서 C언어로 작업중 malloc 를 통해서 메모리 할당을 받으려고 system call 호출
    -> 커널 모드로 전환. 메모리 [관리 할당 or 잘못된 접근] return값을 user application으로 전달
    -> 유저모드로 전환.

**학교에서 학습한 것과, 참고서적 및 구글링을 통해 공부하면서 정리한 내용입니다.

https://ko.wikipedia.org/wiki/%EC%9E%A5%EC%B9%98_%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84

반응형