210 likes | 588 Views
프로세스와 쓰레드. 프로세스와 쓰레드 및 SEH. 프로세스와 쓰레드 관계. 프로세스와 쓰레드 (1). 프로세스 프로그램 ( 코드 ) 가 메모리상에 읽혀져서 실행중인 상태 . 각 프로세스는 별도의 리소스를 할당 받음 . 쓰레드 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델 . 쓰레드들은 같은 프로세스에 있는 자원과 상태를 공유한다. 프로세스와 쓰레드 (2). 쓰레드 1. 쓰레드 2. 프로세스 제어블록 (PCB). 쓰레드 제어 블록. 쓰레드 제어 블록. 핸들 테이블.
E N D
프로세스와 쓰레드 프로세스와 쓰레드 및 SEH
프로세스와 쓰레드(1) • 프로세스 • 프로그램(코드)가 메모리상에 읽혀져서 실행중인 상태. • 각 프로세스는 별도의 리소스를 할당 받음. • 쓰레드 • 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델. • 쓰레드들은 같은 프로세스에 있는 자원과 상태를 공유한다.
프로세스와 쓰레드(2) 쓰레드1 쓰레드2 프로세스 제어블록 (PCB) 쓰레드 제어 블록 쓰레드 제어 블록 핸들 테이블 . . . 프로세스 주소공간 사용자 스택 사용자 스택 커널 스택 커널 스택
커널 객체와 핸들 테이블(1) • 커널 객체(Kernel Object) • 커널에서 리소스를 원활히 관리하기 위해 중요한 정보를 담아둔 데이터 블록. • 커널 객체는 운영체제 종속적이며, 소멸시점은 운영체제에 의해 결정된다. • 핸들 테이블 • 프로세스에서 사용하는 모든 핸들들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간.
커널 객체와 핸들 테이블(2) 커널 영역 유저 영역 프로세스 핸들 테이블 =커널 객체 헤더= HandleCount = 1 ReferenceCount = 2 핸들 5 =커널 객체 Body= union Body{ 파일객체; 타이머; 쓰레드; … } ObjectReference
핸들 테이블과 핸들 31 26 18 9 1 25 17 10 2 0 핸들값(32bit) Tag Unused Layer1Index Layer2Index Layer3Index Layer3Array Layer1Array EProcess Layer2Array
EPROCESS와 PEB • EPROCESS • 커널영역의 메모리에 표현된 프로세스 정보. • PEB • 유저영역의 메모리에 표현된 프로세스의 추가적인 정보. • 불필요한 커널레벨 진입을 줄임.
ETHREAD 와 TEB • ETHREAD • 실제로 CPU에 의해 명령어가 실행되어지는 실행의 주체. • 쓰레드가 하나 생성될 때마다 ETHREAD구조체가 생성됨. • TEB • (이미지 로더와 DLL들)유저모드 컴포넌트의 컨텍스트 정보를 저장. • 커널모드에서만 쓸수 있는 영역에 Write 하기 위해서 필요.
전체 구조 프로세스 실행시 커널/유저 영역의 개략적인 상태 Vad Vad =TEB= Peb 쓰레드ID 유저영역 =PEB= Ldr =LDR_MODULE= Vad LDR_MODLE … 커널영역 커널Obj헤더 커널Obj헤더 =ETHREAD= Teb 프로세스ID 쓰레드ID ThreadListEntry =핸들테이블= EPROCESS ETHREAD =EPROCESS= 프로세스ID ObjectTable ThreadListHead Peb VadRoot ActiveProcessLinks ETHREAD 커널 Obj … EPROCESS 커널 Obj …
Structured Exception Handling(1) • 키워드 • _try • _except() • _finally • 특징 • _try{} _except(){} 혹은 _try{} finally{}형태로만 사용 가능.
Structured Exception Handling(2) • try{ } finally{ } • 프로그램이 정상/비 정상적으로 실행되더라도 반드시 실행되어야 하는 코드가 있는경우. try{ pMem = MemAlloc(100); a = b/c; //c=0 //MemRelease(pMem); }_finally{ if(pMem != NULL){ MemRelease(pMem); }
Structured Exception Handling(3) • _try{ } _except(EXCEPTION_EXECUTE_HANDLER){ } • 예외상황 발생시 예외처리 _try{ a = b/c; //c=0 print(“did you see this?); }_except(EXCEPTION_EXECUTE_HANDLER){ //예외 처리 }
Structured Exception Handling(4) • _try{ } _except(EXECPTION_CONTINUE_EXECUTION){ } • 예외상황 발생시 계속 진행 global int a = 0; _try{ int c = 10/a; print(“did you see this?”); }_except( RecoverException( GetExceptionCode() )){ } RecoverException(DWORD Ecode) { if(Ecode == 0나누기 예외) { a = 2; } return EXCEPTION_CONTINUE_EXECUTION; }
Structured Exception Handling(5) • _try{ } _except(EXCEPTION_CONTINUE_SEARCH){ } • 밖에 있는 예외 핸들러를 통해 예외를 처리. DivideZero(){ _try{ a = b/c; //c=0 }_exception( EXCEPTION_CONTINUE_SEARCH){ } } _try{ DivideZero(); print(“did you see this”); }_except(EXCEPTION_EXECUTE_HANDLER){ //예외 처리 }