관리 메뉴

Kim's Programming

커널 오브젝트(Kernel Object) 본문

Programming/System Programming

커널 오브젝트(Kernel Object)

Programmer. 2015. 12. 23. 15:21
커널 오브젝트(Kernel Object)

이전에 CreateProcess함수를 통해서 프로세스를 생성하였는데, 이를 정확히하면 함수를 이용하여 윈도우즈라는 운영체제에게 프로세스    
를 만들어 달라고 요청한 것이고 윈도우즈는 그에 맞게 프로세스를 만들어 준것입니다. 또한 생성된 프로세스의 관리와 소멸, 생성 그리고 상태변화 까지도 모두 하게 됩니다. 이런식으로 여러개의 프로세스를 관리하자면 운영체제 입장에서 항상 기억하거나 갱신해야 할 정보가 생깁니다. 예를 들어 locked , Ready등의 상태정보와 우선순위등은 항상 프로세스 내부에 저장되어야하며 항상 갱신되어야 합니다. 그래야만 스케줄러가 그에 맞게 프로세스를 운용할 수 있습니다.


이러한 정보들을 저장하기 위해 프로세스당 프로세스를 관리하기 위한 구조체 같은 것을 만들게 되는데 이것을 Kernel Object라고 부르게됩니다. 또한 이 커널 오브젝트에는 프로세스를 만든 후에 이 프로세스에 대한 정보를 가득 차게 됩니다.




물론 커널 오브젝트 기반이 되는 프로세스 관리 구조체는 공개되지 않고 있습니다. 하지만 커널 오브젝트들이 프로세스가 생성될 때만 사용되지는 않습니다. 프로세스 내에서의 쓰레드를 생성할 때, IPC(Inter Process Communication)를 위해 사용되는 파이프나 메일슬롯을 생성할 때도 커널 오브젝트를 생성해서 필요한 정보를 채우게 됩니다. 그래야 윈도우에서 관리할 수가 있습니다. 또 파일을 생성할 때도 커널 오브젝트가 생성되어 윈도우 커널에 의한 관리 대상이기 떄문입니다. 하지만 커널 오브젝트는 프로그래머가 직접 조작 할 수는 없습니다. 




커널 오브젝트의 조작


커널 오브젝트의 조작이 직접 조작으로는 불가능하지만 아예 불가능 한 것은 아닙니다. 윈도우즈에서 관리하는 리소스 틍성(예를 들어 프로세스 우선순위)를 변경해야할때 직접적으로는 불가능하지만 마이크로소프트에서 제공해 주는 시스템 함수를 통해서 커널 오브젝트에서 제공하는 함수를 통해서는 간접적으로는 조절할 수 있습니다.  우선 순위를 변경하는 함수는 다음과 같습니다.


1
BOOL SetPriorityClass( HANDLE hProcess,   DWORD dwPriorityClass );
cs


첫 번째 파라메터는 우선순위를 변경할 프로세스의 핸들(Handle)을 전달하며 두번째 파라메터는 우선순위 정보를 전달하게 됩니다.

하지만 또 핸들을 알아봐야 겠지요?


핸들


우선순위를 변경할 때는 특정 커널 오브젝트를 가르켜야 하는데 윈도우즈는 항상 커널오브젝트를 만들 때 마다 핸들이라는 정수값을 부여하게 됩니다. 마치 이름같은 것입니다.



이런식으로 우리는 커널 오브젝트에 간접적인 접근이 가능하게 되고 이런식으로 조절하게 됩니다.