이중모드와 보호

이상훈·2022년 9월 24일
0

CS

목록 보기
19/27

한 컴퓨터를 여러 사람이 동시에 사용하는 환경(서버 컴퓨터)에서 한 사람의 실수나 잘못된 접근으로 인해 다른 컴퓨터에 영향을 주는 것은 매우 위험하다. 예를 들어 다수의 사용자들이 같은 서버 컴퓨터를 사용하고 있는데 A라는 사람의 프로그램에서 stop(컴퓨터 강제 종료) 명령어가 실행되면 모든 사용자의 작업이 종료돼버릴 수 있다. 따라서 일반 유저들이 stop 같은 위험한 명령을 내리지 못하도록 막아야 하는데 이러한 배경 속에서 등장한 개념이 이중모드이다.


이중모드

이중모드는 유저모드, 관리자모드 두가지로 나뉜다. 유저모드는 단순한 사용자 프로그램을 실행할때의 모드로써 stop같은 특권명령어를 사용할 수 없다. 반면 관리자모드는 운영체제의 코드를 실행하며 특권명령어를 사용할 수 있다. 참고로 레지스터에 모드를 나타내는 플래그를 통해 관리자모드와 유저모드를 구분한다(예를 들어 flag가 0이면 유저모드, 1이면 관리자모드). 게임 프로그램에서 게임 스코어를 하드디스크에 저장하는 상황을 통해 이중 모드에 대해 좀 더 구체적으로 알아보겠다.

  1. 게임 프로그램 실행 중 (flag = 0, 유저모드)
  2. 소프트웨어 인터럽트를 위해 프로그램 카운터(PC)가 게임프로그램에서 OS의 인터럽트 서비스 루틴으로 점프(falg = 0->1, 유저모드->관리자모드)
  3. 인터럽트의 서비스 루틴 코드로 인해 게임스코어를 하드디스크에 저장(flag = 1, 관리자모드)
  4. 저장이 끝나면 프로그램 카운터(PC)가 게임 프로그램으로 리턴(flag = 1->0, 관리자모드 -> 유저모드)
    • 관리자모드 = 시스템모드 = 모니터모드 = 특권모드
  • 참고로 특권명령어에는 Stop, halt, reset 등이 존재한다.

if 일반 사용자가 즉 유저모드에서 특권 명령을 내리면 어떻게 될까?

  • 유저모드에서 CPU가 명령을 읽었는데 stop ??
  • CPU는 잘못된 명령이라 여겨 내부 인터럽트 실행.
  • 프로그램 카운터(PC)가 인터럽트 서비스로 점프해 프로그램을 강제로 종료.

이처럼 이중모드를 통해 서버 컴퓨터와 같이 중요한 컴퓨터에 일반 유저가 들어와 특권 명령을 내리는 것을 막을 수 있다.


보호

이중모드는 하드웨어 보호와 깊은 관계가 있다. 컴퓨터에서 입출력장치, 메모리, CPU같은 하드웨어들은 보호 받아야 한다.

입출력 장치 보호

일반 사용자가 서버 컴퓨터 환경에서 프린터를 직접 사용하게 하면 어떤 일이 생길까? 예를 들어 A라는 사용자가 프린터로 출력하는 도중에 B라는 사용자도 출력하면 혼란이 발생한다. 따라서 하드디스크, 프린터 같은 입출력 장치는 모두 보호받아야 한다. 어셈블리 명령어로 inout은 직접 입출력 장치에 접근하므로 OS를 경유해서 입출력 장치에 접근하도록 해야 한다. 이를 위한 어셈블리 명령어가 int이고 이 명령어는 CPU가 소프트웨어 인터럽트가 걸린 거로 인식하게 해줌으로써 OS를 경유하게 해준다. 이처럼 일반 유저나 프로그램이 입출력 장치를 OS를 경유해서 접근하도록 함으로써 입출력 장치를 보호할 수 있다.

  • if 유저모드에서 in이나 out 명령어를 내리면
    -> 내부 인터럽트에 의해 프로그램 종료.

  • A가 사용하는 하드디스크 파일이 있는데 B가 소프트웨어 인터럽트를 통해 읽으려 한다면??
    -> OS는 인터럽트 초기에 B가 요청한게 정당한지 확인하는 로직을 가지고 있다. 이 로직은 A가 사용 중이므로 B의 요청을 통제한다.

inout은 모두 특권명령어이다.
in : 키보드나 마우스 같은 입력 장치로부터 정보를 받아들이는 명령어
out : 프린터, 스피커 같은 출력 장치를 제어하는 명령어

이것이 바로 남들이 내 N 드라이버에 접근할 수 없는 이유이다.

메모리 보호

다른 사용자가 우연 혹은 고의로 다른 메모리 영역이나 운영체제 메모리 영역에 접근하면 보안에 심각한 문제가 발생한다. 이를 막기 위한 해결책으로 MMU(Memory Management Unit)가 있다. MMU는 CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이다. MMU에는 BaseLimit 이라는 레지스터가 존재하는데 이 레지스터들은 Address bus의 접근 가능한 메모리 주소값 범위를 지정할 수 있다. 예를 들어 User 1이 User 2,3 프로세스에 접근하거나 OS에 접근하는 것을 막아야 한다. 그러면 MMU의 BaseLimit 값을 500~1000으로 지정해주면 Address bus가 user1,2의 프로그램이나 OS로 접근하는 것을 막을 수 있다.

  • if MMU에서 정한 주소값 범위 밖의 주소가 들어온다면?
    ->MMU는 Address bus의 접근을 막고 CPU에 내부 인터럽트를 건다. CPU는 OS의 ISS로 점프하고 ISS는 해당 프로그램을 강제 종료시킨다. 이런 잘못된 메모리 접근을 Segment violation 이라 한다.

BaseLimit값의 설정은 특권명령어이므로 OS가 관리한다.

빨간색 : 잘못된 접근으로 인한 인터럽트 발생
파란색 : 정상 접근.

CPU 보호

한 사용자가 실수 혹은 고의로 CPU 시간을 독점하면 큰 문제가 생긴다. 아래 코드를 보자.

while(n=1)
{
	...
}

원래 (n==1)을 의도하였지만 실수로 등호 하나를 빼먹었다. 이 코드는 변수 n에 1이 들어가 항상 True가 되므로 while문을 빠져나갈 수 없다. 이러면 다른 사용자의 프로세스가 실행되지 않는다. 이러한 문제를 해결하기 위해 타이머를 이용한다. 타이머는 일정 주기로 CPU에 인터럽트를 걸도록 설계되어있다. 타이머가 인터럽트를 걸면 CPU는 현재 하던 일을 중지하고 ISS로 점프하게 된다. ISS 안에는 현재 CPU가 어느 한 유저나 프로세스에 독점되어있는지 체크하는 코드가 들어있다. 따라서 독점이 발견되면 ISS는 CPU가 강제로 다음 프로세스(유저)에게 넘어가도록 컨트롤해준다. 이처럼 CPU 시간이 어느 한 유저 프로세스에 묶여있지 않도록 통제하는것을 CPU 보호라고 한다.

의문점 : Time Sharing System은 일정 시간을 주기로 스위칭한다고 했는데 왜 While문을 빠져나가지 못하는게 다음 프로세스에 영향을 끼칠까?

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글