이중모드란?
- 한컴퓨터를 여러 사람이 동시에 사용하는 환경
- 또는 한사람이 여러 개의 프로그램을 동시에 사용
- 한사람의 고의/실수 프로그램이 전체에 영향
ex) STOP(CPU 중지, 다시 동작하게 하려면 전원을 껐다가 켜야 함), HALT, RESET 등
사용자 프로그램은 STOP 등 치명적 명령을 사용 불가하게!
- 이중 모드(dual mode) 는 사용자 모드/ 관리자 모드로 구분한다.
- 관리자(Supervisor) 모드=시스템(system) 모드=모니터(monitor) 모드= 특권(priviliged) 모드
- 특권 명령(privileged instructions): STOP, HALT, RESET, SET_TIMER, SET_HW, …
이중모드 동작 과정
- 레지스터에 모드를 나타내는 플래그가 있다(1: 유저 모드, 0: 관리자 모드)
- 운영체제 서비스를 실행할 때는 관리자 모드
- 사용자 프로그램을 실행할 떄는 사용자 모드
- 하드웨어/소프트웨어 인터럽트 발생하면 관리자 모드
- 운영체제 서비스가 끝나면 다시 사용자 모드
일반적인 프로그램 실행
1. 컴퓨터 부팅 과정 - 관리자 모드
2. 애플리케이션 실행 과정 - 관리자 모드
3. 애플리케이션 실행중 - 사용자 모드
4. 인터럽트 발생 후 처리 과정 - 관리자 모드
5. 인터럽트 처리 후 - 사용자 모드
위의 4번 과정을 하드웨어 인터럽트로 가정하고 자세히 살펴보면 아래와 같다.
- 하드웨어 인터럽트 발생 후 CPU로 인터럽트 신호 요청 (사용자 모드)
- CPU에서 모드 플래그를 관리자 모드값으로 설정
- 해당 하드웨어 인터럽트 서비스 루틴(ISR)으로 이동 (관리자 모드)
- 인터럽트 처리 (관리자 모드)
- 인터럽트 처리 완료 후 CPU의 모드 플래그를 다시 사용자 모드값으로 설정
- 원래의 애플리케이션 위치로 복귀 (사용자 모드)
이중모드의 기능: 보호
1. 입출력장치 보호 – Input/output device protection
2. 메모리 보호 – Memory protection
3. CPU 보호 – CPU protectiopn
(1) 입출력장치 보호
- 사용자의 잘못된 입출력 명령
- 다른 사용자의 입출력, 정보 방해
- ex) 프린터 혼선, 리셋 등
- ex) 다른 사람의 파일 읽고 쓰기(하드디스크)
- 해결법
- 입출력 명령을 특권명령으로: IN, OUT
- 입출력을 하려면 OS에 요청(시스템 모드로 전환)
- 운영체제가 입출력 대행; 마친 후 다시 유저 모드로 복귀
- 올바른 요청이 아니면 OS가 거부
- 사용자가 입출력 명령을 직접 내린 경우는?
- Privileged instruction violation(특권 명령 침해)
(2) 메모리 보호
메모리에는 운영체제 뿐 아니라 여러 개인 사용자 애플리케이션이 존재한다. 한 애플리케이션이 자신의 메모리 영역이 아닌 운영체제나 다른 애플리케이션 메모리 영역에 침범하려하면 매우 위험하다.
CPU는 address bus를 통해 메모리 주소에 접근하는데, user1 프로그램이 실행되는 동안에는 user1이 할당되어 있는 메모리 주소 범위 안인 경우에만 접근하면 된다. 이를 address bus에서 검사하는 것이 가장 효율적이다.
MMU(Memory Management Unit)는 일종의 문지기 역할을 한다. MMU는 위의 그림처럼 address buys 중간에 설치된 하드웨어 칩으로서 2개의 레지스터를 통해 해당 프로그램의 주소 범위를 저장한다. Base와 Limit 사이에 들어오는 주소만 통과한다.
예를 들어, User1의 시작 주소는 1024, 끝 주소는 4048이라고 하자. User1이 수행되는 동안 운영체제는 해당 프로그램의 주소 범위를 MMU에 설정(특권 명령)하는데, base는 1024, limit는 4048이 될 것이다. 결과적으로 user1이 수행되는 동안에는 이 범위 안의 주소값인 경우에만 address bus를 통과시킨다.
만약 해당 프로그램의 주소 범위 밖의 주소값이 MMU에 들어온다면, MMU에서 내부 인터럽트를 발생시켜 CPU에 신호를 준다. 그러면 CPU는 그에 맞는 ISR로 이동하여 해당 프로그램을 강제 종료시킨다.
이와 같이 잘못된 접근을 Segment violation 이라 한다.
(3) CPU 보호
만약 한 사용자가 실수 또는 고의로 CPU를 독점하게 되면 (자신 또는 다른 사용자의) 다른 프로그램은 수행하지 못한다.
따라서 CPU 독점을 방지해야 한다.
while(n = 1)
{
// ...
}
CPU를 독점하는 가장 대표적인 예는 무한 반복이다. 위의 코드를 보면 while문으 조건문이 잘못된 것을 볼 수 있다. 비교 연산자가 아닌 대입 연산자를 사용하여 n값이 1이 되므로 while문의 조건은 TRUE가 된다. 이는 n값이 변하지 않는 이상 무한으로 반복한다.
이를 해결하는 방법은 Timer를 두어 일정 시간이 지나면 타이머 인터럽트를 발생시킨다.
Reference