커널 오브젝트의 사용
: 운영체제나 애플리케이션의 프로세스, 스레드 ,파일 등과 같은 수많은 리소스를 관리하기 위해서 사용한다.
S01 커널오브젝트란?
운영체제는 뮤텍스 오브젝트, 스레드 오브젝트, 파일 오브젝트, 세마포어 오브젝트 등 다양한 형태의 커널 오브젝트를 생성하고 조작한다.
이러한 커널오브젝트는 커널에서 할당한 간단한 메모리 블록이며, 커널에 의해서만 접근이 가능한 구조체로 구성된 상태이다.
또한 WinObj를 통해서 ObjectTypes를 보면 다음과 같은 사실을 알 수 있다. (설치는 구글링 참고)
-
함수의 이름에 포함된 오브젝트의 명칭이 반드시 커널 레벨의 오브젝트 이름과 일치하지 않다.
-> CreateFileMapping 함수는 파일 매핑과 관련된 Section 오브젝트를 생성
그렇다면 커널 오브젝트는 커널에서만 접근이 가능한데 어떻게 사용할 수 있을까?
: 커널 오브젝트를 생성하는 함수를 호출하면, 함수는 각 커널 오브젝트를 구분하기 위한 핸들 값을 반환해준다.
핸들은 각 프로세스 내 모든 스레드에서 사용이 가능하다. 윈도우 프로세스의 bit와 똑같은 bit를 갖는다.
운영체제를 견고하게 하기 위해서 핸들 값들은 프로세스별로 독립적으로 유지된다.
만약 어떤 스레드가 다른 프로세스의 스레드에게 자신의 핸들 값을 전달했을 경우, 이 핸들 값을 이용해 수행하는 동작은 실패 or 더 좋지않은 결과를 초래할 수 있다.
각 프로세스 별로 독립된 프로세스 핸들 테이블일 존재하고, 동일한 핸들 값이라도 전혀 다른 커널 오브젝트를 참조할 수 있기 때문이다.
http://dblab.co.kr/entry/System-Object-Table#void
핸들 테이블에 대한 설명 참고
1. 사용카운트
커널 오브젝트는 프로세스가 아니라 커널에 의해 소유된다.
즉, 프로세스가 커널 오브젝트를 생성 후 종료한다고 하더라도, 반드시 커널 오브젝트가 프로세스와 함께 삭제되는것은 아니다.
커널 오브젝트를 사용하고 있는 모든 프로세스가 종료된 후에, 삭제된다.
각 커널 오브젝트는 내부적으로 usage count(사용 카운트)를 유지하고 있기 때문에, 사용하는 프로세스의 수를 알 수 있다.
최초로 생성되면 1로 설정이 되며, 다른 프로세스가 이미 생성된 커널 오브젝트에 접근하려면 카운트가 증가한다.
모든 커널 오브젝트의 사용카운트가 0이 되면 커널 오브젝트는 삭제된다.
2. 보안
커널 오브젝트는 보안 디스크립터(security descriptor)를 통해 보호 받는다.
보안 디스크립터는 누가 커널 오브젝트를 소유하는지, 어떤 그룹과 사용자에 의해 접근되는지, 제한되는지에 대한 정보를 갖고있다.
커널 오브젝트를 생성하는 거의 대부분의 함수는 SECURITY_ATTRIBUTES 구조체에 대한 포인터를 인자로 받는다.
다음은 그 예시이다
HANDLE CreateFileMappingA(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCSTR lpName
);
대부분 보안 디스크립터의 커널 오브젝트 사용시에는 NULL값을 전달해주면 된다.
혹은 SECURITY_ATTRIBUTES 구조체를 인자값으로 넘겨준다.
보안정보는 많이 다루지는 않지만, 한번쯤 생각해서 사용하는게 좋다.
가령, 레지스트리에서 값을 읽어와야 한다면, KEY_QUERY_VALUE로 조회만 가능하도록 하게 하자.
KEY_ALL_ACCESS 무조건 설정해준다면 딱히 접근 권한에 대해서 고민할 여지가 없어지니까.
어플리케이션의 경우 유저 오브젝트나 그래픽 디바이스 인터페이스(GDI) 오브젝트이며, 커널 오브젝트와 서로 구분이 된다.
그럼 어떻게 구분 할까?
-> 유저 오브젝트나 GDI 오브젝트를 생성하는 함수 중 PSECURITY_ATTRIBUTES형의 매개변수를 갖는 함수는 없다.
'이론공부 > 이것저것 공부' 카테고리의 다른 글
데이터베이스 솔루션 정리 (0) | 2021.06.18 |
---|---|
포인터 의 크기 in c/c++ (0) | 2021.01.04 |
volatile (0) | 2018.03.18 |
게임서버 분류 (0) | 2017.05.01 |
게임서버 시작 (0) | 2017.05.01 |