환경 서브 시스템 및 서브시스템 DLL

By 01/11/2018Windows Internal

환경 서브 시스템 및 서브시스템 DLL

  • Windows Server 2008

 

초기 윈도우는 베이직 POSIX와 함께 배포되었지만 더 이상 시스템과 함께 배포되지는 않는다. 윈도우 비스타 얼티밋과 엔터프라이즈 에디션에서 유닉스 기반 애플리케이션용 서브시스템이라고 하는 크게 향상된 버전을 이용할 수 있다.

윈도우 서브 시스템은 서브시스템 없이 윈도우가 동작할 수 없다는 점에서 특별하다. 다른 두 서브시스템은 온디맨드로 시작하게 구성돼 있다. 반면 윈도우 서브시스템은 반드시 항상 실행중 이어야 한다.

 

서브시스템의 시작 정보는 레지스트리에 저장된다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems

 

  • Required : 시스템이 부트될 때 로드되는 서브시스템을 나열.
  • Windows : 윈도우 서브시스템, 클라이언트/서버 런타임 서브시스템인exe 파일 명세를 가지고 있음.
  • Debug : 비어 있음. 그러므로 아무것도 하지 않음
  • Optional : POSIX 서브시스템이 요구 될 때 시작될 것을 가리킴.
  • Kmode : 윈도우 서브시스템의 커널모드 부분, Win32k.sys의 파일명을 갖고 있음.

 

환경 서브시스템의 역할은 기본 윈도우 익스큐티브 시스템 서비스의 일부분을 애플리케이션에 노출하는 것이다. 각 서브시스템은 윈도우의 네이티브 서비스에 대한 다른 부분 집합을 제공할 수 있다. 이는 해당 서브시스템상에 구축된 애플리케이션은 수행 할 수 있고 다른 서브시스템상에 구축된 애플리케이션에 의해선 처리될 수 없다는 의미이다.

 

각 실행 이미지(.exe)는 서브시스템별로 하나씩 대응한다. 이미지가 실행 될 때 프로세스 생성 코드는 이미지 헤더에서 서브시스템 유형 코드를 조사한다.

 

애플리케이션은 윈도우 시스템 서비스를 직접 호출 하지 않는다. 하나 이상의 서브시스템 DLL을 통하여 호출한다. 이들 라이브러리는 서브시스템에 연결될 프로그램이 호출할 수 있는 문서화된 인터페이스를 노출 한다.

 

애플리케이션이 서브시스템 DLL의 함수를 호출할 때 다음 세 가지 중 하나가 발생한다.

  • 함수 전체가 서브시스템 DLL 내의 유저모드로 구현. 환경 서브시스템 프로세스로 아무 메시지도 전달되지 않는다.
  • 함수가 하나 이상의 윈도우 익스큐티브 호출을 요구
  • 함수가 환경 서브시스템 프로세스에서 수행되어야 하는 어떤 일을 요구. 이 경우 클라이언트/서버 요청은 어떤 동작을 수행하기 위해 서브시스템으로 메시지를 보냄으로써 이뤄진다. 그리고 나서 서브시스템 DLL은 호출자에게 복귀하기 전에 응답을 기다린다.

 

POSIX 서브시스템은 윈도우 서브시스템을 사용하기 위해 윈도우 서브시스템 함수를 호출 한다. 윈도우 서브시스템은 다음과 같은 주요 컴포넌트로 구성 된다.

  • 환경 서브 시스템 프로세스는dll, Winsrv.dll, Csrsrv.dll을 로드하여 다음 기능을 지원한다.
  • 콘솔(text)윈도우
  • 프로세스와 스레드의 생성 관계
  • 16비트 가상 DOS 머신 프로세스를 위한 지원의 일부
  • 사이드 바이 사이드 퓨전과 매니페스트 지원
  • GetTempFile, DefineDosDevice, ExitWindowsEx와 자연 언어 지원 함수 같은 다른 부수적인 함수

 

  • 커널 모드 디바이스 드라이버는(Win32k.sys)의 요소
  • 윈도우 관리자는 윈도우 디스플레이를 제어하고 화면 출력을 관리하고 키보드와 마우스나 여러 장치로부터 입력을 수집하고 애플리케이션으로 유저 메시지를 전달한다.
  • 그래픽 디바이스 인터페이스는 그래픽 출력 장치용 함수 라이브러리다. 선과 텍스트. 그림 그리기와 그래픽 조작용 함수를 포함한다.
  • 다른 커널 드라이버(Dxgkrn.sys)에 구현돼 있는 DirectX 지원을 위한 랩퍼

 

  • 서브시스템 DLL(Kernel32.dll, Advapi32.dll, User32.dll, Gdi32.dll)은 문서화된 윈도우 API 함수를 적절하게exe와 Win32k.sys를 향한 거의 문서화되지 않은 커널모드 시스템 서비스 호출로 변환 한다.
  • 그래픽 디바이스 드라이버는 하드웨어 의존적인 그래픽 디스플레이 드라이버와 프린터 드라이버, 비디오 미니포트 드라이버 이다.

 

윈도우는 전체 시스템의 성능 향상을 위해 윈도우 NT 4 이전에는 윈도우 관리자와 그래픽 서비스는 유저모드는 윈도우 서브시스템의 일부분이었으나 윈도우 NT 4에서 윈도잉과 그래픽 코드의 많은 부분이 윈도우 서브시스템 프로세스의 컨텍스트에서 동작하는 대신 커널모드에서 동작하는 호출 가능한 서비스 집합(win32k.sys)으로 옮겨 졌다. 그리고 비트맵 같은 큰 데이터 구조체를 빠른 전달과 클라이언트와 윈도우 서버 간 스레드/프로세스 전환의 필요를 최소화 하기 위해 클라이언트가 핵심 서버 데이터 구조체에 읽기 전용으로 직접 접근할 수 있게 공유 메모리 버퍼가 사용됐다.

 

이런 최적화에도 불구하고 그래픽 집중적인 애플리케이션을 위한 전체 시스템 성능은 여전히 충분하지 않았다. 확실한 해법은 윈도잉과 그래픽 시스템을 커널모드로 옮겨 추가적인 스레드의 필요성과 컨텍스트 전환을 제거하는 것이다. 또 애플리케이션이 한번 윈도우 관리자와 GDI를 호출하면 이들 서브시스템은 다른 윈도우 익스큐티브 컴포넌트를 유저모드나 커널모드로 전환하는 비용 없이 직접 접근할 수 있다. 이 직접 접근은 GDI가 비디오 드라이버를 호출하는 경우에 특히 중요하다.

 

[참고자료]

Windows Internals

 

2013-08-19 / 강성욱 / http://sqlmvp.kr / http://sqlangeles.com

 

OS, Windows, 윈도우아키텍처, Windowsinternals, OS아키텍처, 윈도우서버, WindowsServer, 윈도우커널, 환경서브시스템, POSIX, sqlmvp, SQL Angeles