DPL(Descriptor Privilege Level) -> 해당 세그먼트 디스크립터가 가지는 특권레벨(0~3)
CPL(Current Privilege Level) -> CS 세그먼트 디스크립터 상에 있는 DPL 2비트
생각해보니 x86 은 ARM 처럼 CPU 자체나 컨트롤 레지스터에 모드비트같은게 없다.
CR0 에 있는것은 Real/Protected 모드스위치일뿐 특권비트는 아니다.
사실상 커널모드/유저모드는 CPL 에 의해 결정되는데, 생각해보니 이게 결국 메모리에있다.
모든 명령어는 기본적으로 CS 레지스터의 세그먼트 디스크립터에 영향을 받는데
여기서 해당 명령어가 특권모드로 수행되느냐, 유저모드로 수행되느냐가 결정되는 것이다.
그리고 데이터, 스택 등 명령어가 참조하는 나머지 데이터들은 , DS, ES, SS 등의 세그먼트
디스크립터랑 연결된다. 이들 각각도 DPL 을 가지고 있는데 이때, 수행되는 명령의 CS 특권레벨이
참조하는 메모리의 DS, ES, SS 등의 특권레벨보다 낮으면 General Protection fault 가 일어난다.
이게바로 User 권한의 코드가 Kernel 을 건드릴수 없게 하는 원리라고 하는데,
생각해보니 어차피 Paging 에 의해서 Kernel 메모리에 접근할 수가 없다면
이게 의미가 있는건가? -_-;
생각해보니 CPL0 든 CPL3 이든 동일 프로세스는 동일 CR3 레지스터를 가지므로
사실 유저코드상에서 커널메모리를 READ 할때 페이징면에서만 보면 안될게 없다 -_-
따라서 세그먼팅에 의해서 구별을 해야한다.
역시 의미가 있는거였어...
가 아니고 커널메모리 접근은 페이징에 의해서 막힌다(페이지엔트리 플래그에 비트가 있음) 커널메모리 접근이 CPL 에 의해 막히는게 아니라 특권명령의 수행이 CPL 에 의해서 제어되는것이다...
'Programming' 카테고리의 다른 글
shellcodetest.c (0) | 2013.03.19 |
---|---|
Windows7 SSDT Hooking (6) | 2013.03.06 |
OpenSSL Server Example (0) | 2013.02.05 |
linux/windows SSL client example (0) | 2013.02.04 |
QEMU Detection (0) | 2013.01.28 |