본문 바로가기

Operating System

[Windows] 커널 오브젝트란?

결론 : 커널 오브젝트는 커널에 의해 생성되는 간단한 메모리 블록

 

커널 오브젝트는 커널에 의해 생성되는 간단한 메모리 블록이다. 그리고 윈도우 운영체제에는 이러한 커널 오브젝트가 다양하게 존재한다. (ex. 이벤트 오브젝트, 파일 오브젝트, IOCP 오브젝트 등 -  그 외 타입은 WinObj이란 툴을 통해서 확인 가능하다.) 그리고 이러한 오브젝트들은 다양한 함수를 통해서 생성된다. 

 

이 메모리 블록은 오직 커널에 의해서만 구조체로 접근이 가능하다. 그리고 이 구조체는 보안 디스크립터, 사용 카운트(Usage Count)를 가지고 있다. 하지만 그 외 값들은 오브젝트 타입마다 굉장히 다양하다. 

예로 들어, 프로세스 오브젝트의 경우는 PCB가 가지고 있어야할 Process ID, 기본 우선 순위, 종료 코드 등과 같은 정보를 가지고 있지만, 파일 오브젝트의 경우는 바이트 오프셋, 공유 모드, 오픈 모드 등과 같은 정보를 가진다.

 

다시 위의 내용으로 가서 주목해야 할 점은 바로 '커널에 의해서만'이다. MS에서는 커널 오브젝트의 구조체가 일관적으로 유지될 수 있도록 제약사항을 만들어 두었다. 이러한 구조체에 대한 직접적인 접근을 제한함으로써, 이미 개발되어있는 어플리케이션의 영향을 미치지 않고도 구조체에 내용을 임의로 추가, 삭제, 변경할 수 있다.

 

이러한 구조체의 내용을 직접적으로 변경할 수 없지만, 어플리케이션이 적절하게 커널 오브젝트를 사용할 수 있게, 구조체 내용에 접근할 수 있게 함수 집합을 제공하고 있다. 커널 오브젝트를 생성하는 함수를 호출할 시 함수는 각 커널 오브젝트를 구분할 수 있게 하기 위한 핸들 값을 반환해준다. 핸들 값은 32비트 윈도우 프로세스에서는 32비트, 64비트인 경우 64비트값이다. 그리고 이러한 핸들 값들은 OS에 영향을 주지 않게 하기 위해 각자 독립적으로 유지된다. 

 

이제 이 구조체의 중요 요소를 알아보자. 

첫번째로 사용 카운트가 있다.

결론부터 말하면, 커널 오브젝트가 공유되는 경우 원래 생성한 프로세스가 종료된 경우 삭제되지 않고, 다른 프로세스가 사용하고 있는 경우를 대비해서 얼마나 많은 프로세스가 이 커널 오브젝트를 쓰고 있는가 체크한 변수라고 이해하면 쉽다. (C++11 이상을 해봤다면 shared_ptr의 동작 원리가 생각날 것이다.)

각 커널 오브젝트는 이러한 사용 카운트 값을 유지하고 있기 때문에, 얼마나 많은 프로세스가 이 커널 오브젝트를 쓰고 있는지 파악이 가능하며, 만약 모든 프로세스가 이 커널 오브젝트를 release했다면 사용 카운트는 0이 되어 시스템 상에서 삭제된다.

 

그리고 두번째로는 보안 디스크립터이다. 

이것도 결론부터 말하자면, 누가 커널 오브젝트를 소유하고 있으며, 어떤 그룹, 그리고 사용자들에 대해 접근이 제한되어 있는지에 대한 정보를 가지고 있는 구조체라 보면 된다.

보통 이 보안 디스크립터는 서버 프로그래밍을 할 경우 많이 사용되는 물건이다. 그리고 그 외 대부분의 어플리케이션의 경우는 현재 프로세스의 보안 토큰(current process security token)을 기반으로 하는 기본 보안 디스크립터를 사용하기 때문에, 커널 오브젝트 생성 시 단순히 NULL 값을 제공하면 된다.


참고자료

『제프리 리처의 Windows Vis C/C++』, 제프리 리처 저, 2008

'Operating System' 카테고리의 다른 글

[Windows] 핸들 테이블  (0) 2022.07.04
[OS/Linux] 파일 디스크립터  (0) 2022.04.24
[OS/네트워크] 네트워크 프로그래밍  (0) 2022.04.24
[OS] CPU 스케쥴링  (0) 2022.02.08
[C#, OS] Monitor  (0) 2022.02.08