한 컴퓨터를 여러 사람이 동시에 사용하는 환경(서버 컴퓨터)에서 한 사람의 실수나 잘못된 접근으로 인해 다른 컴퓨터에 영향을 주는 것은 매우 위험하다. 예를 들어 다수의 사용자들이 같은 서버 컴퓨터를 사용하고 있는데 A라는 사람의 프로그램에서 stop
(컴퓨터 강제 종료) 명령어가 실행되면 모든 사용자의 작업이 종료돼버릴 수 있다. 따라서 일반 유저들이 stop
같은 위험한 명령을 내리지 못하도록 막아야 하는데 이러한 배경 속에서 등장한 개념이 이중모드이다.
이중모드는 유저모드, 관리자모드 두가지로 나뉜다. 유저모드는 단순한 사용자 프로그램을 실행할때의 모드로써 stop
같은 특권명령어를 사용할 수 없다. 반면 관리자모드는 운영체제의 코드를 실행하며 특권명령어를 사용할 수 있다. 참고로 레지스터에 모드를 나타내는 플래그를 통해 관리자모드와 유저모드를 구분한다(예를 들어 flag가 0이면 유저모드, 1이면 관리자모드). 게임 프로그램에서 게임 스코어를 하드디스크에 저장하는 상황을 통해 이중 모드에 대해 좀 더 구체적으로 알아보겠다.
- 관리자모드 = 시스템모드 = 모니터모드 = 특권모드
Stop
, halt
, reset
등이 존재한다. if 일반 사용자가 즉 유저모드에서 특권 명령을 내리면 어떻게 될까?
stop
??이처럼 이중모드를 통해 서버 컴퓨터와 같이 중요한 컴퓨터에 일반 유저가 들어와 특권 명령을 내리는 것을 막을 수 있다.
이중모드는 하드웨어 보호와 깊은 관계가 있다. 컴퓨터에서 입출력장치, 메모리, CPU같은 하드웨어들은 보호 받아야 한다.
일반 사용자가 서버 컴퓨터 환경에서 프린터를 직접 사용하게 하면 어떤 일이 생길까? 예를 들어 A라는 사용자가 프린터로 출력하는 도중에 B라는 사용자도 출력하면 혼란이 발생한다. 따라서 하드디스크, 프린터 같은 입출력 장치는 모두 보호받아야 한다. 어셈블리 명령어로 in
과 out
은 직접 입출력 장치에 접근하므로 OS를 경유해서 입출력 장치에 접근하도록 해야 한다. 이를 위한 어셈블리 명령어가 int
이고 이 명령어는 CPU가 소프트웨어 인터럽트가 걸린 거로 인식하게 해줌으로써 OS를 경유하게 해준다. 이처럼 일반 유저나 프로그램이 입출력 장치를 OS를 경유해서 접근하도록 함으로써 입출력 장치를 보호할 수 있다.
if 유저모드에서 in
이나 out
명령어를 내리면
-> 내부 인터럽트에 의해 프로그램 종료.
A가 사용하는 하드디스크 파일이 있는데 B가 소프트웨어 인터럽트를 통해 읽으려 한다면??
-> OS는 인터럽트 초기에 B가 요청한게 정당한지 확인하는 로직을 가지고 있다. 이 로직은 A가 사용 중이므로 B의 요청을 통제한다.
in
과out
은 모두 특권명령어이다.
in
: 키보드나 마우스 같은 입력 장치로부터 정보를 받아들이는 명령어
out
: 프린터, 스피커 같은 출력 장치를 제어하는 명령어
이것이 바로 남들이 내 N 드라이버에 접근할 수 없는 이유이다.
다른 사용자가 우연 혹은 고의로 다른 메모리 영역이나 운영체제 메모리 영역에 접근하면 보안에 심각한 문제가 발생한다. 이를 막기 위한 해결책으로 MMU(Memory Management Unit)가 있다. MMU는 CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이다. MMU에는 Base
와 Limit
이라는 레지스터가 존재하는데 이 레지스터들은 Address bus의 접근 가능한 메모리 주소값 범위를 지정할 수 있다. 예를 들어 User 1이 User 2,3 프로세스에 접근하거나 OS에 접근하는 것을 막아야 한다. 그러면 MMU의 Base
와 Limit
값을 500~1000으로 지정해주면 Address bus가 user1,2의 프로그램이나 OS로 접근하는 것을 막을 수 있다.
Segment violation
이라 한다.
Base
와Limit
값의 설정은 특권명령어이므로 OS가 관리한다.
빨간색 : 잘못된 접근으로 인한 인터럽트 발생
파란색 : 정상 접근.
한 사용자가 실수 혹은 고의로 CPU 시간을 독점하면 큰 문제가 생긴다. 아래 코드를 보자.
while(n=1)
{
...
}
원래 (n==1)을 의도하였지만 실수로 등호 하나를 빼먹었다. 이 코드는 변수 n에 1이 들어가 항상 True가 되므로 while문을 빠져나갈 수 없다. 이러면 다른 사용자의 프로세스가 실행되지 않는다. 이러한 문제를 해결하기 위해 타이머를 이용한다. 타이머는 일정 주기로 CPU에 인터럽트를 걸도록 설계되어있다. 타이머가 인터럽트를 걸면 CPU는 현재 하던 일을 중지하고 ISS로 점프하게 된다. ISS 안에는 현재 CPU가 어느 한 유저나 프로세스에 독점되어있는지 체크하는 코드가 들어있다. 따라서 독점이 발견되면 ISS는 CPU가 강제로 다음 프로세스(유저)에게 넘어가도록 컨트롤해준다. 이처럼 CPU 시간이 어느 한 유저 프로세스에 묶여있지 않도록 통제하는것을 CPU 보호라고 한다.
의문점 : Time Sharing System은 일정 시간을 주기로 스위칭한다고 했는데 왜 While문을 빠져나가지 못하는게 다음 프로세스에 영향을 끼칠까?