반응형

IA-32e 모드는 두가지 서브모드, 호환 모드와 64비트 모드가 있다. 호환 모드는 보호모드와 동작이 같아서 64비트만 포스팅 한다. 

IA -32 e 모드의 세그먼테이션은 보호 모드의 세그먼 테이션과 큰 차이가 없다. 다만, 주소 공간이 확장되고 두 가지 서브모드를 지원하는 등 몇가지 기능이 추가되면서 약간의 차이가 생겼다.


<차이점>

1. 세그먼트 디스크립터에 설정된 기준 주소와 크기에 관계없이 모든 세그먼트가 기준 주소는 0, 크기는 64비트 전체로 설정된다. 이는 보호 모드에서 사용하던 세그먼트 디스크립터가 32비트 어드레스만 저장하게 설계한 탓이며, 64비트 어드레스 지원을 위해 디스크립터를 확장하지 않고 강제로 값을 고정함으로써 이를 해결한다.

~> 이와 같은 이유로 해당 모드에서는 선형 주소를 기준 주소가 다른 여러 개의 세그먼트로 구분할 수 없음을 고려해서 OS를 설계 해야한다.


2. IA-32e 모드는 호환 모드와 64비트 모드의 두 가지 서브모드를 지원하므로 이를 구분하고자 코드 세그먼트 디스크립터에 L(비트 21)가 추가 됨

~> 이 필드를 0으로 설정하면 호환 모드로 동작, 1로 설정하면 64비트 모드로 동작해서 IA-32e 모드에서는 보호 모드로 돌아가지 않고도 32비트 코드를 실행할 수 있다.


IA-32e 모드의 페이징은 보호 모드와 달리 주소 공간이 64비트로 늘어나므로 PAE 기능이 기본으로 활성화 된다. 또한, 어드레스가 늘어난 만큼 변환 단계도 늘어나서 4KB 페이지는 5단계로, 2MB 페이지는 4단계로 변경된다. 그로 인해 새롭게 추가된 테이블은 페이지 맵 4 테이블(PML4,Page Map Level 4 Table)과 페이지 디렉터리 포인터 테이블(PDPT,Page Directory pointer Table)이고, 변환 과정은 이전 포스팅과 같다.

~>해당 모드의 페이지 엔트리는 64비트로 늘어난 어드레스로 인해 8바이트로 늘어났다. 하위 4 바이트는 보호 모드와 구조가 같고 상위 4바이트는 기준 주소 필드와 예약된 영역, 임의로 사용 가능 한 영역, EXB로 구성된다. 이중 EXB 필드는 해당 페이지에서 명령어가 실행되는 것을 막는 필드이다. ~> 이 기능을 이용하면 데이터 영역에서 명령어가 실행되는 것을 막을 수 있다.


*데이터 영역에서 명령어가 실행되는 것이 어떤 문제가 되는가?

- 데이터 영역이 데이터만 있는 즉, 프로그램 코드가 포함되지 않은 영역이기 때문이다. 일반적으로 프로그램은 크게 코드 영역과 데이터 영역으로 구분되고, 정상적인 프로그램이라면 데이터 영역에서 명령어가 실행되지 않는다. 하지만 간혹 데이터 영역에서 명령어가 실행되는 경우가 있는데 그 대표적인 예가 버퍼 오버플로우, 스택 오버플로우 이다.


반응형
,