[운영체제 목차]
안녕하세요 ! 오랜만에 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을 행하는 방법이 이 모드를 사용하는 거예요 ㅎㅎ
유저 모드와 커널 모드
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이면 커널 모드를 가리킵니다.
그림 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 광고로 보답해주시면 더 질 좋은 포스팅으로 찾아뵐게요! 오늘도 방문해주셔서 감사합니다
공부 열심히하고있어요!! 혹시 공부한 내용을 제 개인 공부블로그에 비공개로 정리해서 업로드해도되나용???
네넵 괜찮습니다. 이렇게 말해주셔서 감사해요
감사해요!! 남들모르게 비공개해서 공부하겠습니다 (광고 여러개누른건 안비밀)
너무 친절하게 정리해 주신 글 덕분에 시스템 보안을 이해하는데 도움이 많이 됩니다~ 감사해요!!
시간내서 답변달아주셔서 감사합니다. 도움이되었다니 보람을 느끼네요
이해하는데 도움됐습니다 감사합니다 ㅎㅎ
감사합니다!
커널모드로 변경될때 컨텍스트 스위칭이 발생하나요?
좋은 글 정말 감사합니다!!
하지만 부족한 제 머리로 이해가 되지 않은 부분이 있어 질문 드립니다. ㅠㅠ
글 중간에 예시로 "악의적인 누군가가 디스크에다 0을 쓰라는 프로그램을 만들고 이를 수행하려는 경우"가 있었습니다.
해당 프로그램을 컴파일하면 out과 같은 명령어를 실행하려는 단계에서, cpu가 유저모드에서 커널모드로 전환할 것으로 이해했습니다.
근데 여기서 전환시에 이 명령어가 악의적인 목적인지를 어떻게 판단하고 커널모드로 전환하지 않고 해당 프로세스를 종료시키는지에 대해서 궁금합니다!
저의 질문을 읽어주셔서 감사드리고 답변기다리겠습니다. ㅠㅠ
이것을 이렇게 간단하고 명확하게 설명해주시다니.. 구구절절 좋은 글 감사드립니다!
저야말로 방문 감사드립니다~! 좋은하루되세요
설명이 구구절절해서 너무 좋습니다. 쓸 데 없는 구구절절이 아니라 전부 다 필요한 구구절절이네요.
잘 읽었습니다. 감사합니다.
추가적으로 질문드리고 싶은 게 있는데요.
user mode에서 악의적인 I/O를 할 수 없도록 한 것 까지는 좋은데..
악의적이지 않은, 필요한 I/O 명령도 있겠죠? 애플리케이션에서 그러한 I/O 요청이 들어온다면 system call을 통해 kernel mode로 전환할 것이고요.
그런데.. 이러한 I/O 요청이 정상적인 요청인지 아니면 악의적인 요청인지.. 어떻게 구분해서 어떨때는 실행하고 어떨떄는 실행하지 않고 할 수 있는 것일까요?
비밀댓글입니다
비밀댓글입니다