최근 수정 시각 : 2022-08-01 00:38:33

Microsoft Windows/커널


파일:Microsoft 로고.svg
{{{#!wiki style="margin:0 -10px -5px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px"
{{{#000,#e5e5e5
산하 계열사 및 사업부
GitHub · .NET Foundation · Xbox Game Studios · LinkedIn
제품군
하드웨어 Surface · Xbox · HoloLens · PixelSense · Zune
소프트웨어 Windows · Office · Edge · Media Player · Hyper-V · Microsoft Defender · Visual Studio Code · Visual Studio · Windows Terminal · Microsoft PowerToys · Internet Explorer · MS-DOS · Windows Movie Maker · Autoruns
서비스 Microsoft Azure · OneDrive · Skype · MSN · Bing · LinkedIn · Cortana · 테이 · Xbox network · 정품 인증 · MSDN
관련 기술 ASF · ASP · Blazor · COM · DCOM · DirectX · 파일 시스템( FAT · NTFS · ReFS) · MFC · .NET( .NET Core · .NET Standard · C# · F# · Visual Basic .NET · Windows Forms · WPF · Universal Windows Platform · ASP.NET · ML.NET) · OLE · Silverlight · Visual Basic · VBA · WASAPI · Windows 커널 · Windows 디자인 · Windows API · Windows Runtime · WMA · WMV · Xamarin · XNA
관련 인물
빌 게이츠(은퇴) · 폴 앨런(은퇴) · 스티브 발머(퇴사) · 게이브 뉴웰(퇴사) · 사티아 나델라 · 필 스펜서
기타
Microsoft의 제니맥스 미디어 인수 · Microsoft의 액티비전 블리자드 인수 · 빌 게이츠의 굴욕
관련 틀
365 제품군 · 하드웨어 제품군 · Surface 제품군 · Windows 제품군
}}}}}}}}}}}} ||

파일:상위 문서 아이콘.svg   상위 문서: Microsoft Windows

1. 개요2. 상세3. 기술적 설명
3.1. 부팅/종료 과정3.2. 부트로더3.3. ntoskrnl.exe3.4. ntdll.dll3.5. win32k.sys3.6. System Idle Process (유휴 프로세스)3.7. WOW64 (Windows 32-Bit on Windows 64-Bit)3.8. smss.exe3.9. 기본 탑재 드라이버3.10. 서브시스템
3.10.1. csrss.exe
3.11. svchost.exe3.12. conhost.exe
4. NT 커널 사용 운영체제

1. 개요

마이크로소프트에서 개발한 운영체제 커널.

초창기 윈도우 및 일부 개인용 윈도우는 DOS 커널을 사용하므로 해당 문서 참조, 아래는 현용 NT 커널에 관한 내용만을 서술한다.

2. 상세

파일:Windows NT 커널 구조도.svg
위 사진은 Windows NT 계열 커널의 구조도이며, 혼합형 커널이다.

초창기 윈도우는 MS-DOS 위에서 작동하는 형태라 안정적이지 못했고 도스가 없으면 작동하지 않았다. 그래서 만든 도스에 의존하지 않는 커널을 사용하는 윈도우가 바로 Windows NT이다.

Windows NT는 본래 가정용이 아니라 기업 및 서버용으로 개발되었다. Windows 9x(Windows 95, 98, Me)는 DOS 기반이다. 하지만 DOS 기반 윈도우는 불안정하여 블루스크린 발생 빈도가 높았다.

가정용으로 개발된 Windows XP부터 NT 커널을 사용하기 시작했다. DOS 기반보다 나은 성능와 안정성으로 사용자들에게 큰 인기를 받으면서 Windows 11까지 사용하는 대중적인 커널이 되었다.

새로 설계한 커널이므로 DOS/9x 프로그램와의 호환성은 없다. 물론 호환성을 보장하기 위해 NTVDM(NT Virtual DOS Machine)와 WoW(Windows on Windows)가 있었으나 완전하지 않았으며 그마저도 64비트에서는 AMD64의 특성[1] 때문에 NTVDM와 WOW는 제거되었다. 64비트만 존재하는 Windows 11부터는 사실상 완전히 사라졌다.

일반 윈도우와 서버 윈도우, 게이밍 콘솔(엑스박스 시리즈) 윈도우, 모바일 윈도우의 커널은 차이가 없다. 서버 윈도우는 그냥 서버 관리를 위한 기능들이 추가되었을 뿐이고 각각의 다른 윈도우들도 쓸모없는 기능을 끄고 필요한 기능이 추가 되었을 뿐이다.

