본문 바로가기

OS

커널 오브젝트(Kernel Object)

728x90

Kernel Object 구조

위 그림은 Windows에서 운영되고 있는 프로세스 및 커널의 일반적인 모습입니다.

검은 점선의 윗 부분을 보통 User 모드라고 하고, 검은 점선의 아래 부분을 Kernel 모드라고 합니다.

 

커널 오브젝트(Kernel Object)를 알기에 앞서

일반적으로 윈도우 어플리케이션 개발자는 윈도우가 제공한 API로 커널 오브젝르르 생성 및 조작해서 어플리케이션을 구현합니다. 그렇기 때문에 Windows로 개발을 하는 사람은 커널 오브젝트에 대한 기본적인 이해가 필요합니다.

'커널 오브젝트'를 이해하기 위해서는 우선 커널이 무엇인지 알아야 한다.

 

커널이란?

컴퓨터 과학에서 커널은 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다. 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러가지 서비스를 제공한다. 핵심이라고도 한다.

커널의 기본적인 디자인; 커널이 응용 소프트웨어를 컴퓨터 하드웨어에 연결하고 있다.

즉, 커널은 OS가 CPU, Memory, Device를 관리하기 위한 기반 시스템이라고 볼 수 있다.

윈도우도 커널 기반으로 동작하는 OS이며 일반적인 사용자(User)는 직접적으로 CPU, Memory, Device에 접근하지 못하고 커널에 의해서 제공된 방식으로 접근이 가능하도록 설계되었다.

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

예를 들어서 이벤트 객체를 생성하도록 요청하는 CreateEvent 함수를 호출하면 커널은 이벤트에 대한 커널 오브젝트를 생성한다.

 

커널 오브젝트란?

커널 오브젝트는 커널에 의해서 생성된 메모리 블록이다. 커널 오브젝트는 커널에 의해서만 조작될 수 있다.

그렇다면 사용자(User)는 어떻게 커널 오브젝트를 사용할 수 있을까?
Windows에서는 Create함수류의 리턴 값으로 HANDLE 값을 리턴해준다. Handle은 32비트 프로세스에서는 32비트, 64비트 프로세스에서는 64비트의 값을 가지는 메모리(숫자)로 구성된다.

내부적으로 Handle 값은 커널 오브젝트와 연동되어 있으며, Windows가 제공하는 API 함수를 호출 시에 사용자는 커널 오브젝트 대신 Handle 값을 전달하여 호출한다.(내부적으로 커널은 Handle을 기반으로 커널 오브젝트에 접근한다.)

Handle 값은 프로세스마다 독립적으로 유지된다. 즉, 다른 프로세스가 같은 커널 오브젝트를 접근한다고 해도 같은 Handle 값을 가진다고 보장할 수 없다.(프로세스는 자신만의 가상주소를 가지기 때문)

 

커널 오브젝트와 연동하는 HANDLE로 디자인 한 이유

그렇다면 왜 Windows에서는 Handle 인자에 의해 API 호출을 통해서 커널 오브젝트에 접근하도록 설계했을까?

이러한 방식은 커널 오브젝트의 데이터 구조체를 일관성 있게 유지될 수 있도록 보호혼다.

이러한 제약을 통해서 이미 Windows API로 개발된 어플리케이션에 영향을 미치지 않으면서 내부적으로 커널 오브젝트를 수정할 수 있도록 설계하였다.

이것은 마치 우리가 DLL 라이브러리를 제공할 때 외부의 사용자에게는 인터페이스만 제공하고 내부 구현에 대한 정보를 전혀 주지 않는 것과 같은 이치이다.

또한 직접적으로 커널 오브젝트를 조작하지 못하게 하여 안정성을 상승시킨다.

 

커널 오브젝트 종류

이벤트(Event), 파일, 파일 맵핑, IOCP, JOB, 뮤텍스(Mutex), 프로세스, 스레드, 세마포어 등등

 

 

[출처]

https://jungwoong.tistory.com/37

https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%84%90_(%EC%BB%B4%ED%93%A8%ED%8C%85)

728x90