2010. 4. 6. 00:24

Call Gate에 관한 고찰

 Call Gate권한이 다른 레벨 사이(예 : 낮은 특권 레벨 -> 높은 특권 레벨)에서 프로그램
 
수행의 제어 흐름을 변경하기 위해 이용되는 게이트웨이라고 정의할 수 있습니다.
 
다시 정리하면, 유저 권한에서 관리자 권한으로의 제어를 이행하기 위한 수단이 됩니다.
 
물론, Call Gate 이외에도 특권 레벨 권한의 변경은 다음과 같은 방법이 있습니다.
 
 
1. SOFTWARE INTERRUPT(INT n 명령어)
 
2. TASK GATE 이용
 
3. SYSENTER 이용
 
 
콜 게이트는 시스템 프로그래머가 여러가지 용도로 정의하여 사용할 수 있습니다만,
 
일반적으로 시스템 콜을 구현시, 콜 게이트를 사용할 수도 있습니다.
 
대표적인 운영체제인 윈도우즈와 리눅스에서 시스템 콜 사용시, 권한 레벨의 변경은
 
다음의 방법을 사용하고 있습니다.
 
리눅스에서는 소프트웨어 인터럽트 0x80SYSENTER,
윈도우즈에서는 소프트웨어 인터럽트 0x2ESYSENTER
 
 
콜 게이트 디스크립터의 구조체 정의는 다음과 같습니다.
 
(숫자는 그 필드의 비트 범위를 의미)
 
Offset in Segment - 63 : 47
P - 46
DPL - 45 : 44
S : 43
TYPE - 42 : 39
000 - 38 : 36
Parameter Count - 35 : 32
Segment Selector - 31 : 16
Offset in Segment - 15 : 0
 
INTEL MANUAL에서 보면, 시스템 디스크립터(S=0)에서 콜 게이트 디스크립터의
 
타입 비트는 1100로 정의되어 있습니다.
 
콜 게이트로 제어를 이행하는 절차는 다음과 같습니다.
 
1. far CALL 혹은 far JMP 인스트럭션을 사용한다. 즉, 오퍼랜드에 셀렉터:오프셋과
 
같은 형태로 콜 게이트의 셀렉터를 선택하여 호출한다.
 
(여기서, 사용자 오프셋은 무시된다. 이유는 오프셋으로 인접한 커널 영역의 세그먼트
 
 코드에 접근하여 실행할 수 있는 가능성이 존재하기 때문이다. 몰론 접근하고자 하는
 
 시스템 콜의 물리 주소 오프셋은 콜 게이트 디스크립터에 정의되어 있다)
 
 
- 다음 순서부터 프로세서가 접근 권한을 체크한다.
 
2. CPL과 RPL을 콜 게이트 디스크립터의 DPL을 비교한다.
 
(CPL은 현재 CS 레지스터에서 가지고 있는 권한을 의미하며,
 RPL은 무조건 far JMP 혹은 far CALL 오퍼랜드의 셀렉터가 된다.
 빨간색이 RPL, [ex] CALL 0x33:0)
 
Privilege Check Rules은 intel manual에 정의되어 있다.
[ CPL <= Call Gate DPL, RPL <= Call Gate DPL ]
 
 
3. 예를 들어, 호출자의 RPL 값이 3이고 콜 게이트 디스크립터의 DPL 값이 3이면
 
   접근이 허용되며, 여기서 콜 게이트 디스크립터의 세그먼트 셀렉터를 참조하게 된다.
 
   이것의 의미는 현재 CS 레지스터의 값커널 코드 세그먼트 셀렉터로 변경된다.
 
   (바로 여기서 접근 권한 레벨이 변경되었다고 표현한다. 결론은 현재 CS가 가진 권한이
 
   11이었지만, 커널 코드 세그먼트 셀렉터를 지시하게됨에 따라 CPL이 00으로 바뀌게 된다.
 
   (따라서, 콜 게이트 디스크립터 참조 이후에 권한 레벨의 변경이 이루어 집니다)
 
    다만, 프로세서에 의해 권한 체크 및 변경이 이루어지기 때문에 프로그래머 입장에서는
 
    전혀 신경 쓸 필요가 없음을 의미하기도 한다.
 
 
4. 이후의 흐름은 커널 코드 세그먼트의 물리 위치에서 콜 게이트 디스크립터의 오프셋을
 
    참조하여 시스템 콜을 수행하게 된다(제어의 이행이 완료된 상태에서).
 
 
콜 게이트를 테스트하기 위한 방법으로는 운영체제를 직접 구현하여 테스트해보는것이 가장
 
효과적입니다만, 윈도우즈에서도 이를 테스트하기 위한 디바이스 드라이버를 작성할 수 있습니다.
 
특권 레벨 RING0에서만 사용할 수 있는 INSTRUCTION의 조합으로 특정 루틴을 제작하여
 
동적으로 콜 게이트 셀렉터와 디스크립터를 생성하고 정의하여 맵핑한 후에 테스트할 수도

있습니다.
정리는 여기까지 하도록 하겠습니다.
 

Written by Simhyeon, Choe