다만 하드웨어 제약이 심한 구형 게이밍 콘솔 2종(엑스박스 1, 엑스박스 360)은 기존 NT 커널을 크게 축약시켰기 때문에 NT 커널 계열이지만 윈도우 커널이라고는 부를수없다고 한다. 이후 나온 엑스박스 원 부터는 이런 제약이 완화돼서 그냥 윈도우 커널이 통째로 들어간다.

3. 기술적 설명

3.1. 부팅/종료 과정

컴퓨터를 키면 BIOS/ UEFI 과정을 거친 후 부팅 드라이브를 찾아 그 드라이브의 MBR/GPT 부트로더를 실행한다.

이후 MBR/GPT 부트로더는 시스템 폴더에 있는 winload.exe를 실행하고 winload.exe는 ntoskrnl.exe 파일을 실행한다. ntoskrnl.exe의 EP(Entry Point)는 KiSystemStartup 함수이다.

실행된 ntoskrnl.exe는 CPU를 초기화하고 HAL(Hardward Abstraction Layer, 하드웨어 추상화 레이어)와 여러 시스템(객체 관리자, I/O 관리자 등)을 초기화하고 윈도우 환경을 구성한다. 이후 사용자 모드에서 smss.exe 프로세스가 첫번째로 실행되고 나머지 부팅 작업을 한 뒤 로그온 화면을 띄운다.

시스템 종료를 하는 경우 커널 모드의 PopGracefulShutdown이 실행되는데, 중요 프로세스 외의 다른 프로세스를 종료시키고 HAL, 모든 핸들 닫기 등의 절차를 거친 뒤 하드웨어 종료 명령어를 실행한다. ATX(규격) 1.0 이상의 컴퓨터 파워부터는 APM이나 ACPI를 지원하여 운영체제의 통제를 받을 수 있으므로[2] 하드웨어 종료 명령어를 받은 컴퓨터는 자동으로 꺼진다.

이를 지원하지 않는 구형 파워(AT 규격)와 구형 NT 커널에서는 단순히 HDD 헤드 파킹만 하고 사용자가 직접 컴퓨터 전원을 내려야 꺼진다.[3]

3.2. 부트로더

윈도우의 부트로더는 NTLDR와 Windows Boot Manager가 있다. NTLDR는 Windows NT 3.1부터 Windows XP까지 사용하고 Windows Vista부터는 Windows Boot Manager를 사용한다.

NTLDR는 루트 디렉터리에 들어가 있으먀 boot.ini 파일을 불려와서 부팅 메뉴를 구성한다. 또한 ntdetect.com 파일을 통해 하드웨어 정보를 가져온다. 사용자가 부팅 메뉴에서 부팅할 항목을 고르면 해당 항목에서 설정한 정보를 바탕으로 윈도우를 실행하고 ntdetect.com가 수집한 하드웨어 정보를 커널에 넘겨준다. Windows Boot Manager의 경우 boot.ini 대신 BCD를 사용한다.

Windows XP까지는 부트로더가 어떠한 이유로 꼬이면 NTLDR is missimg라는 메시지를 볼 수 있다. Windows Vista부터는 bootmgr is missing라는 메시지가 나온다.

3.3. ntoskrnl.exe

ntoskrnl.exe은 윈도우의 커널 프로그램으로 윈도우 부팅 전부터 실행된다.[4] 파일 위치는 시스템 폴더에 있다.

커널 프로그램인 만큼 네이티브 API( Windows API)를 전혀 사용하지 않는다. ntoskrnl.exe의 프로세스 이름은 System이다. 커널 모드에서 실행되므로 관리자 권한으로도 종료시킬 수 없다.
파일 이름 멀티 프로세서 지원 PAE 지원
ntoskrnl.exe X X
ntkrnlmp.exe O X
ntkrnlpa.exe X O
ntkrpamp.exe O O
ntoskrnl.exe 외에는 3개의 커널 이미지 파일이 있다. 그게 바로 ntkrnlmp.exe, ntkrnlpa.exe, ntkrpamp.exe으로 멀티 프로세서 사용 여부[5], PAE 지원 여부에 따라 결정된다. ntoskrnl.exe는 멀티 프로세서와 PAE를 전부 지원하지 않는다.
ntoskrnl.exe의 접두사 목록
이름 설명
Cm 레지스트리
Ke 커널의 핵심부
Ki 외부로 노출되지 않는 커널의 핵심부, 커널 초기화, 시스템 콜 등이 해당한다.[6]
Ex 익스큐티브
Exp 외부로 노출되지 않는 익스큐티브
Io 입출력 관리자
Ob 개체 관리자
Se 보안 관리자
Ps 프로세스 관리자
Po 전원 관리자
Mm 메모리 관리자
Dbg 커널 디버깅
ntoskrnl.exe는 함수가 워낙 많다 보니 맨 뒤에 접두사를 붙여서 구분하고 있다. 위에 있는 것들이 다는 아니고 더 있다!

