embelog
Chapter3. 커널 오브젝트1 본문
1. 커널 오브젝트란 무엇인가?
커널이 리소스를 관리하기 위해 만든 구조체 데이터 블록.
여기서 말한 리소스는 프로세스/쓰레드/뮤텍스/파일 등등이 있다.
예를 들어 위 소스 코드 처럼, 프로세스가 파일 생성을 요청하면, OS는 파일을 생성하기 위한 메모리를 우선 할당하고, 더불어 파일을 관리하기 위한 메모리 또한 할당한다. 여기서 파일을 관리하기 위해 만들어 놓은 구조체를 커널 오브젝트라 한다.
여기서 파일을 관리하기 위해 만든 커널오브젝트의 정보에는
바이트 오프셋, 파일 공유 모드, 파일 오픈 모드 등등이 있다.
더불어, 프로세스 커널 오브젝트의 정보에는 프로세스 ID, 기본 우선 순위, 종료 코드 등등이 있다.
2. 커널 오브젝트 와 핸들 값
OS는 커널 오브젝트를 생성하고, 난 뒤 프로세스에게 커널 오브젝트에 대한 핸들값을 넘겨준다.
여기서 핸들 값이란, 프로세스 핸들테이블에 저장되는 커널오브젝트 정보를 나타내는,
핸들 테이블 Index 값을 의미한다.
예를 들어, OS는 커널 오브젝트를 생성한 후, 프로세스 핸들 테이블에 커널 오브젝트 포인터 정보 등등을 기록하고,
핸들 테이블 내에 추가한 정보의 Index 값을 HANDLE 값으로 하여, 프로세스에게 넘겨준다.
참고로 프로세스는 프로세스별로, 각각의 핸들 테이블 정보를 가지고 있다.
인덱스(핸들값) | 커널 오브젝트를 가리키는 포인터 | 엑세스 마스크 | 플래그 |
1 | 0x??????? | 0x??????????? | 0x??????????? |
2 | 0x??????? | 0x??????????? | 0x??????????? |
3. 커널 오브젝트 특성
3.1. 사용 카운트
프로세스가 요청하에 OS가 커널 오브젝트를 생성하면 참조카운트는 1 증가한다.
만약 다른 프로세스가 앞서 OS가 생성한 동일한 커널 오브젝트를 참조하게 되면 참조카운트는 1증가 한다.
더불어 CloseHandle 함수를 호출하면 커널 오브젝트 참조 카운트를 1 감소하게 되는데,
만약 커널 오브젝트 참조 카운트가 0 이 되면, 그제서야 OS는 커널 오브젝트를 제거한다.
따라서, 만약 두개의 프로세스가 동일한 커널 오브젝트를 참조하고 있다면, 두 프로세스에서 CloseHandle 함수를 두번 호출하거나, 두 프로세스가 모두 종료되어야 커널 오브젝트는 삭제된다.
3.2 보안
커널 오브젝트에는 보안 관련 정보를 설정할 수 있다.
해당 커널 오브젝트가 어떤 그룹, 사용들에게 접근할 수 있는지 등의 접근 제한 용도로 사용된다.
예를 들어, 파일 오픈의 경우 OS는 유효한 핸들값을 프로세스에게 넘겨주기 전에, 접근 권한이 있는지 살펴본다.
커널 오브젝트에 접근이 거부될 경우, 핸들값으로 NULL을 반환, GetLastError 호출 시 ERROR_ACCESS_DENEIED 반환.
또한, 예를 들어 파일 읽기 전용으로 얻은 핸들값을 가지고, 파일 쓰기용 API 를 호출하게 된다면, 또는 접근 거부 에러가 발생한다.
3.3 커널 오브젝트 생성시 주의점
커널 오브생성 후 HANDLE 값의 성공 여부는 API 함수 정보를 참조하자.
실패하면, NULL 인지 INVALID_HANDLE_VALUE 인지 API 마다 다르다.
3.4 커널 오브젝트 삭제시 주의점
CloseHandle를 호출하여, 커널 오브젝트 참조카운트를 1감소 시킨 후,
해당 핸들값을 NULL로 바꾸어주자.
만약 실수로 핸들값을 NULL로 바꾸어 주지 않은 상태에서, 프로세스의 요청으로 또 다른 커널 오브젝트가 생성되어,
다른 커널 오브젝트의 정보가 이전과 동일한 프로세스 핸들 테이블의 인덱스에 추가 되었다면, NULL로 미쳐 바꾸지 못한 핸들을 이용한 접근은 의도치 않은 상황으로 연출될 우려가 있기 때문
커널 오브젝트 메무리 누수에 주의하자.
커널 오브젝트 참조값이 0이 되어야 커널 오브젝트가 메모리에서 해제되기 때문.
4. 프로세스간 커널 오브젝트 공유법
다음 시간에.....
'Windows Via C++' 카테고리의 다른 글
Chapter2. 문자와 문자열로 작업하기 (0) | 2021.04.18 |
---|---|
Chapter1. 에러 핸들링 (0) | 2021.04.14 |
Chapter15. VirtualAlloc (0) | 2021.03.21 |