일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래밍 기초
- OculusMotionVectorPass
- 가상 바이트
- Windows Build
- Cell Shader
- Rim Light
- Toon Shader
- C언어
- 작업 집합
- URP로 변경
- 메모리 누수
- Three(Two) Tone Shading
- URP
- Private Bytes
- AppSW
- ASW(Application SpaceWarp)
- working set
- Virtual Byte
- Cartoon Rendering
- VR
- Specular
- 3d
- 게임 수학
- 개인 바이트
- 벡터
- ColorGradingLutPass
- Cell Look
- Today
- Total
WinCNT
커널 오브젝트 본문
(참고 서적) WINDOWS VIA C/C++의 3장 커널 오브젝트
커널 오브젝트란?
WinObj
커널 오브젝트는 커널에 의해 할당된 간단한 메모리 블럭이다
커널 오브젝트의 데이터 구조체는 커널에서만 접근이 가능하기 때문에,
응용 프로그램에서 데이터 구조체가 저장되어 있는 메모리 위치를 직접 접근하여 그 내용을 변경하는 것은 불가능하다
MS사는 커널 오브젝트 구조체가 일관되게 유지될 수 있도록 제약 사항을 의도적으로 만들었다
(운영 체제를 견고하게 하기 위해)
직접 접근이 불가능한 대신 API를 통해 핸들 "값"을 통해서 제어할 수 있다
(유저는 핸들 값을 변수에 저장해 놓고 사용한다)
운영핸들 값은 프로세스 별로 독립적으로 유지한다
만일 프로세스간 통신 등을 통해서 다른 프로세스에 핸들 값을 전달했다고 하더라도
이 핸들 값을 이용해서 수행하는 동작은 의도대로 작동하지 않을 수도 있다
왜냐하면 각 프로세스는 독립된 커널 오브젝트 핸들 테이블이 존재하며,
동일한 핸들 값이라고 해도 전혀 다른 커널 오브젝트를 참조할 수도 있기 때문이다
사용 카운트
shared pointer와 비슷한 개념
shared_pointer
힙에 객체를 할당하고 포인터 변수로 접근
shared_pointer<클래스 등>
참조 카운트를 가지고 관리
공유되는 자원은 참조 카운트 등으로 관리하는 경우가 많다
카운트가 0이 되면 메모리에서 삭제하는 방식
프로세스의 커널 오브젝트 핸들 테이블
커널에 의해 프로세스가 초기화되면
운영체제는 프로세스를 위해 커널 오브젝트 핸들 테이블을 할당한다
테이블 구조는 주로 자료, 검색, 관리가 필요할 때 사용된다
커널 오브젝트는 커널에서 관리(프로세스는 접근 불가능)
프로세스도 커널에서 관리
커널 오브젝트는 프로세스에 할당된 것이 아니라 커널 영역에 따로 존재하지만,
커널 오브젝트 핸들 테이블은 프로세스별로 할당된다
커널 오브젝트 생성
커널 오브젝트 생성 - 커널
핸들 값으로 제어
커널 오브젝트를 생성하는 함수(일반적으로는 Create...류의 함수)는
생성에 실패하면 보통 0(NULL)을 반환한다.
예시) CreateMutex(...); 함수
하지만 일부 함수는 -1(WinBase.h에 정의된 INVAILD_HANDLE_VALUE)를 반환한다
예시) CreateFile(...); 함수
그러니 반드시 메뉴얼을 확인하자!
커널 오브젝트 삭제하기
다음의 함수로 해당 프로세스가 더 이상 커널 오브젝트를 사용하지 않을 것임을 시스템에 알릴 수 있다
BOOL CloseHandle(HANDLE hobject);
물론 커널 오브젝트 자체는 사용 카운트가 0이 되지 않는 이상 파괴되지 않는다
프로세스 간 커널 오브젝트 공유
프로세스간 커널 오브젝트를 공유하는 방법은 주로 3가지가 존재한다
- 오브젝트 핸들의 상속을 이용하는 방법
- 명명된 오브젝트를 사용하는 방법
- 오브젝트 핸들의 복사를 이용하는 방법
오브젝트 핸들의 상속을 이용하는 방법
오브젝트 핸들의 상속은 프로세스에서 다른 프로세르를 생성/실행
독립적으로 실행
명명된 오브젝트를 사용하는 방법
오브젝트 핸들의 복사를 이용하는 방법
DuplicateHandle 함수를 사용해서 프로세스 간에 커널 오브젝트를 공유할 수 있다
DuplicateHandle의 첫 번째 매개변수(hSourceProcessHandle)와
세 번째 매개변수(hTargetProcessHandle)에 프로세스 커널 오브젝트의 핸들을 넘겨줘야 한다
프로세스 커널 오브젝트(process object) 또한 커널 오브젝트의 일종으로
커널에서 관리하는 간단한 메모리 구조체를 말한다
새로운 프로세스가 생길 때마다 프로세스 오브젝트가 생긴다
헷갈리지 말아야 할 것은 프로세스의 메모리 공간은 유저 공간이다
가상 주소 공간은 커널이 부여한다
DuplicateHandle 함수는 보통의 경우, 두 개의 프로세스에 대해서 사용된다
예를 들어 하나의 프로세스가 특정 커널 오브젝트에 접근할 수 있고,
다른 프로세스도 동일한 커널 오브젝트에 접근해야한다면
DuplicateHandle 함수를 통해서 다른 프로세스에게 커널 오브젝트에 접근할 수 있도록 해줄 수 있다
또한 DuplicateHandle 함수에는 읽기/쓰기 권한을 가진 파일-매핑 커널 오브젝트를
읽기 권한만 가진 파일-매핑 커널 오브젝트로 복사한다는 또 다른 사용법도 존재한다
a
'게임 프로그래밍(학습 내용 정리) > 시스템 프로그래밍' 카테고리의 다른 글
Exception Filter (0) | 2022.03.22 |
---|---|
실제 핸들과 허위 핸들(Pseudo Handle) (0) | 2022.03.22 |
프로세스와 스레드 (0) | 2022.03.21 |
커널 오브젝트와 프로세스 (0) | 2022.03.14 |
시스템 프로그래밍이란 무엇인가? (0) | 2022.03.07 |