현대에는 시공유 시스템 등 하나의 컴퓨터를 여러 유저가 동시에 사용하는 환경이 많다. 그러나 하나의 컴퓨터를 여러 유저가 사용하게 되면 한 사람이 컴퓨터를 독점하거나 하나의 실수로 인해 모든 유저가 피해를 보는 상황이 발생할 수 있다.
이를 막기 위한 방법 중 하나가 바로 이중모드이다.
이중모드(Dual Mode) : 운영체제를 보호하기 위한 기법 중 하나로, 커널 모드와 사용자 모드를 두어 일반 유저가 무분별하게 시스템 자원으로 접근할 수 없도록 한다.
이중 모드의 종류 : 이중 모드는 커널 모드
와 사용자 모드
가 있으며, 커널 모드는 시스템 모드, 특권 모드, 관리자 모드, 모니터 모드로 불리기도 한다. 커널 모드일 때에만 아래의 특권 명령
을 실행할 수 있다.
특권 명령 : 유저가 사용했을 시 하드웨어에 큰 문제가 발생할 수 있는 명령어들(예를 들어 STOP(cpu의 동작 멈춤), RESET(초기화), SET_TIMER(타이머 조작)을 특권 명령으로 취급하여 사용자가 이 명령을 내릴 수 없게 한다.
특권 명령과 일반 명령 : 특권 명령은 관리자 모드
에서만 내릴 수 있는 명령으로, 일반 사용자는 이용하지 못한다
. 반면 일반 명령은 일반 사용자들도 이용할 수 있는 명령이다.
일반 사용자가 특권 명령을 사용하면? : 일반 사용자가 특권 명령을 사용하려 하면 cpu에서는 인터럽트를 발생시켜 ISR로 돌입한 후, 사용자 모드임에도 특권 명령이 사용된 프로그램을 강제 종료
시킨다.
어떤 상황에서 커널 모드이고, 유저 모드일까? : 운영체제가 실행될 때와, 인터럽트가 발생했을 때 커널 모드가 실행된다. 반면 사용자 모드는 사용자 프로그램이 실행될 때와 운영체제가 실행되지 않으면 사용자 모드이다.
특권명령을 실행할 때, cpu는 이 명령을 내린 것이 일반 사용자인지, 관리자인지 구분을 할 수 있는 방법이 필요하다. 이 구분을 위한 flag가 바로 mode flag이다.
cpu는 위와 같이 연산장치인 ALU와, 제어장치인 Control Unit 그리고 레지스터로 이루어져 있다. 이 레지스터가 몇 비트로 이루어져 있느냐에 따라 64 bit 컴퓨터인지, 32 bit 컴퓨터인지 구분된다.
또, 레지스터는 flag로 carry, zero, overflow, negative flag를 사용하는데, 여기에 추가로 mode flag가 더해진다.
mode flag : mode flag는 현재 명령어를 실행시켰을 때 유저가 관리자 권한을 가지는지, 일반 사용자인지 구분하는 플래그이다. mode flag가 0일 때에는 커널 모드이며, mode flag가 1일 때에는 사용자 모드이다. 모드 플래그가 0일 때에만 특권 명령을 실행할 수 있다.
위와 같은 말대로라면 일반 사용자는 특권 명령을 이용할 수 없다. 그렇다면 사용자는 입출력과 같은 hw를 전혀 사용할 수 없는 것일까?
==> 사용자는 운영체제를 통해 hw를 이용할 수 있다.
예시를 통해 살펴보자.
<게임 프로그램이 hdd에 접근하려 할 때>
( 1 ) 게임 프로그램이 메모리에 적재. (user mode, 그림에서 user process executing)
( 2 ) 게임 프로그램이 hdd에 접근하고자 함 (아직 user mode)
( 3 ) 게임 프로그램에서 sw 인터럽트를 발생시켜 ISR 실행 (user mode -> kernel mode, 그림에서 calls system call)
( 4 ) 운영체제에서 hdd에 접근 (kernel mode, 그림에서 execute system call)
( 5 ) ISR 종료 후, ISR을 호출한 프로그램(게임 프로그램)으로 복귀 (kernel mode -> user mode, 그림에서 return from system call)
일반 어플리케이션은 hw에 직접 접근할 수 없고 운영체제를 통해서만 hw에 접근이 가능하다. 이를 위해서는 이중 모드가 필요하며, 운영체제를 통해 커널 모드(시스템 모드)로 hw에 접근할 수 있다.
위에서 게임 프로그램의 예시를 들었듯이, app은 사용자와 시스템 커널이 번갈아가며 실행되며, app이 hw를 사용하기 위해 소프트웨어 인터럽트를 발생시키고, 이로 인해 시스템 모드로 전환되어 hw에 비로소 접근할 수 있는 것이다. hw에 접근해서 ISR이 종료되면 다시 사용자 모드로 전환된다.
앞서 이중 모드는 운영체제 보호와 관계있다. 이 하드웨어 보호에 대해서 조금 더 알아보자.
하드웨어 보호는 크게 3가지로 구분된다. 첫번째는 입출력장치 보호, 두번째는 메모리 보호, 세번째는 cpu보호이다.
일반 사용자가 제한 없이 hw를 이용하게 되면 프린트 혼선, 리셋 등의 문제가 발생하게 된다. 또, 다른 사용자의 hdd등에 접근하게 되면 많은 문제가 발생한다.
이를 방지하기 위해 입출력 명령을 특권명령으로 만든다
입출력 명령인 in, out을 특권명령으로 만들어 특권 모드인 상태에서만 명령이 실행되게 한다.
이렇게 되면 in, out명령을 실행하기 위해서 app은 소프트웨어 인터럽트를 발생시키고, 운영체제에서 올바른 명령인지 아닌지를 구분할 수 있다. SWI(소프트웨어 인터럽트)가 발생했다 하더라도, 다른 유저의 hdd를 접근하는 등 올바른 명령이 아닐 때 이 명령을 거부한다.
만약 사용자가 입출력 명령을 직접 내렸을 경우에는 Previleged Instruction Violation(특권 명령 침범)이라고 한다.
위 그림과 같이 어플리케이션은 하드웨어에 직접 접근할 수 없고 반드시 운영체제를 통해서만 접근할 수 있다.
현대 컴퓨터는 여러 사용자가 한 컴퓨터를 공유하고 있는 시스템을 사용중이기 때문에, 한 사용자가 다른 사용자의 메모리를 침범하거나 운영체제의 영역을 접근할 수 있다. 이를 막기 위해 도입된 개념이 MMU이다.
유저 1의 프로그램을 메모리에서 실행중일 때, cpu는 연산을 위해 메모리에서 값을 가져와야 하는 경우가 생길 수 있다. 이 때, cpu는 address bus를 통해 필요한 값의 주소값을 메모리에 전달하고, 메모리는 그 주소값에 위치하는 값을 cpu로 전달한다.
이러한 상황에서, cpu가 유저 1이 아닌 다른 유저나 운영체제의 메모리 주소를 전달했다면 이는 다른 메모리 영역을 침범한 것이 된다. 이처럼 다른 메모리 영역을 침범한 것을 Segment Violation(영역 침범)이라고 하며, 이를 관리하기 위해 Memory Management Unit(줄여서 MMU, 메모리 관리 유닛)이 필요하다.
MMU는 address bus에서 메모리 주소가 올 때, 이 주소가 다른 메모리 영역을 침범하는 주소인지 감시한다. base와 limit를 MMU내부에 두어 주소값이 base와 limit 사이에 있으면 인터럽트를 발생시키지 않고, 사이에 있지 않으면 인터럽트를 발생시킨다.
예를 들어 유저1의 프로그램의 메모리 주소가 500에서 1000번대인데, address bus로 2000번대의 주소가 온다면 이는 다른 메모리 영역을 침범한 것이기 때문에 인터럽트가 발생한다. 이 인터럽트로 인해 cpu는 메모리를 침범한 프로그램을 강제 종료한다.
한 사용자가 실수 또는 고의로 cpu를 점유할 수 있다. 무한 루프를 도는 등 한 프로그램이 cpu를 독점하게 된다면 다른 사용자가 cpu를 사용할 수 없는 사태가 발생한다. 이를 방지하기 위해 timer를 도입한다.
timer를 두어 일정 시간이 경과하면 타이머 인터럽트를 발생시켜 다른 유저의 프로그램으로 강제 전환하게 한다.