Computer Science/CS

[CS] Windows kernel programming

owls 2022. 9. 7. 23:25
728x90

Kernel

운영체제의 중심에 위치하여운영체제에 기본적인 기능을 제공하는 핵심 부분입니다.

모든 작업은 커널의 동작에 의해 제어되며, 프로세스 관리, 메모리 관리, 파일 시스템 관리, 인터럽트 처리, 프로그래밍 인터페이스 제공 등의 기능을 제공합니다.

하드웨어에 관련된 모든 작업은 응용 프로그램이 직접 접근 해서 사용하는 것이 아닌, 하드웨어와 소프트웨어의 중간에서 그 동작을 중계 역할을 하는 소프트웨어에 종속되어 '요청'을 하는 것입니다. 바로 그러한 역할을 하는 것이 커널입니다.

Kernel object

- Kernel에 의해 관리되는 리소스 정보를 담고 있는 데이터 블록입니다.

-  OS가 하드웨어 제어를 하며, 해당 리소스에 대한 Kernel의 제어 단위라고 할수 있습니다.

- Kernel이 실행되면 그 Kernel이 제어할 부분에 대한 정보가 담기는 메모리 블록이 필요합니다.

  쓰레드, 프로세스, 파일 등에 대한 제어 요소의 정보가 담기는 그 단위를 바로 Kernel이라 부릅니다.

 

 프로세스가 하나 생성되면, 그 프로세스에 대한 커널 오브젝트가 생성됩니다. 바로 이 커널 오브젝트를 통해, 응용 프로그램이 커널이 관리하는 리소스의 특성을 변경할수 있습니다.

 

Kernel object 종류

1. 파이프 커널 오브젝트

2. 프로세스 커널 오브젝트

3. 쓰레드 커널 오브젝트

 

프로세스 커널 오브젝트 생성 과정

1. CreateProcess 함수 호출로 인한 프로세스 생성 요청

2. Windows OS가 요청 수료

3. OS가 프로세스 생성, 동시에 프로세스 정보를 포함하는 커널 오브젝트(커널 오브젝트 구조체) 생성

 

핸들과 커널 오브젝트

- 핸들은 커널 오브젝트를 응용 프로그램으로 조작할수 있는 조작 함수입니다.

   (프로세스 커널의 우선순위를 변경하는 등의 일을 수행)

- 커널 오브젝트에 접근할수 있는 직접적인 수단은 존재하지 않고, 바로 이 핸들로 커널 오브젝트에서 허용한 기능을 수행하도록 간접적으로 조작이 가능합니다.

 

프로세스 생성시, 넣어준, _PROCESS_INFORMATION 구조체로, 핸들을 얻어올수 있습니다.

typedef struct _PROCESS_INFORMATION
{
    HANDLE hProcess; //프로세스의 핸들
    HANDLE hThread; //쓰레드 핸들
    DWORD dwProcessId; //프로세스의 ID
    DWORD dwThreadId; //쓰레드 ID
} PROCESS_INFORMATION;

커널 오브젝트는 기본적으로 구조체이고, 직접 접근은 불가능합니다.

그래서 숫자로 이루어진 핸들을 사용하면 접근이 가능해지고 요소를 조작할수 있습니다.

 

System Calls 

커널 영역의 기능을 사용자 모드가 사용 가능하게 해주며, 프로세스가 하드웨어에 접근하여 필요한 기능을 사용할 수 있게 해준다. 사용자 및 응용 프로그램으로부터 컴퓨터의 자원을 보호하기 위해 직접 접근 차단 인터페이스라 볼 수 있습니다. 

 

시스템 호출(system call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 보통 C나 C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법입니다.

 

응용프로그램이 함수를 실행하면 Kernel32.dll의 API를 호출하고, 해당 API는 다시 ntdll.dll 함수를 호출한다.

그럼 ntdll.dll에선 커널에 요청해야 할 서비스 번호를 이용하여 특정 시스템 자원에 접근할 수 있게 됩니다.

 

*API(Application Programming Interface) : 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합

출처: Operating System Concepts 10th - SILBERSCHARTZ 68page
Windows kernel 구조 (출처 : https://namu.wiki/w/Microsoft%20Windows/%EC%BB%A4%EB%84%90)

HAL(Hardware Abstraction Layer) 하드웨어와 소프트웨어 간의 원활한 통신을 가능하도록 해주는 기능
Micro Kernel 다양한 커널 종류 중 하나로 하드웨어와 통신만을 제어하는 최소한의 역할만 하는 커널
   

프로세스 스케줄링, 메모리 관리 등의 작업들은 각종 관리자에게 맡긴다.

(System32 폴더의 ntopskrnl.exe가 마이크로 커널)

 

I/O Managaer 시스템의 입출력을 제어, 장치 드라이버 사이에서 메시지를 전달
(하드웨어와 응용 프로그램이 바로 통신 가능)
Security Reference Monitor 각 데이터나 시스템 자원 제어를 허가/거부, 시스템의 보안을 강제적으로 설정
IPC Manager 프로세스 사이에 데이터를 주고 받는 통신
VMM(Virtual Memory Manager) 응용 프로그램 요청에 따라 RAM 메모리 할당, 가상 메모리의 페이징 제어
Process Manager 스레드 생성 및 처리

 

커널 제어

User단에서 이벤트 발생시 이벤트 핸들러를 통해 OS 하위 단으로 내려가게(input) 되고 원래 kernel 의 명령(output)을 캐치하여 다른 명령으로 보낸다.

 

참고 문서

https://wiserloner.tistory.com/668

 

728x90