System/Windows
Windows 특권레벨
Tribal
2016. 3. 10. 16:20
#--------------------------------------------------- Windows의 특권 레벨 ---------------------------------------------------------#
Windows에서는 0~3까지의 특권레벨이 있다. 0은 커널, 1과 2는 디바이스 드라이버 레벨, 3은 유저 레벨을 나타낸다. 하지만 실제로 사용하는 특권레벨은 0과 3 정도이고 1과 2는 본 적이 없다.
세그먼트 레지스터를 갱신할 때는 특권레벨에 대해 조건을 만족해야만 한다.
특정 특권레벨을 가지고 수행되는 코드가 다른 데이터 세그먼트의 메모리를 참조하기 위해서는 그 데이터 세그먼트의 DPL이 현재 실행중인 CPL보다 수치적으로 크거나 같아야 참조할 수 있다.
- 데이터 세그먼트 갱신 : DPL >= MAX(CPL, RPL)
- 스택 세그먼트 갱신 : DPL = CPL = RPL
- 코드 세그먼트 갱신 : 데이터 세그먼트와 스택 세그먼트처럼 직접적으로 변경할 수 없다. 같은 특권레벨을 가진 경우는 세그먼트 간의 JMP나 CALL 명령어를 통해 가능하지만 다른 특권레벨의 경우는 두 가지 경우를 제외하고는 불가능하다.
- 세그먼트 디스크립터의 TYPE에서 Conforming bit가 1로 세팅된 경우 : 특권레벨에 대한 권한을 무시하도록 설정한 것, Conforming이 세팅된 세그먼트에 정의된 DPL보다 수치적으로 같거나 낮은 모든 CPL 코드 세그먼트는 제어 이행 가능하다. 다만 CPL은 변경되지 않는다.
- 콜게이트(Call Gate) 사용 : 낮은 특권레벨의 코드가 높은 특권레벨 코드로 이행 가능하도록 해준다. 콜게이트를 통해 특권레벨이 달라지는 경우 OS에서 태스크 변환 시 세팅되어지는 TSS(Task State Segment)의 내용을 참조하여 자동으로 스택 세그먼트 값과 ESP의 값이 변경된다.
※ 콜게이트(Call Gate) : 시스템 디스크립터 중 하나, 타입 비트는 1100으로 명시됨, 게이트라서 베이스와 리미트가 없다!
※ 콜게이트 디스크립터의 DPL 필드에는 이 게이트에 접근할 수 있는 코드 세그먼트의 권한을 세팅한다.
참고 : Windows 구조와 원리_한빛미디어