컴퓨터 시스템의 동작 원리 (2/3) 에서 이어지는 포스트이다.
9. 하드웨어 보안
우리에게 대중적은 운영체제는 다중프로그래밍(multi-programming) 환경에서 동작한다. 그러므로 각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간에 충돌을 일으키는 문제를 막기 위해서 하드웨어에 대한 각종 보안 기법이 필요하다. 하드웨어적 보안을 유지하기 위해 운영체제는 기본적으로 커널모드와 사용자모드 두 가지 모드를 지원한다.
커널 모드(모니터 모드, 시스템 모드)는 운영체제가 CPU의 제어권을 가지고 운영체제 코드를 수행하는 모드로써 이 모드에서는 모든 종류의 명령을 전부 실행할 수 있다.
반면 사용자모드에서는 사용자 프로그램을 수행하며 결국 한정된 instruction만 수행이 가능하다.
시스템에 중요한 영향을 미치는 연산은 커널모드에서만 실행 가능하도록 함으로써 하드웨어의 보안을 유지하는 것이다.
그러나 만약 사용자 프로그램이 cpu를 가지고 있는 동안에는 운영체제가 자신의 코드를 실행하지 못하므로 사용자 프로그램을 감시 못하는데 만약 이 때 사용자 프로그램이 프로그램 내에서 연산을 수행해버리면 제어가 소용이 없다.
따라서 이런 상황을 방지하기 위해 하드웨어적 지원이 필요한데 컴퓨터 시스템은 CPU 내부 안에 mode bit을 두어 사용자 프로그램을 감시하게 된다. 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가는 것을 막는 장치인 것이다. 모드비트는 2가지 operation을 지원하는데 다음과 같다.
1: 사용자 모드
0: 커널 모드
cpu는 보안과 관련된 명령을 수행하기 전에는 항상 모드비트를 조사해 그 값이 0으로만 세팅되어 있는 경우에만 그 명령을 수행한다. 그리고 운영체제가 cpu를 점유해 자신의 코드를 수행하다가 cpu를 사용자 프로그램에게 넘길때 모드비트를 1로 세팅해서 넘기게 된다. 이러한 하드웨어를 이용한 방식으로 사용자 프로그램이 보안과 관련된 중요한 명령을 수행하는 것을 막으면서 하드웨어를 보호할 수 있다. 사용자 프로그램이 수행되다가 하드웨어 접근 등 보안이 필요한 중요한 명령을 수행해야 할 경우에는 시스템 콜을 통해 운영체제가 대신 해줄 것을 요청하는데 cpu의 제어권이 운영체제에게 넘어가게 되고 인터럽트가 발생할 때 모드 비트는 자동으로 0이 세팅되므로 운영체제는 모든 종류의 명령을 전부 수행할 수 있다. 그리고 다시 사용자 프로그램에게 넘겨줄 때엔 모드비트 1로 세팅해서 넘겨주는 것이다. 이와 같이 시스템의 보안과 관련된 명령들을 특권 명령이라 지칭하며 특권 명령은 모드 비트가 0일때만 실행할 수 있다. 즉 커널모드에서 운영체제에 의해서만 수행되는 것이다.
예를 들어 I/O하는 과정을 통해서 모드비트와 커널모드/사용자모드에 대해서 알아보자
사용자 프로그램이 디스크에 저장된 파일에 자유롭게 접근한다면 문제가 발생할 수 있다. 따라서 모든 입출력명령은 특권명령이고 그러므로 사용자 프로그램이 직접 입출력을 하는 것을 차단한다. 따라서 운영체제에게 I/O 요청을 한다. 이 때 요청을 할 때에는 소프트웨어 인터럽트이다! 입출력 명령이 특권명령이므로 어쨌든 인터럽트 라인에 인터럽트 세팅하고 cpu는 운영체제에게 넘어가게 되는데 인터럽트 벡터의 특정 위치를 통해 인터럽트 처리 루틴으로 이동한다. 그러면 인터럽트 하드웨어에 의해 모드비트는 0으로 바뀌고 운영체제는 입출력을 실행할 수 있게 된다. 요청한 입출력이 완료되면 cpu 제어권이 다시 사용자 프로그램에게 넘어가며, 사용자 프로그램이 다시 cpu를 할당받으면 시스템 콜 그 이후의 명령을 수행할 수 있게 된다.
10. 메모리 보안
여러 프로그램이 메모리에 동시에 올라가서 실행되기 때문에 하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있기 때문이다. 따라서 적어도 인터럽트 벡터와 인터럽트 처리루틴이 있는 곳은 보안이 지켜져야 한다. 이러한 문제를 해결하기 위해 2개의 레지스터(기준 레지스터(base regiser, relocation register), 한계 레지스터(limit register))를 사용해서 프로그램이 접근하려는 메모리 부분이 합법적인지 체크함으로써 메모리를 보호할 수 있다.
기준 레지스터는 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리 상의 가장 작은 주소(접근할 수 있는 물리적 메모리 주소의 최소값)를 보관하고 있고 한계 레지스터는 그 프로그램이 기준 레지스터 값부터 접근할 수 있는 메모리의 범위(논리적 주소의 범위)를 보관한다. 즉 어떤 프로그램이 실제 메모리에 올라가 있는 부분의 시작 주소와 그 프로그램의 길이를 각각 기준 레지스터와 한계 레지스터에 보관해 메모리 접근 연산이 있을 때마다 하드웨어적으로 현재 접근하려는 위치가 합법적인 범위에 있는지 체크하게 된다.
사용자 프로그램은 기준 레지스터에 있는 주소부터 기준 레지스터 + 한계 레지스터 값 사이의 주소 영역에만 접근할 수 있으며 이 영역을 벗어나면 비정상적 접근이므로 trap 이라는 소프트웨어 인터럽트를 발생하게 된다. trap이 발생하면 cpu 제어권이 해당 프로그램으로부터 운영체제에게 억지로 넘겨주며 운영체제는 해당 프로그램을 강제 종료 시킨다. 메모리 접근 연산은 사용자 프로그램이 cpu를 가지고 있는 동안 수행할 수 있는 연산으로 특권 명령은 아니다. 그러나 다다만 기준 레지스터와 한계 레지스터의 값을 세팅하는 연산은 특권명령으로 규졍해야 한다.
사용자 프로그램이 메모리에 접근하기 전에 하드웨어적으로 그 접근이 합법적인지를 체크하는 것이다. 사용자모드인 경우에는 기준 레지스터와 한계 레지스터를 사용해서 메모리를 보호하게 되고, 커널모드에서는 메모리는 무제한으로 접근하는 것이 가능하다.
11. CPU 보호
CPU는 컴퓨터 시스템에 단 하나만 존재하는 장치이므로 효율적으로 사용하는 것도 중요하지만 모든 프로그램이 사용할 수 있는, 어떤 프로그램이 독점해서는 안된다. 따라서 운영체제는 타이머(timer)라는 하드웨어를 사용한다. 타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU 제어권을 획득할 수 있도록 하는 역할을 수행한다. 타이머에 의해 수행되는 인터럽트 처리 루틴은 현재 CPU를 점유하고 명령을 실행 중인 프로그램으로부터 CPU를 빼앗아 다른 프로그램에게 CPU를 넘겨준다. 타이머는 매 클럭 틱마다 1씩 감소한다. 타이머가 0이 되는 순간 인터럽트가 발생하는 것이다. 이 떄 타이머에 값을 세팅하는 명령을 로드 타이머(load timer)라고 하며 이는 특권명령(운영체제만 수행 가능- 모드비트는 0이어야)이다. 타이머는 time shring을 구현하기 위해 널리 이용되며 현재 시간을 계산하기 위해서도 사용된다.
12. 시스템 콜을 이용한 입출력 수행
사용자 프로그램이 디스크의 파일에 데이터를 읽고 쓰거나 키보드로 입력을 받고 수행 결과를 출력하는 행위 등은 모두 보안에 문제를 일으킬 수 있다. 따라서 이러한 입출력 명령은 특권 명령이라서 사용자 프로그램이 직접 수행할 수 없다. 그러므로 사용자 프로그램은 운영체제에게 시스템 콜이라는 서비스 대행 요청을 하여 입출력을 수행한다. 시스템 콜은 소프트웨어 인터럽트로 시스템 콜을 하면 트랩이 발생되어 cpu가 운영체제에게 넘어가게 된다. 그럼 운영체제는 인터럽트 처리 루틴으로 가서 명령을 수행하고 디바이스 컨트롤러는 입출력이 완료되면 다시 인터럽트를 건다. 이 떄 인터럽트는 하드웨어 인터럽트이다. 어쨌든 인터럽트가 발생하면 cpu는 로컬 버퍼에서 데이터를 메모리로 가져오고 운영체제는 타이머를 세팅한 뒤 사용자 프로그램에게 cpu를 넘겨주게 된다. 이 때 i/o 요청을 한 프로그램에게 바로 cpu가 넘어가는 것이 아니다. 그 프로그램은 cpu를 얻기 위한 대기 큐에 줄 서있고 다른 프로그램에게 넘어가게 될 것이다.
'CS > operating system' 카테고리의 다른 글
Program Execution: 프로그램의 실행(메모리 로드) 2/2 (0) | 2021.02.08 |
---|---|
Program Execution: 프로그램의 실행(메모리 로드) (1/2) (0) | 2021.02.04 |
System Structure: 컴퓨터 시스템의 동작 원리 (2/3) (0) | 2021.02.02 |
System Structure: 컴퓨터 시스템의 동작 원리(1/3) (0) | 2021.02.02 |
운영체제 개요 (0) | 2021.02.01 |