{{위키데이터 속성 추적}}
{{소문자}}
'''ntoskrnl.exe''' ([[윈도우 NT]] [[운영 체제]] [[커널 (컴퓨팅)|커널]]<small>(Windows NT operating system kernel)</small>의 준말)은 '''kernel image'''라고도 알려져 있으며, 윈도 NT 커널 공간의 커널과 익스큐티브 계층을 제공한다. 그리고 하드웨어 가상화나 프로세스 그리고 메모리 관리같은 다양한 시스템 서비스를 관리함으로써 시스템의 기본적인 부분이 되고 있다. 이것은 캐시 매니저, 익스큐티브, 커널, 보안 참조 보니터, 메모리 관리자, 스케줄러를 포함한다.<ref name="sysinternals">Russinovich, M: [https://web.archive.org/web/20080408141752/http://technet.microsoft.com/en-us/sysinternals/bb897446.aspx Systems Internals Tips and Trivia], ''SysInternals Information''</ref>

== 개요 ==
이 시스템 바이너리는 [[네이티브 API|네이티브 애플리케이션]] (in that it is not linked against <code>ntdll.dll</code>)이 아니라, 표준 '시작' 엔트리 포인트 즉, 컴퓨터 구조에 독립된 커널 초기 함수를 호출하는 함수를 포함한 것이다. ntoskrnl.exe는 <code>ntdll.dll</code>이 아니라, <code>bootvid.dll</code>, <code>[[윈도우 라이브러리 파일|hal.dll]]</code> 그리고 <code>kdcom.dll</code>에 링크되어 있다. 의존하는 C 런타임 객체들의 정적인 복사본을 요구하기 때문에 실행 파일은 보통 2MB 크기이다.

전체적으로, 4개의 커널 이미지 파일들이 있다. [[다중 처리|멀티프로세서]] 또는 uniprocessor 파일들은 설치 시에 선택되며 PAE 또는 non-PAE 파일들은 [[CPUID|프로세서의 특징]]에 따라 boot.ini 또는 BCD 옵션에 따라 선택된다.
{| class="wikitable sortable" style="text-align: center; margin: 0px auto 10px;"
|+ 커널 이미지 파일이름
|-
! 파일 이름
! 지원<br/>[[symmetric multiprocessing|SMP]]
! 지원<br/>[[Physical Address Extension|PAE]]
|-
| ''NTOSKRNL.EXE''
| {{No}}
| {{No}}
|-
| ''NTKRNLMP.EXE''
| {{Yes}}
| {{No}}
|-
| ''NTKRNLPA.EXE''
| {{No}}
| {{Yes}}
|-
| ''NTKRPAMP.EXE''
| {{Yes}}
| {{Yes}}
|}
윈도우 커널 코딩은 보통 타입 네임으로 (변수 네임이 아니라) Hungarian notation를 사용한다.

ntoskrnl의 루틴들은 이름에 그들이 정의된 ntoskrnl의 구성 요소를 가리키는 접두어를 사용한다. 아래의 테이블은 몇몇을 나열한 것이다.
{| class="wikitable sortable" style="margin-bottom: 10px;"
|+ NT 함수 접두어

! Prefix
! Meaning
|-
| Cc
|파일 시스템 캐시<ref>{{웹 인용
 |author = Microsoft Corporation
 |year = 2009
 |url = http://msdn.microsoft.com/en-us/library/ff539010.aspx
 |title = Cache Manager Routines
 |publisher = [[마이크로소프트]]
 |accessdate = 2016-02-11
}}</ref>
|-
| Csr
|Win32 하위 시스템 프로세스(csrss)와 통신할 때 사용되는 함수들
|-
| Dbg
|소프트웨어 브레이크포인트 같이 디버깅을 지원하는 함수들
|-
| Ex
|Ntoskrnl.exe의 외부 층인 윈도우 익스큐티브
|-
| Exp
|전용 윈도우 익스큐티브 : 밖으로 내보내지지 않는 익스큐티브 층 내부의 루틴들 (p = private)
|-
| FsRtl
|파일 시스템 런타임 라이브러리<ref>{{웹 인용
 |author = Microsoft Corporation
 |year = 2009
 |url = http://msdn.microsoft.com/en-us/library/ff540426.aspx
 |title = File System Runtime Library Routines
 |publisher = [[마이크로소프트]]
 |accessdate = 2016-02-11
}}</ref>
|-
| Io
|입출력 관리자<ref>{{웹 인용
 |author = Microsoft Corporation
 |year = 2009|url = http://msdn.microsoft.com/en-us/library/ff551797.aspx
 |title = I/O Manager Routines
 |publisher = [[마이크로소프트]]
 |accessdate = 2016-02-11}}</ref>
|-
| Ke
|핵심 커널 루틴들<ref>{{웹 인용
 |author = Microsoft Corporation
 |year = 2009
 |url = http://msdn.microsoft.com/en-us/library/ff542078.aspx
 |title = Core Kernel Library Support Routines
 |publisher = [[마이크로소프트]]
 |accessdate = 2016-02-11
}}</ref>
|-
| Ki
|커널 외부에로 내보내어지지 않는 커널 내부의 루틴들 (i = internal)
|-
| Ks
|커널 스트리밍
|-
| Ldr
|PE 파일 관리를 위한 로더 함수들
|-
| Lpc
|로컬 프로시저 호출 (내부의 문서화되지 않은, 그리고 프로세스사이 또는 사용자/커널 메시지 교환 메커니즘에 사용되는)
|-
| Lsa
|로컬 보안 인증
|-
| Mi
|메모리 관리자에 의한 호출을 위해 내보내지지 않은 메모리 관리 함수들
|-
| Mm
|메모리 관리
|-
| Nls
|네이티브 언어 지원
|-
| Ob
| 객체 관리자
|-
| Pfx
|접두어 관리
|-
| Po
| P&P와 전력 관리<ref>{{웹 인용
 |author = Microsoft Corporation
 |year = 2009|url = http://msdn.microsoft.com/en-us/library/ff559835.aspx
 |title = Power Manager Routines
 |publisher = [[마이크로소프트]]
 |accessdate = 2016-02-11}}</ref>
|-
| Ps
|프로세스와 스레드 관리
|-
| Rtl
|런타임 라이브러리. 이것은 네이티브 응용 프로그램에서 사용될 수 있는 많은 유틸리티 함수들을 포함한다. 하지만 직접적으로 커널 지원하지는 않는다.
|-
| Se
|보안
|-
| Vf
|드라이버 확인 프로그램
|-
| Vi
|드라이버 확인 프로그램에 의한 호출을 위해 내보내지지 않는 드라이버 확인 루틴들
|-
| Zw
| Nt 또는 Zw는 ntdll.dll과 ntoskrnl..exe에서 정의된 시스템 호출이다. 사용자 모드의 ntdll.dll에서 호출될 경우, 여기에 속한 함수들은 거의 똑같은 행동을 한다. 커널 모드로 들어가 SSDT를 통해 ntoskrnl.exe의 대응되는 함수를 호출한다. ntoskrnl.exe에서 직접적으로 호출될 경우(커널 모드에서만 가능), Zw는 커널 모드라는 것을 보장하는 반면, Nt는 아니다.<ref>{{저널 인용
 |author = The NT Insider
 |work = OSR Online
 |volume = 10
 |issue = 4
 |date = August 27, 2003
 |url = http://www.osronline.com/article.cfm?article=257
 |title = Nt vs. Zw - Clearing Confusion On The Native API
 |publisher = OSR Open Systems Resources
 |accessdate = 2016-02-11
}}</ref> Zw는 다른 뜻을 의미하지는 않는다.<ref name="oldnewthing_zw">{{웹 인용
 |author = Raymond Chen
 |year = 2009
 |url = http://blogs.msdn.com/oldnewthing/archive/2009/06/03/9687937.aspx
 |title = The Old New Thing : What does the "Zw" prefix mean?
 |publisher = [[마이크로소프트]]
 |accessdate = 2016-02-11}}</ref>
|}

== 초기화 ==
커널이 제어를 받는 경우, 파라미터로 구조체에 대한 포인터를 받게 된다. 이 구조체는 [[부팅|부트로더]]에 의해 배달되며, 이것은 하드웨어에 대한 정보(레지스트리 파일의 경로, 커널 파라미터, 부트로더에 의해 담겨진 파일들의 경로, 부팅 선호 옵션 등)를 담고 있다.<ref>http://www.nirsoft.net/kernel_struct/vista/LOADER_PARAMETER_BLOCK.html</ref> 이 구조체의 정의는 커널 디버거에 의해 검색될 수 있다.<ref name="practical rev eng"/>

[[X86]]에서 커널은 (보호 모드) GDT, IDT 그리고 TSS 준비와 함께 시스템을 받는다. 그러나 각각의 주소를 모르기 때문에 [[중합효소 연쇄 반응|PCR]] 구조를 채우기 위해서는 하나씩 로드해야 한다.

ntoskrnl.exe의 메인 엔트리포인트는 시스템에 의존적인 초기화를 수행하고, 시스템 독립적인 호출한 후에 유휴(idle) 루프에 빠진다.

== 인터럽트 핸들링 ==
현대의 운영 체제들은 입출력 포트 폴링 대신 인터럽트를 사용한다.

[[x86]]에서, 인터럽트들은 인터럽트 [[디스패치 테이블]] (IDT)에 의해 관리된다. 장치가 인터럽트를 유발시키면, 플래그 레지스터의 interrupt flag (IF)가 세팅되며, 프로세서의 하드웨어는 테이블 엔트리가 인터럽트 번호(IRQ)와 일치하는 인터럽트 핸들러를 찾는다. 인터럽트 핸들러는 인터럽트를 조작하고 복구하기 전에 보통 모든 또는 몇몇 레지스터의 상태들 저장한다.

인터럽트 테이블은 하드웨어 인터럽트, 소프트웨어 인터럽트 그리고 예외를 위한 핸들러를 포함한다. 예를 들어 소프트웨어 인터럽트 핸들러는 테이블 엔트리가 0x2e이다. 이것은 <code>KiSystemService</code>를 가리킨다.

== 메모리 관리자 ==
마이크로소프트 윈도우는 [[가상 주소 공간]]을 두 영역으로 나눈다. 낮은 부분은 0부터 시작하며, 각각의 프로세스 마다 독립적으로 초기화되고, 사용자 모드와 유저 모드 모두에서 접근할 수 있다. 프로세스에서 돌아가는 응용 프로그램은 사용자 모드에서 돌아가는 코드를 제공한다. 높은 부분은 몇몇 예외적인 경우를 제외하고는 커널 모드에서만 접근할 수 있으며 시스템 전체적으로 한 번만 초기화 된다. Ntoskrnl.exe는 다른 커널 모드 구성요소들과 같이 이 영역에 매핑된다. 이 영역은 또한 커널 모드 코드(커널 모드 힙과 파일 시스템 캐시)에서 사용되는 데이터도 포함한다.
{| class="wikitable" style="margin-bottom: 10px;"

|+접근 권한에 따른 시작 그리고 끝 세그먼트<ref name="practical rev eng">{{서적 인용
 |title = Practical Reverse Engineering Using X86, X64, Arm, Windows Kernel, and Reversing Tools.
 |date = 2014
 |publisher = John Wiley & Sons Inc
 |isbn = 978-1118787311}}</ref>

! Arch
! MmHighestUserAddress
! MmSystemRangeStart
|-
| x86
| 0x7fffffff
| 0x80000000
|-
| ARM
| 0x7fffffff
| 0x80000000
|-
| x86-64
| 0x000007ff'ffffffff
| 0xffff8000'00000000
|}
물리 메모리(RAM) 주소 범위 전체는 수많은 작은(보통 4KB) 단위로 쪼개진다. 소수의 몇몇 블록들은 [[페이지 테이블]] 엔트리라고 불리는 구조체에 저장되는데, 이것은 OS에 의해 관리되며, 프로세서의 하드웨어에 의해 접근된다. 페이지 테이블들은 트리 구조로 조직되며 top-level 테이블의 물리 페이지 번호는 컨트롤 레지스터 3(CR3)에 저장된다.

== 레지스트리 ==
윈도우 레지스트리는 운영 체제와 응용 프로그램들의 설정 정보를 담고 있는 저장소이다. 이것은 작은 파일들로 최적화 된 파일시스템이라고 생각하면 된다.<ref>{{서적 인용
 |last = Tanenbaum
 |first = Andrew S.
 |title = Modern operating systems
 |date = 2008
 |publisher = Pearson Prentice Hall
 |location = Upper Saddle River, N.J.
 |isbn = 978-0136006633
 |pages = 829
 |edition = 3rd
}}</ref> 그러나 의미론적으로 파일시스템 같이 접근할 수는 없고, 커널 모드에서 구현되며 사용자 모드에 노출된 전문화된 API들을 통해서 접근할 수 있다.

레지스트리는 "하이브"라고 불리는 여러 다른 파일들로서 디스크에 저장된다. 시스템 하이브의 경우 부팅 과정 때부터 로드되어 그 때 필요한 설정 정보를 제공한다. 소프트웨어와 사용자관련 정보를 제공하는 추가적인 레지스트리 하이브들은 시스템 초기화 이후, 그리고 사용자 로그인 이후에 각각 로드된다.

== 드라이버 ==
디스크에서 로드되는 드라이버들의 목록은 <code>SYSTEM</code> 레지스트리 하이브 내의 Serveices 키에서 검색된다. 이 키는 디바이스 드라이버와 커널 프로세스들 그리고 유저 프로세스들을 저장한다. 이것들은 전체적으로 "services"라고 불리며, 같은 공간에 저장되어 있다.

== 같이 보기 ==
* [[윈도우 NT 아키텍처]]
* [[윈도우 NT 시작 프로세스]]

== 각주 ==
{{각주}}

== 읽어보기 ==
* Tanenbaum, Andrew. Modern Operating Systems (3rd Edition). 978-0136006633
* Practical reverse engineering. 978-1118787311

== 외부 링크 ==
* [https://web.archive.org/web/20080219032133/http://www.microsoft.com/technet/technetmag/issues/2007/02/VistaKernel/default.aspx?pf=true Inside the Windows Vista Kernel (TechNet Magazine)]
* [https://web.archive.org/web/20140316215715/http://doxygen.reactos.org/dd/d1f/structLOADER__PARAMETER__BLOCK.html struct LOADER_PARAMETER_BLOCK]
* [http://www.codeproject.com/Articles/9504/Driver-Development-Part-Introduction-to-Drivers Driver Development Part 1: Introduction to Drivers]

{{윈도우 구성 요소}}

[[분류:윈도우 구성 요소]]
[[분류:윈도우 NT 커널]]