윈도우 커널

 



1. 개요
2. ntoskrnl.exe
3. WOW64
4. System Idle Process
6. conhost.exe


1. 개요


[image]
위 사진은 Windows NT 계열 커널의 구조도이며, 혼합형 커널이다.
Windows 9x 시절에서는 MS-DOS 기반으로 작동하기 때문에, 도스가 없으면 작동하지 않았다. 하지만 Windows NT부터 도스를 버리고 자체적인 커널을 사용하기 시작하여 현재에 이르게 되었다.

2. ntoskrnl.exe


'''ntoskrnl.exe'''은 윈도우 부팅 전부터 실행되며[1], 커널을 초기화시킨다. 파일 위치는 시스템 폴더에 있다.
이 프로그램에서 모든 커널 함수를 포함하고 있기 때문에 네이티브 API(Windows API)를 사용하지 않는다. 프로세스 이름으로 System이다.
커널(Ke)[2], 캐시(Cc), 보안(Se), 입출력(Io)[3], 메모리 관리자(Mm), 커널 디버깅(Dbg), 프로세스(Ps) 등 온갖 기능이 이 프로그램에 들어가 있다.
ntoskrnl.exe는 커널 그 자체이기 때문에 이 파일이 손상되거나 없어지면, 말그대로 윈도우 부팅이 불가능하다. 또한 ntoskrnl.exe에 디지털서명이 되어있으며, 윈도우 부팅 과정에서 ntoskrnl.exe의 디지털서명 여부를 확인하여 만약 안되어 있을 경우 윈도우 부팅 관리자에서 0xc0000428[4] 오류가 발생한다.
ntoskrnl.exe는 커널모드에서 실행하고 있기 때문에, 관리자 권한으로 종료를 시도하더라도 먹히지 않는다. 대부분의 운영체제는 커널 모드와 사용자 모드로 나누어져, 일반 프로그램들은 사용자 모드에서 실행되고, 드라이버 같은 커널을 다루는 코드들은 커널모드에서 실행한다. 당연히 일반 프로그램들은 커널모드에 직접적인 접근이 불가능하다. 따라서 시스템 콜로 커널에 요청하여 대신 처리하게 해준다.
여기서 시스템 콜 역할은 ntdll.dll이다. ntoskrnl.exe와 마찬가지로 시스템 폴더에 있다. 모든 프로그램들은 어떤 윈도우 API를 호출하든 반드시 ntdll.dll를 거치게 된다.
디바이스 드라이버는 커널모드에서 실행되기 때문에 시스템 콜을 통하지 않고 ntoskrnl.exe의 함수를 직접 호출할 수 있다.
커널 패닉블루스크린도 커널에 의해 발생하며, 관련 커널 함수는
KeBugCheck
,
KeBugCheckEx
이다. 실제로 시스템 충돌이 발생한 경우 이들 함수 중 하나를 호출하여 블루스크린을 띄우게 만든다. 64비트 윈도우에서는 커널 패칭을 막기위해서 PatchGuard 기능이 있다. 커널의 변경 여부를 확인하여, 변경이 감지될 시 즉시 블루스크린을 일으킨다.

3. WOW64


WOW64('''W'''indows 32-Bit '''o'''n '''W'''indows '''64'''-Bit)는 64비트에서 있는 기능으로 32비트 윈도우 실행 파일 및 DLL 파일와 호환할 수 있도록 만들어진 에뮬레이트 기능이다.
64비트 버전에서 시스템 파일들이 있는 System32 폴더 외에 SysWOW64라는 폴더가 있는데 이게 바로 32비트 시스템 파일들이 들어있다.[5] 32비트 프로그램이 System32 폴더에 접근하려고 하면 실제로 SysWOW64 폴더로 접근하게 된다. 따라서 32비트 프로그램이 System32 (64비트) 폴더에 접근하고자 한다면 특정한 선언을 정의해야 한다.
WOW64 기능 관련 파일은 System32 폴더에 있는 wow64.dll, wow64cpu.dll, wow64win.dll이다. 이 파일들은 32비트 프로그램이 실행될 때 함께 로드된다. 또한 32비트 ntdll.dll와 64비트 ntdll.dll이 동시에 로드되며 나머지 32비트 시스템 DLL들이 로드된다.

4. System Idle Process


작업 관리자 등에서 보면 유독 CPU 점유율을 많이 먹는 'System Idle Process'라는 프로세스를 찾아 볼 수 있다.
이 프로세스는 파일로 존재하지 않으며 커널에 의해 생성된 프로세스이다. 이 프로세스는 남은 CPU 사용량을 계산하는 역할을 맡고 있어 CPU 점유율이 많다는 것이다. 물론 그렸다고 컴퓨터 성능에 영향을 미치지 않는다. 만약에 한 프로세스가 CPU 사용량을 많이 차지하고 있으면 반대로 System Idle Process 프로세스의 CPU 점유율이 낮아진다.
그 외에는 Memory Compression, Interrupts, Registry 프로세스가 있다.

5. svchost.exe


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

6. conhost.exe


일반적인 콘솔 프로그램은 자체적으로 창을 가지고 있지 않는다. 그 대신 conhost.exe에게 화면 출력을 위임하여 창을 표시하는 구조로 되어 있다.
기본적으로 콘솔 프로그램에서만 실행된다. 창 프로그램이라면 창이 표시되지 않더라도 conhost.exe가 같이 실행되지 않는다.
conhost.exe는 자식 프로세스로써 부모 프로그램(콘솔 프로그램)에 붙여있기 때문에 conhost.exe를 종료하면 그 부모 프로세스도 함께 종료하게 된다.
[1] 부트로더가 winload.exe를 실행하고 winload.exe는 ntoskrnl.exe를 로드한다.[2] 커널 내부적으로 사용하는 Ki 집두어를 가진 함수가 있다. 물론 내부적으로 외부에서 호출 불가능하며, 기본적으로 커널 초기화 관련 함수들이다.[3] 파일 시스템도 포함된다.[4] 파일에 대한 디지털 서명 검증할 수 없음[5] System32는 오랫동안 쓰인 폴더다보니 무작정 바꿨다가 호환성 문제가 일어날 수 있다.