윈도우 인터널즈
메모리 관리 06 - 스택, 가상 주소 디스크립터
묭묭.cpp
2024. 10. 15. 17:18
메모리 관리 06 - 스택, 가상 주소 디스크립터
스택
- 함수의 인자와 지역 변수, 함수 호출 이후 돌아갈 리턴 주소가 저장되는 임시 저장 위치
- 윈도우 메모리 관리자는 유저 스택과 커널 스택을 스레드마다 제공
- DPC 스택은 프로세서마다 있는 스택
유저 스택
- 스레드 생성 시 메모리 관리자는 기본적으로 1MB로 미리 정의된 메모리를 자동으로 예약
- CreateThread나 CreateRemoteThread(Ex) 함수 호출 시 스택 크기 설정 가능
- /STACK:reserve 링커 스위치로도 설정 가능
가드 페이지
- 1MB를 예약 했더라도 스택의 첫 번째 페이지와 가드 페이지만 커밋
- 스레드 스택이 커져 가드 페이지에 접근하면 예외 발생
- 또 다른 가드 페이지를 할당하여 스택을 확장
- 즉, 요청이 있을 때만 증가함
- 늘어난 스택은 절대 줄어들지 않음
커널 스택
- 커널 스택은 유저 스택의 1MB보다 훨씬 작음
- 32비트 시스템 12KB, 64비트 시스템 16KB
- 가이드 페이지가 추가로 존재하여 16KB 혹은 20KB의 가상 주소 공간을 사용
- 스택 버퍼를 작은 크기로 유지해야 함
- 효과적인 변수 사용, 재귀 호출 최소화
- 커널 스택의 메모리 사용량은 시스템에 더 많은 영향을 줌
커널 코드에서 재귀 호출이 일어날 수 있는 경우
- Win32k.sys에서 처리되는 그래픽 관련 시스템 콜과 유저 모드로의 콜백 사이에는 동일한 커널 스택을 사용
- 따라서 커널로 재진입하는 재귀 호출 발생 가능
커널 스택이 동적으로 커지는 메커니즘
- 동일한 스레드에 의해 그래픽 관련 콜이 추가적으로 일어날 때마다 추가적인 16KB의 커널 스택 할당
- 모든 호출이 리턴(unwinding)되면 추가적으로 할당한 스택을 해제
DPC 스택
- 윈도우는 DPC가 수행될 때 시스템 사용 용도로 프로세서 별 DPC 스택을 유지
- 이런 접근법은 현재 스레드의 커널 스택으로부터 DPC 코드를 분리시킴
- DPC 스택은 시스템 호출 동안 sysenter, svc, syscall 명령을 처리하기 위한 초기 스택으로 설정
- CPU는 이들 명령어가 수행될 때 MSR 중 하나에 기반을 두고 스택을 교환할 책임이 있음
- 그러나 이것은 값비싼 동작
- 윈도우는 모든 컨텍스트 스위칭마다 MSR를 재프로그램하기 원치 않음
- 따라서 프로세서 별 DPC 스택 포인터를 MSR에 설정
가상 주소 디스크립터(VAD)
- 메모리 관리자는 언제 페이지 인 해야하는지 알기 위해 페이지 폴트 이후 페이지를 가져오는 페이지 요구(demand-paging) 알고리즘을 사용
- 지연 평가(lazy evaluation)의 한 형태
새로운 페이지를 서술하기 위해 페이지 테이블을 설정할 때도 지연 평가를 사용
- 페이지 폴트를 발생시킬 때까지 페이지 테이블 생성을 대기
- 큰 메모리 영역에 대해 예약과 커밋을 한 후 페이지에 띄엄띄엄 접근하는 프로세스의 성능을 크게 향상
아직 존재하지 않는 페이지 테이블은 페이지 파일 사용량과 시스템 커밋 양에 포함
- 실제로 생성될 때 공간이 가용되게 포장
- 지연 평가 알고리즘을 사용하면 큰 메모리 블록을 할당하는 것도 빠르게 이뤄질 수 있음
가상 주소 디스크립터(VAD, Virtual Address Descriptors)
- 프로세스 주소 공간에 어떤 가상 주소가 예약되어 있고 어떤 것은 아닌지 추적하는 데이터 구조체 집합
- 넌페이지드 풀에 할당됨
프로세스 VAD
각 프로세스에 대해 메모리 관리자가 VAD 집합을 관리함
- 자체 균형 AVL 트리 알고리즘으로 VAD를 구성
- VAD를 찾을 때 평균적으로 더 적은 횟수의 비교가 일어나게 함
- 동일한 속성을 갖는 해제되지 않은 가상 주소의 각 연속된 영역마다 하나의 VAD 존재
VAD에 저장되는 것들
- 예약될 주소의 영역
- 영역이 공유되거나 전용이 될지 여부
- 자식 프로세스가 영역의 내용을 상속받을 건지
- 페이지 보호 종류
- 등 정보를 저장
주소에 처음으로 액세스 - PTE가 없음
- VAD를 찾아 PTE를 채우는데 이용
- VAD 범위 밖 혹은 커밋되지 않은 영역이면 엑세스 위반 발생시킴
반응형