본문 바로가기

별걸다하는 IT/운영체제 OS

[운영체제 I/O Protection] 유저(User)모드 vs 커널(Kernel)모드 (모니터 모드)- 듀얼 모드

[운영체제 목차]

안녕하세요 ! 오랜만에 Chapter1 포스팅으로 돌아왔어요 ㅎㅎㅎ

운영체제 공부하다보면 커널에 대해서 배우게 되고 그 다음 듀얼모드 멀티모드 배우고 듀얼모드 중에서도 유저모드 커널모드 이렇게 배우게 되는데요 ㅎㅎ

제가 포스팅을 차례대로 하면 너무 의욕이 안나서잉...ㅎㅎㅎ 왔다갔다 chapter를 넘나들며 포스팅을 하는 편인데, 그럴때마다 한 포스팅의 범위를 어떻게 잡아야할지, 어떻게 분류하는게 좋을지 고민이 되더군요 ㅎㅎㅎ

또 잡소링....ㅎㅎ

 

오늘은 사람들이 많이 궁금해 할 것 같은 유저모드 vs 커널 모드에 대해서 알아보겠습니다. 왠지 주저리 주저리 말이 길어질 것 같은 기분 ㅠㅠ 하지만 분명 읽으면 도움 될 거라고 자부해요!

CPU에 두가지 모드가 있는 이유?

결론적으로 말하면 I/O장치를 보호하기 위함이예요ㅎㅎ

쉽게 설명하는데는 예시 만한 것이 없죠~!!

컴퓨터 하드디스크에 있는 내용을 싹 지워버리는 악의적인 프로그램을 어떤 사람이 만들었다고 해봐요 ㅎㅎ 중요한 자료들이 날라갈 것을 생각하니 상상만 해도 큰 문제가 발생할 거란걸 알 수 있겠죠?

이런 상황을 방지하기 위해 어플리케이션 프로그램들은 직접 I/O장치에 접근할 수 없게 만들고 운영체제를 통해서만 I/O장치를 사용할 수 있게 하는거예요. 이렇게 I/O protection을 수행하는 거죠!

그니까 어떤 프로그램이 '나 디스크에서 어떤 데이터 좀 읽어줘!' 이러면 그 운영체제가 그 장치를 구동시켜서 파일을 익은 후 해당 application에게 전달하는 거예요!!

 

그런데 만약에~~ 어떤 나쁜놈이 application program에다가 어셈블리 프로그램으로 그런 기계어 코드를 넣었어요 ㅎㅎ 그럼 얘는 운영체제의 도움을 요청하지 않고 하드웨어에 직접적으로 실행할거 아니예요? 'I/O 데이터를 지워' 이런 명령을 어셈블리어로 작성해서 직접 명령을 내리는거죠. 이게 안돌아가도록 하려면 이런 명령어가 나오면 CPU가 '아 이 명령어는 내가 실행하면 안되겠구나' 이런 걸 판단할 수 있어야 해요. 

이를 위해 CPU에 유저모드! 커널모드! 두 가지 모드가 존재하는 거랍니다! 동작 방법을 아례에서 천천히 살펴볼게요.

 

운영체제에서 가장 중요한 것이 CPU관리, 메모리 관리, I/O관리라고 이전 포스팅에서 언급했었죠?

이 중 I/O protection을 행하는 방법이 이 모드를 사용하는 거예요 ㅎㅎ

유저 모드와 커널 모드

그림1

CPU에 두 가지 모드가 있다고 했어요 ㅎㅎ 유저 모드가 있고 모니터 모드가 있는데 보통 유저모드와 커널모드로 부르는 것이 더 일반적입니다.

커널 모드(Kernel mode)와 유저 모드(User mode)란?

쉽게 말해 어플리케이션 프로그램이 수행되는 모드는 유저모드입니다. 프로그램이 수행되다가 인터럽트 걸려서 운영체제가 호출돼 수행되는 모드는 커널모드예요. 

 

