Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  프로세스 핸들 테이블 
작성일시 : 2007. 11. 28. 19:11 | 분류 : Windows Server/Kernel

개체 핸들은 특정한 프로세스 의존적인 핸들 테일블의 인덱스이며, 실행부 프로세스(EPROCESS) 블록이 가르킨다. 첫번째 핸들 인덱스는 4, 두번째 핸들 인덱스는 8등의 순인데, 프로세스의 핸들 테이블은 프로세스가 핸들을 열었던 모든 개체들에 대한 포인터들을 포함한다. 핸들 테이블들은 세 가지 수준 스키마로 구현되는데, 프로세스 당 16,000,000개 이상의 핸들을 제공하는 x86 메모리 관리 유닛이 가상 주소를 물리 주소로 변환하는 방법과 유사하다. (이를 테면 페이지 디렉토리 페이지 테이블 실제 주소로 이여지는 주소 변환 방법)

Windows 2000에서 프로세스가 생설될 때 개체 관리자는 핸들 테이블의 상위 수준을 할당하는데, 여기에는 중간 수준 테이블들에 대한 포인터들을 포함하고 있다. 중간 수준은 서브 핸들 테이블에 대한 첫 번째 포인터 배열을 포함하고, 낮은 수준은 첫 번째 서브 핸들 테이블을 담고 있다.

Windows 2000에서 개체 관리자는 하위 24 비트를 3개의 8비트 필드로 나눠 사용한다. Windows 2000에서 서브핸들 테이블은 255개의 사용 가능한 항목들로 구성된다. Windows XP와 Windows Server 2003에서 서브 핸들 테이블은 핸들 감사를 위해 사용된 한 항목을 한 페이지에서 빼서 꼭 맞게 되는 항목들로 구성된다. 예를 들어 x86 시스템 들에 대한 한 페이지는 4096 바이트이고, 핸들 테이블 항목의 크기 (8byte)로 나눈 512에서 1을 빼면 최하위 수준 핸들 테이블에서 전체 511개 항목들이 있다. Windows XP 와 Windows Server 2003에서 중간 수준 핸들 테이블은 서브핸들 테이블들에 대한 포인터들의 전체 페이지를 가지고 있어 서브핸들 테이블의 수는 페이지의 크기와 플랫폼에 대한 포인터의 크기에 의존한다.

위 그림에서 나타낸 것 처럼, x86 시스템들에서 각 핸들 항목은 두 개의 32 비트 메버 들인 개체에 대한 포인터와 승인된 엑세스 마스크를 가지는 구조체들로 구성된다. 64비트 시스템들에서, 핸들 테이블 항목은 12 바이트 long 이다. 개체 헤더에 대한 64비트 포인터와 32비트 액세스 마스크가 해당한다.

Windows 2000에서 첫 번째 32 비트 멤버는 개체에 대한 포인터와 4개의 플래그를 가지고 있다. 개체 헤더들이 항상 8 바이트로 맞추어져 있기 때문에, 이 필드의 가장 낮은 3개 비트가 플래그로서 사용되기 위해 해제 되어 있다. 항목의 가장 높은 비트는 잠금으로 사용된다. 개체 관리자가 핸들을 개체 포인터로 변활 할때 변환이 진행되는 동안 핸들 항목을 잠그는데, 모든 개체들이 시스템 주소 공간에 위치하기 때문에 개체 포인터의 높은 비트가 설정된다. 따라서 개체 관리자는 핸들 테이블 항목의 잠금이 해제될 때 높은 비트를 지우고, 프로세스의 항목 잠금에서 비트를 설정하여 개체의 정확한 포인트 값을 얻는다. 프로세스가 새로운 핸들을 생성하거나 존재하는 핸들을 닫을 때만 각 프로세스와 연결된 핸들 테이블 잠금을 사용하여, 개체 관리자는 폴세스의 전체 핸들 테이블의 잠금을 필요로한다.

첫번째는 호출자가 핸들을 닫는것을 허용할지 여부를 두번째는 상속을 (이 프로세스에 의해 생성된 프로세스들이 그들의 핸들 테이블들에서 이 핸들의 복사본을 얻을 것인지)를 가르킨다. 세번째는 개체가 닫는것이 감사 메세지를 생성해야 하는지 가르킨다.

시스템 구성요소 및 장치 드라이버들은 종종 사용자 모드 응용 프로그램이 액세스하지 못하는 개체에 대한 핸들을 열기 위해 필요하다. 이것은 커널 핸들 테이블 (Kernel handle table)에서 핸들들을 생성하여 완료한다. (내부적으로 ObpKernelHandleTable 이름으로 참조된다.) 이 테이블에서 핸들들은 오직 커널 모드에서 그리고 어떤 프로세스 컨텍스트에서도 엑세스가 가능한데, 이 말은 커널 모드 함수가 성능 영향 없이 어떤 프로세스 컨텍스트에서도 핸들을 참조 할 수 있다는 것을 의미한다. 개체 관리자는 핸들의 상위 비트가 설정될 때 커널 핸들 테이블에서 핸들들에 대한 참조를 인식한다. 즉 커널 핸들 테이블 핸들들에 대한 참조가 0x80000000 보다 더 높은 값을 가질때 그렇게 된다.

|