개발자 관점에서의 windows os 특징
운영체제를 안다는 전제하에 윈도우즈의 특징
page 크기
default page 크기는 4k = 0x1000이다.
메모리 할당
메모리는 다음과정을 거쳐 할당 받을 수 있다.
예약 → 확정
예약 : 가상메모리간의 메모리 영역을 잡음.
실제 물리메모리에 할당되어있지않고 진짜 그냥 가상으로 잡혀진 상태
사용불가.
확정 : 실제 물리 메모리를 할당
이에 대한 메모리를
사용 가능
처음엔 예약 기능이 왜 있는지 납득이 잘 안갔는데 (쓰지도 못할거 예약하는게 무슨 의미인지)
스레드 스택을 공부하게 되면서 이해가 갔다.
파티션 | x86 32비트 윈도우 | x64 64비트 윈도우 |
---|---|---|
NULL 포인터 할당 | 0x00000000 ~ 0x0000FFFF | 0x00000000’00000000 ~ 0x00000000’0000FFFF |
유저 모드 | 0x00010000 ~ 0x7FFEFFFF | 0x00000000’00010000 ~ 0x000007FF’FFFEFFFF |
64KB 접근 금지 | 0x7FFF0000 ~ 0x7FFFFFFF | 0x000007FF’FFFF0000 ~ 0x000007FF’FFFFFFFF |
커널 모드 | 0x80000000 ~ 0xFFFFFFFF | 0x00000800’00000000 ~ 0xFFFFFFFF’FFFFFFFF |
https://jungwoong.tistory.com/44
페이지 보호 특성
chmod 777을 한번 떠올리면 좋다
실행/읽기/쓰기에 맞춰서 분류되어있다.
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
- PAGE_NOACCESS
- PAGE_READONLY
- PAGE_READWRITE
- PAGE_WRITECOPY
copy 붙어있는건 copy on write 방식으로 작동한다.
잘모르겠는것
- PAGE_TARGETS_INVALID
- PAGE_TARGETS_NO_UPDATE
추가옵션
- PAGE_GUARD : 접근시 exception 일으키는 페이지
- PAGE_NOCACHE : 캐싱 수행X
- PAGE_WRITECOMBINE : 여러 쓰기작업을 결합함
스레드 스택 작동방식
스택은 가상메모리상에는 붙어있어야하니까.. 실제로 커밋하지 않더라도 default로 1mb(0x100’000)를 예약한다.
그다음 일반 페이지, guard 속성을 한 페이지 하나를 하나하나 할당한다. 그러면 일반페이지에 스택이 쌓이다가 guard 속성 페이지에 접근하면 exception일으키고 guard 속성 페이지를 일반 페이지로 그다음 붙어있는 페이지를 guard 속성 페이지로 새로 커밋한다 이런식으로 페이지를 붙여나간다.
그리고 최종적으로 마지막 page에는 따로 commit을 하지않는다. 마지막 page전에 commit을 할때는 추가적으로 0xC00000FD로 정의된 EXCEPTION_STACK_OVERFLOW 예외를 일으킨다. 이때에 대해선 SEH 예외처리를 할 수 있으나 이 이후의 마지막 예약으로만 잡힘 마지막 메모리 영역에 접근하면 access violation을 일으킨다.
그림같은거 많이 첨부되어있는 아래 글이 훨씬 가독성이 좋다.
https://jungwoong.tistory.com/45
MSVC 디버깅시 정보값들
- 0xABABABAB : HeapAlloc으로 메모리 할당만 하고 아직 사용하지 않는 경우 입니다.
- 0xCCCCCCCC : 초기화 되지 않은 스택 메모리입니다.
- 0xCDCDCDCD : 초기화 되지 않은 힙(Heap) 메모리 입니다.
- 0xBAADF00D : 힙(Heap)에 LocalAlloc(LMEM_FIXED)로 메모리 할당한후 초기화 하지 않은 경우입니다.
- 0xFDFDFDFD : Visual Studio 에서 디버깅 할 경우 힙(Heap)에 메모리를 할당한 후 잘못된 메모리 접근을 알기위해서 설정하는 가드(Guard) 값입니다.
- 0xFEEEFEEE : 힙(Heap)에서 메모리를 해제한 경우 설정되어 있는 값입니다.
https://swconsulting.tistory.com/25
_beginthreadex
- https://3dmpengines.tistory.com/620 thread 생성시엔 요걸 쓰자는 얘기.
참고 및 좋은 참고자료들