A bit, called the mode bit, is added to hardware of the computer to indicate the current mode: kernel(0) or user(1)

커널 모드인지 유저 모드인지 어떻게 구분하냐면 모드 비트(mode bit)라는 것이 있는데 이 비트가 1이면 보통 유저모드를, 0이면 커널 모드를 가리킵니다.

그림2

그림 1처럼 무한루프를 도는데, 이 무한루프가 이렇게 user process와 커널을 왔다갔다 하면서 돕니다.

보통 코드가 수행될 때는 유저 모드에서 도는거예요. 프로그램을 수행하다가 인터럽트가 딱 걸려서! 운영체제가 수행될 때는 커널모드로 전환됩니다.

 

한 예로, I/O 장치에다가 데이터를 쓰는 명령어 in/out 이런 기계어 명령어가 있어요.

데이터를 읽어들이는 명령어가 in이고 I/O 디바이스 컨트롤러 레지스터에 값을 쓰는 명령어가 out입니다.

이런 in/out같은 명령어들은 유저모드에서 돌아가면 안되겠죠? 실제로 커널 모드에서 돌아가게끔 되어 있고 유저모드에서는 돌아갈 수 없게 CPU가 하드웨어적으로 만들었어요.

 

어떤 어플리케이션 프로그램 한 부문에다가 어셈블리 프로그램으로 이 디스크에다가 0을 다 써버리는 프로그램을 만들었다고 하더라도 이거를 컴파일하면 이 명령어가 out과 같은 명령어겠죠? 근데 이게 유저모드에서 돌고 있잖아요. 그럼 CPU가 아 이 명령어는 내가 수행하면 안되는거네! 하고 자기 자신에게 exception을 겁니다!(인터럽트 포스팅에서 말했듯이 exception, trap은 자기 자신에게 거는 인터럽트를 말해요) 그리고 그 프로세스를 종료시켜버려요 이렇게 I/O Protection을 수행하는 거~

 

사진을 보면 system call이라는게 있는데, 프로그램이 어떤 자료가 필요해! 이러면 얘가 직접 access 하는 것이 아니라 운영체제한테 요청을 해요. 이 운영체제한테 요청하는 interface를 시스템 콜이라고 하는데 나중에 또 따로 포스팅을 다룰 예정입니다. 이 정도 이해하고 계시면 충분해요 ㅎㅎ

 

또 사진에서 보이는 trap(=exception) 인터럽트를 걸면서 비트 모드를 바꾸고 커널 모드로 들어가죠 ㅎㅎ 나올 때도 마찬가지!

대표사진 삭제

그림3

application이 디스크에서 데이터를 읽으려면 운영체제에게 요청을 해야하잖아요. 이게 그림3입니다.

Netscape = 웹브라우저. 옛날에 우리 Windows에서 Internet Explorer가 없었던 시절에 웹 브러우저 중에 넘버 원이 Netscape였어요. 그런데 Internet Explorer를 마이크로소프트에서 Windows에다가 끼어서 설치시켰죠 ㅎㅎ.그래서 Internet Explorer가 널리 쓰이게 된 것~ (잡담..ㅎㅎㅎ)

 

웹브라우저에서 read()라고 해서 File을 읽어옵니다. 파일이 필요하다 그러면 얘가 직접 read를 하는 것이 아니라 운영체제한테 요청을 해요. 이 운영체제한테 요청하는 interface를 시스템 콜이라고 앞에 언급했어요 ㅎㅎ

 

하여튼 지금 단계에서는 요청을 하고 운영체제가 I/O장치에다가 명령을 내려가지고 그 결과가 나오면 그거를 다시 application program한테 전달합니다. 이것이 I/O protection의 기본적인 개념이예요.

