14. stack · 2019. 6. 4. · stack start : 0xc0000000 memory management process address space grow...
TRANSCRIPT
-
14. Stack
1Memory Management
-
스택 확장 개요
확장 가능한 스택 구현
현재 스택의 크기는 4KB로 고정
현재 스택의 크기를 초과하는 주소에 접근이 발생했을 때, 유효한 스택 접근
인지 세그멘테이션 폴트인지 판별하는 휴리스틱을 적용하도록 코드 수정
유효한 스택 접근으로 판별한 경우, 스택을 확장
예) (접근 주소 > 스택 포인터 – 32) 이면 스택 확장
확장 가능한 스택의 최대 크기는 8MB가 되도록 코드 수정
2Memory Management
-
스택 확장 개요
Pintos는 스택의 크기를 4KByte로 고정
스택 포인터(esp)가 Stack 영역을 벗어나면, 세그멘테이션 폴트 발생
3Memory Management
Stack
Uninitialized Data(BSS)
Initialized Data(Data)
Text
eip
esp
Stack base4KByte (유효 스택 영역)
-
스택 확장 개요 (Cont.)
수정 파일
pintos/src/userpog/exception.c
추가 파일
pintos/src/userprog/process.c
pintos/src/userprog/syscall.c
4Memory Management
-
최대 8MB까지 확장
현재 스택 포인터로부터 grow limit 이내에 포함되는 접근은 유효한 스택
접근으로 간주하여 스택을 확장
확장 가능한 스택의 구현
5
Maximum Limit:0xC0000000-8MByte
stack start : 0xC0000000
Memory Management
Process Address Space
grow limit
allocated stack boundary
유효하지 않은 접근으로 간주:세그멘테이션 폴트 발생
esp로부터 grow limit 이내에 포함되는 영역:페이지 폴트 발생시 스택을 확장
stack pointer(esp)
-
스택 확장 과제 관련 코드
사용되는 구조체 및 함수
pintos/src/vm/frame.c
struct page *alloc_page(enum palloc_flags flags)
void free_page(void *addr)
6Memory Management
-
스택 확장 과제 구현관련 소스 코드
pintos/src/userprog/process.c
bool expand_stack(void *addr)
addr 주소를 포함하도록 스택을 확장
최대 8MB까지 확장이 가능
bool handle_mm_fault(struct vm_entry *vme)
가상 메모리 과제에서 구현한 함수
스택 확장을 지원하도록 수정
7Memory Management
-
스택 확장 처리
8Memory Management
handle_mm_fault
페이지 할당?
YES
VM_BIN? VM_FILE? VM_ANON?
실패
데이터 로드(파일 메모리)
데이터 로드(파일 메모리)
swap-in
YES YES YES
페이지 테이블 셋업
NO NO
Check the vm_entry type
NO
성공
expand stack
스택확장?
NO
YES
NO
가상 메모리 구현
Memory Mapped File
스와핑 및 페이지 교체 정책
스택 확장
-
스택 확장 가능 여부 결정 - page_fault()
휴리스틱을 적용하여 스택 확장 여부를 판단
STACK_HEURISTIC사용
expand_stack()호출하여 스택을 확장
9Memory Management
...
if(not_present)
{
struct vm_entry *vme = find_vme(fault_addr);
if(vme)
{
...
}
/* fault_addr이 스택영역인지 확인 후 expand_stack()호출 */
}
...
pintos/src/userprog/exception.c
-
스택 확장 과제 함수 구현
10Memory Management
bool expand_stack(void* addr)
addr 주소를 포함하도록 스택을 확장
alloc_page()를 통해 메모리 할당
vm_entry의 할당 및 초기화
install_page()호출하여 페이지 테이블 설정
성공시 true를 리턴
-
bool verify_stack(void *sp)
sp 주소가 포함되어 있는지 확인하는 함수
sp 주소가 존재할 시 handle_mm_fault() 함수 호출
verify_stack() 함수 구현
11Memory Management
-
스택 확장 과제 검증
스택 확장 과제를 완료 후 코드 동작 확인
경로 : pintos/src/vm
$ make check
실행 결과 109개의 테스트 모두 통과
12Memory Management
-
추가 및 수정 함수
bool expand_stack(void *addr)
/* addr 주소를 포함하도록 스택을 확장 */
bool verify_stack(void *sp)
/* sp 주소가 포함되어 있는지 확인하는 함수 */
static void page_fault(struct intr_frame *f)
/* 페이지 폴트 핸들러 */
13Memory Management