14. stack · 2019. 6. 4. · stack start : 0xc0000000 memory management process address space grow...

13
14. Stack 1 Memory Management

Upload: others

Post on 19-Feb-2021

9 views

Category:

Documents


0 download

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