ntoskrnl.exe는 커널 그 자체이므로 이 파일이 손상되거나 없어지면, 말 그대로 윈도우 부팅이 불가능하다. 또한 ntoskrnl.exe에 디지털 서명이 되어 있으며, 윈도우 부팅 과정에서 ntoskrnl.exe의 디지털 서명 여부를 확인하여 서명이 없을 경우 윈도우 부팅 관리자에서 0xc0000428[7] 오류가 발생한다.

커널 패닉 블루스크린도 커널에서 발생하며, 관련 커널 함수는 KeBugCheck, KeBugCheckEx이다. 실제로 시스템 충돌이 발생한 경우 이들 함수 중 하나를 호출하여 블루스크린을 띄우게 만든다.

3.4. ntdll.dll

Windows API의 모든 함수는 ntoskrnl.exe에서 구현되고 ntdll.dll라는 라이브러리 파일을 통해 사용자 모드에 노출된다. 일반 프로그램들은 사용자 모드에서 실행되므로 커널에 직접적으로 접근할 수 없다. 그래서 ntdll.dll의 시스템 콜으로 커널에 요청하는 방법을 사용한다. 파일 생성/삭제 등의 변경, 프로세스 생성, 그래픽 출력, 네트워크 사용 등, 거의 모든 행위는 시스템 콜이 필요하다.

윈도우의 시스템 콜 과정은 시스템 콜 문서 참고.

3.5. win32k.sys

ntoskrnl.exe에는 GUI이나 메시지 처리 기능이 없다. 이 기능들은 win32k.sys라는 별도의 커널 드라이버에서 제공한다. 이 파일 역시 시스템 폴더에 위치한다.

이 드라이버는 윈도우 부팅 시부터 실행하며 GDI, 윈도우(창), 메시지 처리 등을 관리한다. 역시 win32k.sys의 API도 시스템 콜로 구현되어 있다. 이들 함수는 NtGdi, NtUser 집두사가 붙어있고 gdi32.dll와 user32.dll에서 정의된다. 여기서 이 2개 DLL는 win32u.dll의 함수를 호출하게 되는데 win32u.dll는 win32k.sys의 시스템 콜을 실행하게 된다.

Windows 7까지는 win32k.sys 하나 뿐이었지만 Windows 8부터 4개의 드라이버 파일로 분할되었다. (win32k.sys, win32kbase.sys, win32kfull.sys, win32kns.sys)

3.6. System Idle Process (유휴 프로세스)

작업 관리자 등에서 보면 유독 CPU 점유율을 많이 먹는 'System Idle Process'라는 프로세스를 찾아 볼 수 있다.

이 프로세스는 파일로 존재하지 않으며 커널의 시작 단계에서 생성되는 프로세스이다. 그래서 PID가 0이다. 이 프로세스는 남은 CPU 사용량을 계산하고 있어 CPU 점유율이 높은 것이다. 물론 그렇다고 컴퓨터 성능에는 영향을 미치지 않는다. 만약에 한 프로세스가 CPU 사용량을 많이 차지하고 있으면 반대로 System Idle Process 프로세스의 CPU 점유율이 낮아진다.

그 외에 Windows 10에는 Memory Compression, Interrupts, Registry 프로세스가 있다.

3.7. WOW64 (Windows 32-Bit on Windows 64-Bit)

WOW64는 64비트에서 있는 기능으로 32비트 윈도우 실행 파일 및 DLL 파일과 호환할 수 있도록 만들어진 에뮬레이트 기능이다.

64비트 버전에서 시스템 파일들이 있는 System32 폴더 외에 SysWOW64라는 폴더가 있는데 이게 바로 32비트 시스템 파일들이 들어있다.[8] 32비트 프로그램이 System32 폴더에 접근하려고 하면 실제로 SysWOW64 폴더로 접근하게 된다. 따라서 32비트 프로그램이 System32 (64비트) 폴더에 접근하고자 한다면 특정한 선언을 정의해야 한다.