커널 모드는 CPU 명령어 이고 특정한 권한이 있어야만 수행되는 명령어이기 때문에 Privileged mode라고 불리기도 합니다. privileged는 별 게 아니라 리눅스로 치면 권한 같은 거예요.ㅎㅎ root와 같은 특별한 관리자 계정이 따로 있는 이유가 일반적인 유저가 할 수 있는 일과 관리자가 할 수 있는 일을 나누기 위해서고, 커널과 유저모드도 결국 아무나 접근하면 안되니까 권한을 나눠서 보호하겠다는 거니까요 ㅎㅎ

그 외 커널모드는 supervisor mode, system mode, monitor mode라고도 불려요 ㅎㅎ

 

32bit 이상의 CPU 들은 다 이런 여러 모드로 동작을 하는데 8 bit micro controller이런 경우에는 이런게 없어요. 저럴 경우에는 어플리케이션이 I/O장치를 직접 다 access하고 그럽니다.

 

전공 문장이라 어려워 보이지만,

내 포스팅 글을 보고 나면 한 결 더 이해가 쉬워지는 요약 글들 ㅎㅎ

 

커널모드 특징

- 시스템의 모든 메모리에 접근 할 수 있고 모든 CPU 명령을 실행 할 수 있다.

- 운영체제 코드나 디바이스 드라이버 같은 커널 모드 코드를 실행한다.

- CPU는 커널 모드 특권 수준에서 코드를 실행한다.

 

유저모드 특징

- 사용자 애플리케이션 코드가 실행한다.

- 시스템 데이터에 제한된 접근만이 허용되며 하드웨어를 직접 접근 할 수 없다.

- 유저 애플리케이션은 시스템 서비스 호출을 하면 유저모드에서 커널 모드로 전환된다.

- CPU 유저 모드 특권 수준으로 코드를 실행한다

- 유저모드에서 실행하는 스레드는 자신만의 유저모드 스택을 가진다.

오늘은 여기까지입니다! 도움이 되셨나요? 오늘 사진보다 글이 너무 많아서 쓰기가 힘드네요 ㅎㅎ

왠지 사진이 많아야 여러분이 읽기도 수월할 것 같은데 다음엔 배분을 잘해보는걸로...ㅎㅎㅎ

공감 or 댓글 or 광고로 보답해주시면 더 질 좋은 포스팅으로 찾아뵐게요! 오늘도 방문해주셔서 감사합니다

  • 헬린이 2020.02.02 14:18

    공부 열심히하고있어요!! 혹시 공부한 내용을 제 개인 공부블로그에 비공개로 정리해서 업로드해도되나용???

  • ㅇㅅㅇ 2020.02.20 17:22

    너무 친절하게 정리해 주신 글 덕분에 시스템 보안을 이해하는데 도움이 많이 됩니다~ 감사해요!!

  • 개발초보 2020.05.11 19:44

    이해하는데 도움됐습니다 감사합니다 ㅎㅎ

  • 질문있어욤 2020.09.29 15:39

    커널모드로 변경될때 컨텍스트 스위칭이 발생하나요?

  • 개똥이 2020.10.14 17:10

    좋은 글 정말 감사합니다!!
    하지만 부족한 제 머리로 이해가 되지 않은 부분이 있어 질문 드립니다. ㅠㅠ

    글 중간에 예시로 "악의적인 누군가가 디스크에다 0을 쓰라는 프로그램을 만들고 이를 수행하려는 경우"가 있었습니다.
    해당 프로그램을 컴파일하면 out과 같은 명령어를 실행하려는 단계에서, cpu가 유저모드에서 커널모드로 전환할 것으로 이해했습니다.
    근데 여기서 전환시에 이 명령어가 악의적인 목적인지를 어떻게 판단하고 커널모드로 전환하지 않고 해당 프로세스를 종료시키는지에 대해서 궁금합니다!

    저의 질문을 읽어주셔서 감사드리고 답변기다리겠습니다. ㅠㅠ