Soft Ware/Windows 구조와 원리

스레드

달려가보자 2011. 11. 16. 02:02

- 스택 메모리 공간 생성시 스레드가 생성되는 단계에서 함께 만들게 된다.

- 스레드 생성시 디폴트로 1Mbyte의 메모리를 예약 -- > 이중 4Kbyte만을 실제로 메모리와 매핑시켜놓음으로써 사용가능하게 하고 ---> 또 하나의 메모리는 가드페이지라는 형태로

 
- 첫 페이지는 4kByte 영역은 커미드 영역 프로그램에서 바로 스택영역으로 사용 되어 질수 있는 영역 
  그 아랫부분은 한페이지인 4KByte 영역은 가드페이지 라는 형태로 윈도우에 의해 페이지 보호가 
  이루어 지고 있는 상태


--> 스레드에서 커미드 되어진 영역을 초과하여 스택을 사용했을때 가드 페이지 부분에 대한 접근이
      이루어 질것이고 Windows 운영체제에서는 가드 페이지 영역을 커미드 영역으로 바꾸고
      그 아래 가드 페이지를 생성

    스택을 더 쓰게 되면 ... 
 



 커미드 영역  커미드 영역
 가이드 영역  커미드 영역
 예약 영역   가이드 영역
   예약 영역 
 

이처럼 변하게 된다 여기서 스택이 초과해서 가이드 영역을 없어 지고 한번더 스택이 초과시에는 오류가 발생 된다.

그이유는 마지막에 예약 페이지를 둠으로서 더이상 스택 오버플로를 알리기 위해서 이다 .

오버플로를 알리지 않는다면 사용자는 스택이 어디까지 침범할지를 모름으로 예약페이지를 

마지막에 둠으로서 알리기 위해서다  

또한 사용되지 않는 스택 영역에 대해서는 가드 페이지와 예약 페이지를 할당하여 놓음으로서

해당 페이지가 프로그램에 의해 액서스 되었을때 페이지 폴트에러 발생 이때 페이지 폴트 에러를

처리하는 함수에서는 접근 하려고 했던 메모리가 스택 메모리 였는지를 확인 한후 스택 메모리

였을 경우 아래와 같이 zwAllocateVirtualMemory 함수를 사용하여 새로운 페이지(4KByte)를 할당

FS  <--- 현재의 스택 페이지 값을 저장, 증가된후 TIB의 StackLimit값을 4KByte 증가 
 

'Soft Ware > Windows 구조와 원리' 카테고리의 다른 글

지연 쓰기 란  (0) 2012.01.04
캐시 관리자  (0) 2012.01.04
함수의 리턴값에 대해서 ....  (2) 2011.11.16
스택 백트레싱  (0) 2011.11.16
함수 호출  (0) 2011.11.16