WOW64 기능 관련 파일은 System32 폴더에 있는 wow64.dll, wow64cpu.dll, wow64win.dll이다. 32비트 프로그램이 실행될 때 이 세 파일이 로드되고 32비트 시스템 DLL들와 32비트와 64비트 ntdll.dll이 로딩된다. WOW64는 32비트 프로그램의 Windows API 호출을 가로채서 인자 등을 64비트에 맞게 변경한 뒤 64비트 함수로 호출한다.

따라서 32비트 프로그램은 64비트 프로그램와 동일하게 작동하지만 API 호출 단계가 추가되었기에 따라 성능 하락이 있을수도 있고 32비트의 한계로 최대 2GB의 메모리를 사용할 수 있다.

다만 라이브러리의 경우 DLL의 비트가 프로세스의 비트와 맞아야 한다. 예를 들어 64비트 프로세스에서 32비트 DLL 파일을 사용할 수 없다. 그 반대도 마찬가지로 32비트 프로세스에서 64비트 DLL를 사용할 수 없다. 따라서 64비트만 지원하는 프로그램이 아니면 32비트와 64비트용 DLL를 따로 두어야 한다.

그리고 드라이버는 WOW64가 적용되지 않으므로 반드시 비트에 맞게 로드해야 한다. 즉 32비트 드라이버를 64비트 윈도우에서 사용할 수 없다. 그 반대도 마찬가지다.

3.8. smss.exe

smss.exe는 세션 관리자 하위 시스템(Session Manager Subsystem)으로 윈도우 시작 과정에서 제일 먼저 실행되는 프로그램이다.

초기 실행때부터 환경 변수를 생성하고 사용자 환경 및 GDI 기능을 담당하는 win32k.sys 드라이버를 로드하며 csrss.exe 등 다른 하위 시스템도 실행시킨다. 그리고 마지막으로 로그온 프로그램(LogonUI.exe)을 실행하여 윈도우 로그인 창을 띄우게 만든다.

3.9. 기본 탑재 드라이버

윈도우는 다른 운영체제와 마찬가지로 사용자가 직접 설치하는 서드파티 드라이버 외에는 기본적으로 탑재되어 있는 드라이버가 있으며 그 수가 많다. BIOS, UEFI 드라이버부터 USB, 시리얼 포트 등의 데이터 입출력 단자 드라이버, NTFS, FAT32 등의 파일 시스템 드라이버, TCP/IP, 소켓, TLS 등의 네트워크 드라이버, 그래픽 드라이버나 마우스, 키보드, 사운드카드 등의 휴먼 인터페이스 드라이버 등이 있다.
  • tcpip.sys - TCP/IP 드라이바로 컴퓨터 IP 주소를 할당하고 다른 컴퓨터와 통신하는 역할을 한다. 참고로 블루스크린이 이 드라이버에서 발생하기도 하는데 오류코드가 IRQL_NOT_LESS_OR_EQUAL인 경우가 많다. 그럴 경우 파일 시스템 손상일수도 있으므로 DISM와 SFC를 이용하면 해결될 수 있다.
  • http.sys - 이름에서 알 수 있듯이 HTTP 드라이버다.
  • netio.sys - 네트워크 입출력을 담당하는 드라이버로 위의 tcpip.sys와 http.sys가 이 드라이버의 API를 사용한다.
  • fltMgr.sys - 드라이버 중 한 종류인 미니필터 드라이버들을 관리하는 역할을 한다. I/O 관리자로 거치기 전 혹은 거친 후의 발생하는 미니필터를 설치하거나 제거하는 등의 미니필터 드라이버용 API를 제공한다.
  • i8042prt.sys - i8042 포트를 사용하는 키보드를 위한 드라이버이지만 PS/2 포트도 지원한다.
  • ntfs.sys - NTFS 파일 시스템 드라이버로 NTFS 드라이브를 관리한다.
  • vga.sys - 그래픽 드라이버가 설치되어 있지 않을 때 이 드라이버가 사용된다. 다만 Windows 8부터는 BasicDisplay.sys가 사용된다.

3.10. 서브시스템

서브시스템은 프로세스의 운영체제 API 호출을 관장하는 프로그램을 말한다. 사용자 모드에서 실행하면서 프로세스가 시스템 함수를 호출하면 서브시스템이 이를 커널에 요청( 시스템 콜)하여 커널 모드에서 처리하도록 한 뒤 결과를 받아 해당 프로그램에 전달한다.

또한 서브시스템은 프로세스와 통신할 때 빠른 정보 송신을 위해 IPC 대신 LPC(Local Inter-Process Communication, 로컬 컴퓨터 프로세스간 통신)를 이용한다. LPC는 Windows API에서 문서화되지 않는 요소이며, 오직 커널에서만 사용할 수 있다.

