커널 (Kernel)

By 01/11/2018Windows Internal

커널

  • Windows Server 2008

 

커널은 프로세서 아키텍처별로 다른 저 수준 하드웨어 아키텍처 의존적 지원과 함께 익스큐티브 컴포넌트에 의해 사용되는 기본 메커니즘을 제공하는 Ntoskrnl.exe 내의 함수 집합으로 구성된다. 커널 코드는 주로 C로 작성되었다.

 

[커널 객체]

커널은 익스큐티브의 고수준 컴포넌트가 필요로 하는 것을 수행 할 수 있게 잘 정의된 예측 가능한 운영체제 프리미티브와 메커니즘의 저수준 기반을 제공한다. 커널은 운영체제 메커니즘을 구현하고 정책을 만드는 것을 배제함으로써 익스큐티브의 나머지 부분으로부터 커널 자체를 분리한다. 커널이 구현한 스레드 스케줄링과 디스패칭을 제외한 거의 모든 정책 결정을 익스큐티브에 있다.

 

커널 밖에서 익스큐티브는 스레드와 다른 공유 가능한 리소스 객체로 표현한다. 커널 내에서는 커널 통제 중앙 처리를 돕고 익스큐티브 객체 생성을 지원하기 위한 커널 객체라고 하는 단순 객체 집합을 구현하여 오버헤드를 제거했다. 대부분의 익스큐티브 레벨 객체는 커널에서 정의한 속성과 결합시킨 하나 이상의 커널 객체로 캡술화 되었다.

 

컨트롤 객체라고 하는 커널 객체의 한 집합은 다양한 운영체제 함수 통제에 대한 의미(sementics)을 확립 한다.

 

디스패처 객체로 알려진 또 다른 커널 객체 집합은 스레드 스케줄링을 변경하거나 영향을 주는 동기화 기능을 통합한다. 디스패처 객체는 커널 스레드, 뮤텍스, 이번트, 커널 이벤트 페어, 세마포어, 타이머, 대기 가능 타이머를 포함한다.

 

 

[커널 프로세서 컨트롤 영역과 컨트롤 블록(KPCR과 KPRCB)]

커널은 프로세서 컨트롤 영역이나 KCPR이라고 하는 데이터 구조체를 사용하고 프로세서 한정적 데이터를 저장한다. 프로세서의 인터럽트 테이블과 태스크 상태 세그먼트, 글로벌 디스크립터 테이블 같은 기본 정보를 담고 있다. 또한 ACPI 드라이버와 HAL 같은 다른 모듈과 공유하는 인터럽트 컨트롤러 상태를 담고 있다.

 

KPCR에 접근을 쉽게 하려고 커널은 포인터를 가지고 있는데 32비트 환경에서는 fs 레지스터에 저장하고 64비트 시스템에서는 gs 레지스터에 저장한다. IA64는 항상 0xe0000000ffff0000에 있다.

 

KPCR은 커널 프로세서 컨트롤 블록이라고 하는 내장된 데이터 구조체를 담고 있다. KPRCB는 Ntoskrnl.exe의 커널 코드에 의해서만 사용되는 비공개 구조체이다. 이는 프로세서에서의 실행을 위해 스케줄된 현재 스레드와 다음 스레드, 유휴 스레드, 프로세서를 위한 디스패처 데이터베이스, DPC큐, CPU 벤더와 식별자 정보, CPU와 NUMA 구성, 캐시크기, 시간계정 정보 등과 같은 스케줄링 정보를 담고 있다.

 

KPRCB는 I/O 통계와 캐시 관리자 통계, DPC 통계, 메모리 관리자 통계 같은 프로세서에 대한 모든 통계 정보를 담고 있다. KPRCB는 가끔 메모리 액세스를 최적화하기 위해 캐시 정렬된 프로세서별 구조체를 저장하기 위해 사용된다.

 

 

[하드웨어 지원]

커널은 윈도우에 의해 지원되는 하드웨어 아키텍처 간의 차이점으로부터 익스큐티브와 디바이스 드라이버를 추상화하거나 격리시킨다. 이는 인터럽트 핸들링과 예외 디스패칭, 멀티프로세서 동기화 같은 함수에서의 차이점 처리를 포함한다.

 

커널은 이식 가능하고 모든 아키텍처에서 의미상 동일한 인터페이스 집합을 제공한다. 일부는 부분적으로 아키텍처 한정적인 코드가 구현되어 있다. 아키텍처에 독립적인 인터페이스는 모든 머신에서 호출 가능하다. 그리고 인터페이스가 가진 의미는 아키텍처에 의한 코드변화가 있든지 없든지 동일할 것이다. 일부 커널 인터페이스는 HAL에 구현되어 있다.

 

커널은 오래된 MS-DOS 프로그램을 지원할 필요로인해 x86 한정적인 인터페이스 코드를 일부 가지고 있다. 이들 x86 인터페이스는 의미 그대로 이식 가능하지 않으며 다른 아키텍처에 기반한 머신에서는 호출 될 수 없으며 존재하지도 않는다.

 

커널의 다른 아키텍처 한정적 코드 예로는 변환 버퍼와 CPU캐시 지원을 제공하는 인터페이스이다. 이는 캐시가 구현된 방법 때문에 아키텍처 마다 다른 코드를 필요로 한다.

 

다른 예는 컨텍스트 전환이다. 고수준에서는 스레드 선택과 컨텍스트 전환을 위해 같은 알고리즘이 사용되지만 프로세서별 구현은 아키텍처적인 차이가 있다. 컨텍스트가 프로세서 상태에 의해 기술되기 때문에 아키텍처별로 무엇이 저장되고 로드 될지 달라진다.

 

 

[참고자료]

Windows Internals

 

OS, Windows, 윈도우아키텍처, Windowsinternals, OS아키텍처, 윈도우서버, WindowsServer, 윈도우커널, 컨트롤블록, sqlmvp, SQL Angeles

Leave a Reply

%d bloggers like this: