Notice
이 글은 다음 강의를 수강한 후 학습한 내용을 정리한 글입니다.
- 강의: [K-MOOC] 홍성수 교수님의 '운영체제의 기초' 2주차 Review of Computer Hardware
02-3. 하드웨어 보안 메커니즘
보안이란?
해커가 컴퓨터 시스템에 침투해서 CPU나 메모리를 독점하는 것 또는 메모리 영역의 값을 오염시키는 것을 막는 것이다.
보안을 위해서 하드웨어적인 기본적인 메커니즘이 필요하다. - Dual mode operation
이 메커니즘은 3개의 하드웨어 디바이스(CPU, 메모리, I/O 디바이스)에 모두 공통적인 요소 foundation이 된다.
Hardware Protection
어떤 유저가 하드웨어 리소스를 원한다면, OS에 request를 해서 승낙을 받은 후에 OS의 privileged instruction에 의해서 서비스를 받아야만 합법적인 이용이 된다. 유저가 임의로 리소스를 장악할 수 없다.
I/O protection
I/O 디바이스를 통제하는 I/O 컨트롤러의 레지스터들에 접근하는 동작을 모두 privileged instruction으로 만들어 통제한다. 그러면 유저 코드는 I/O를 사용할 수 없게 된다.
메모리 protection
- MMU의 base register와 bound register에 접근하는 동작을 privileged instruction으로 만들어 통제한다.
- 특정 영역을 접근하지 못하거나, 특정 영역만 접근 가능하게 한다.
CPU Protection
어떤 유저 코드가 CPU를 독점하지 못하게 해야 한다.
이를 위해 사용하는 방법으로 Timer interrupt가 있다.
Timer interrupt: 유저 코드가 CPU를 할당 받으면 미리 부여된 time clock을 initiation한다. 시간이 지나면 interrupt를 걸고 CPU를 뺏는다.
Dual mode operation
Dual mode operation은 모드가 2개 있다는 것이다.
CPU는 instruction을 통해서 job이 행위를 하게 만들어주는 하드웨어 컴포넌트이다. CPU가 어떤 모드에 있는지는 굉장히 중요하다. 한 모드는 안전한 모드, 또 하나의 모드는 믿을 수 없는 모드이다.
안전한 모드: 커널 모드
안전한 모드란 모드에서 수행되는 코드는 다 내가 trust할 수 있는 코드라고 간주한다.
그렇기 때문에 그 안전한 모드에서는 코드가 시스템을 건드리는 어떤 행위를 해도 다 accept하겠다는 모드이다.
컴퓨터 시스템을 설계하고 거기서 protection을 제공해줄 때 반드시 하나의 전제가 필요하다.
최소한의 이 entity는 100% 믿을 수 있다는 가정이다. 그 entity가 os이다. os 코드는 안전한 모드에서 수행하게 된다.
믿을 수 없는 모드: 유저 모드
일반적인 사용자 코드에게는 무한대의 불신을 준다. 그 코드의 수행으로 시스템의 데이터를 corrupt시킬 수 있으니 사용자의 코드는 무조건 신뢰할 수 없다고 간주를 하게 된다.
사용자의 코드는 굉장히 통제된, 제한된 모드로만 수행되어야 한다는 것이 이 모드의 개념이다. 유저 모드에서는 유저 코드가 수행시킬 수 있는 instruction과 접근할 수 있는 메모리에 많은 제약이 생긴다. 예를 들어 MMU의 베이스 레지스터와 바운드 레지스터는 사용자가 임의로 읽거나 쓰면 안 되는 레지스터였다. 이걸 읽거나 쓰는 건 커널 모드에서만 일어냐야 한다. 이런 instruction을 privileged instruction이라고 따로 정한다. os만이 수행할 수 있다.
유저가 protection privilege를 어긴 코드의 수행을 하게 되면 마이크로 프로세서의 모드 비트를 확인한 후 에러라고 판정하여 소프트웨어 interrupt를 발생시킨다.
마이크로 프로세서, CPU가 수행될 때 이 모드를 구별해야 하는데 어떻게 이 모드를 구분할까?
마이크로 프로세서 안에는 마이크로 프로세서의 상태를 표현해 주는 레지스터가 존재한다.
이 레지스터를 PSR(Processor Status Register) 또는 PSW(Processor Status Word)라고 부른다.
여기에는 어떤 값이 들어갈까?
방금 수행한 연산의 값이 양수냐 0이냐 음수인지를 표현한다.
interrupt가 disable, enable됐는지 표현한다.
지난 연산에서 overflow, underflow됐다 등의 정보를 기록한다.
등등 이 레지스터에는 프로세서의 연산 결과나 상태 표현하는 다양한 정보들이 비트로 인코딩되어 저장된다.
PSR의 한 bit를 할애해서 모드를 표현하게 한다.
이를 모드 bit이라고 한다면 모드 비트가 0이면 커널 모드, 1이면 유저 모드라는 식으로 정하는 것이다..
커널 코드가 수행될 때는 반드시 모드 비트가 커널 모드로 켜져 있어야 하고, 유저 모드일 때는 유저 비트가 켜져 있어야 한다.
마이크로 프로세서의 state transition
모드 비트를 읽고 쓰는 것은 당연히 privileged instruction으로 되어 있어야 한다.
특히 커널 모드를 user 모드로 바꾸는 건 별로 신경 안 써도 되지만, user 모드에서 커널 모드로 변경시키는 것은 매우 신경써야 한다.
마이크로 프로세서는 state transition diagram의 state transition을 하게 된다.

유저 모드에서 커널 모드로 가기
유저에서 커널 모드로 넘어가는 state transition은 아무나 하게 만들면 안 된다. 이는 하드웨어 메커니즘으로 지원한다. 그 메커니즘이 바로 Interrupt 메커니즘이다.
유저 모드를 수행하다가 커널 모드로 가고 싶으면 interrupt를 걸어주면 된다. 그러면 Interrupt Service Routine이 돌게 된다.
-> 전제
(1) os의 코드는 100% 신뢰 가능하다.
(2) intererupt 서비스 루틴의 코드는 os의 코드이다.
유저 모드에서 커널 모드로 갈 때 거는 interrupt는 하드웨어 interrupt일까, 소프트웨어 interrupt일까?
두 가지 다 쓴다. IRQ를 받아서 Interrupt vector table을 조회하고 서비스 루틴으로 점프하게 된다.
유저 코드가 커널 모드의 서비스를 받기 위해서 소프트웨어 interrupt를 거는 것을 system call이라고 한다.
유저 코드에서 유저 함수를 호출하는 것을 function call 또는 call이라고 한다.
system call도 일종의 function call이다. 그런데 그 function이 유저 함수가 아니라 OS 함수. 커널 함수인 것이다. 커널 함수를 호출하기 위해 모드 체인지를 하고 커널 모드 획득해서 함수를 호출해야 한다.
유저가 커널 함수를 불러줄 수 있는 인터페이스를 system call이라고 한다.
커널 모드에서 유저 모드로 가기
유저 모드로 수행이 돌아오려면 return from interrupt로부터 하면 된다.
'Computer System > 운영체제' 카테고리의 다른 글
[운영체제] 04-1. Process Concepts (0) | 2024.02.15 |
---|---|
[운영체제] 03. Stack and Dynamic Memory Allocation of Local Variables (0) | 2024.01.22 |
[운영체제] 02-2. Interrupt Mechanism (0) | 2024.01.22 |
[운영체제] 02-1. Computer Systems Architecture (0) | 2024.01.02 |
[운영체제] 01-2. 운영체제의 기능 (0) | 2024.01.01 |