Windows NT 시절에는 Win32 외에는 POSIX, OS/2 서브시스템도 있었으나 Windows XP부터 가정용으로 변모되면서 Win32 외의 서브시스템은 전부 사라졌다. 그래도 Windows Server 2003 R2부터 POSIX에 준하는 서브시스템(SUA, Subsystem for UNIX-based Applications)이 탑재되었으나 리눅스와의 호환성이 부족한데다 기본적으로 켜져있지 않는다.[9] 하지만 이마저도 Windows Server 2012 R2부터 탑재되지 않게되면서 윈도우의 서브시스템은 Win32만 남았었다.

Windows 10부터 리눅스 서브시스템으로 우분투를 탑재했다. 다만 기본적으로 탑재되지 않고 Microsoft Store에서 직접 설치해야 한다. 윈도우 11부터 리눅스 서브시스템에 안드로이드 운영체계가 추가되었다.

3.10.1. csrss.exe

Win32 서브시스템을 말하면 이 프로그램을 의미한다. Win32 프로세스와 LPC 통신하며 시스템 콜을 수행하는 역할을 한다.

Windows Vista부터 csrss.exe는 두개로 실행된다.

csrss.exe는 실행 시부터 크리티컬 프로세스로 지정되기 때문에 강제로 종료시키면 블루스크린이 발생한다. 다만 '일시 정지'시키는 경우는 블루스크린이 발생하지 않은데 모든 csrss.exe를 일시정지시키면 커서만 움직이고 아무것도 못한다(...) 시작 메뉴도 열 수도 없는 등 완전히 기능이 마비되므로 강제 재부팅 외에는 방법이 없다.

3.11. svchost.exe

Win32 서비스들을 처리하는 프로그램으로 별도의 실행파일로 분리되지 않는 기능은 svchost.exe가 맡는다. 그러다보니 그 수가 많다. 모든 svchost.exe 프로세스들은 services.exe에 의해 관리된다.

자세한 내용은 해당 문서를 참조.

3.12. conhost.exe

일반적인 콘솔 프로그램은 자체적으로 창을 가지고 있지 않는다. 그 대신 conhost.exe에게 I/O 통신 방식으로 화면 출력을 위임하여 창을 표시하는 구조로 되어 있다. 기본적으로 콘솔 프로그램에서만 실행된다. 창 프로그램이라면 창이 표시되지 않더라도 conhost.exe가 같이 실행되지 않는다.

conhost.exe는 자식 프로세스로써 부모 프로그램(콘솔 프로그램)에 붙여있기 때문에 conhost.exe를 종료하면 그 부모 프로세스도 함께 종료하게 된다.

Windows 7부터 존재하며 Vista까지는 csrss.exe가 담당한다. XP 및 비스타 베이직 테마에서 도스창이 고전 테마로 나오는 것도 이 때문이다.

4. NT 커널 사용 운영체제


[1] NTVDM와 WOW는 가상 8086를 사용하는데 AMD64의 롱 모드(64비트 모드)에서는 사용할 수 없다. [2] 최신규격 파워와 최신 버전 NT 커널로 갈수록 운영체제가 파워서플라이에 대한 권한이 강해진다. ATX 2.5 규격, NT 10.0 이상부터는 운영체제가 파워를 저전력 모드로 제어할 수도 있다. [3] 이때 등장하는 문구가 "이제 컴퓨터를 끄셔도 좋습니다.(It's now safe to turn off your computer.)" [4] 부트로더가 winload.exe를 실행하고 winload.exe는 ntoskrnl.exe를 로드한다. [5] 멀티코어가 아닌 CPU 2개 이상을 사용하는 것이 멀티 프로세서다. 보통 가정용에서는 사용하지 않으며 서버에서 대량의 데이터 처리를 위해 사용한다. [6] ntoskrnl.exe의 EP(Entry Point)는 KiSystemStartup이다. [7] 파일에 대한 디지털 서명 검증할 수 없음 [8] System32는 오랫동안 쓰인 폴더다보니 무작정 바꿨다가 호환성 문제가 일어날 수 있다. [9] Windows Vista와 7도 얼티밋 에디션 또는 엔터프라이즈 에디션일 경우 제어판에서 SUA를 활성화할 수 있다. [10] 1.X, 2.X, 3.X는 MS-DOS 커널에 의존하고 있으며 Windows 95부터 MS-DOS를 부트로더 및 16비트 프로그램 호환성 계층으로 활용한다.