보호모드란 80286부터 적용된 하드웨어적 지원이다. 이는 다른 CPU에도(다른 이름으로) 존재하며 운영체제에게 안전한 태스크 관리와 보다 빠른 Context Switching 을 적용할 수 있다. 이를 위해 몇몇의 assemble 코드가 추가 되었으며 80386 부터는 코드가 확장되어 보다 큰 메모리를 어드레스 할 수 있게 되었다.
왜 보호 모드가 필요한가
보호모드가 없을 경우 커널은 자신을 지키기 위한 하드웨어적 방법을 잃게 된다. 만약 일반 유저 어플리케이션에서 아무런 제약없이 커널의 메모리 블럭에 접근할 수 있다면 ... 으..생각만해도 끔찍하다.
~cpp
실례:: 어셈을 하다보면 이유없이 이런 코드를 쓰는 경우가 있다.
MOV AX,FFFFH
MOV DS,AX
으! 그냥 MOV DS,FFFFFH 하면 되지 왜 AX에 넣는 것이야. 지금 사용 FFFFFH란 메모리가 지금 프로세스가 참조할 수 있나
세그먼트의 정당성을 알기 위해서 이다....보호 할 수 있겠지..그럼..
이를 위해 각각의 어드레스 접근에 privilege level을 두었고 이를 각각의 Application에 적용시켰다. 보호모드의 경우 멀티태스킹을 지원하기 위한 방법이다. 이는 지속적이고 반복적으로 일어나는 Context Switching 을 하드웨어적인 방법으로 만들어 소프트웨어적인 방법보다 빠른 Context Switching을 통해 하드웨어의 효율성을 높였다. 보호모드를 위한 레지스터와 방법들..
디스크립터는 세그먼트에 접근을 위한 정보를 담고 있다.
BASE,G,X,0,?,LIMITE,P,DPL,1,TYPE -> SEGMENT DESCRIPTOR FILED EXAMPLE
중요한 것 DPL란 세그먼트에 접근 가능한 레벨을 말한다.
- GDTR ( GLOBAL DESCRIPTOR TABLE REGISTER )
GDTR은 GDT (Global Descriptor Table)을 정의하기 위한 레지스터이다. GDT의 용도는 무엇인가? 글로벌 메모리는 어떠한 태스크라도 접근 가능한 메모리를 말한다. 그리고 이를 정의하는 레지스터가
GDT이다. 하나의 GDT가 존재하며 GDT에는 LDT의 베이스주소를 계산하는 데 쓰인다. GDTR은 48 BIT로 이루어졌으며 GDTR의 32 BIT의 BASE 주소와 16 BIT의 리미트 부분으로 나누어지며 BASE는 GDT의 시작 어드레스를 말하며 리미트는 GDT의 크기를 말한다. GDT가 가지는 최대 디스크립터는 8192이다.
- LDTR ( LOCAL DESCRIPTOR TABLE REGISTER )
LDTR은 16 BIT의 레지스터이고 13 BIT가 셀렉터이다.