[sw 정글] pintos 3주차 - part 6: Copy on write(cow) ALL PASS
·
지난 글 모음
목표 이전의 pintos는 fork할 때 부모가 메모리가 할당된 page에 대해서 자식에게 복사할 때 같은 내용의 물리메모리를 자식에게도 할당 해주었다. 이처럼 같은 메모리가 두번 복사되는 것은 메모리 낭비이다. 그렇기 fork시에 자식과 부모가 같은 물리 메모리를 가리키게 하고 해당 페이지에 write 요청이 발생하면 새로운 물리메모리를 할당하여 주도록 수정한다. 💡 fork 시 물리메모리를 모두 복사하지 않고 부모와 같은 물리메모리를 공유하다가 write작업 시 해당 페이지의 물리메모리를 새로 맵핑한다. COPY시 코드 수정 fork시에 page와 frame은 복사본은 자식에게 주지만 frame에 있는 kva에는 부모와 자식이 같은 곳을 가리고 있다. bool supplemental_page_tabl..
[sw 정글] pintos 3주차 - part 3: Stack Growth
·
지난 글 모음
목표 이제까지의 pintos의 stack 단일 페이지 stack으로 되어있었다. 이러한 스택을 적절한 page fault에서 stack을 추가로 할당하는 작업을 구현하는 것이 목표이다. vm_try_handle_fault 수정 if (page == NULL) { struct thread *current_thread = thread_current(); void *stack_bottom = pg_round_down(thread_current()->user_rsp); if (write && (addr >= pg_round_down(thread_current()->user_rsp - PGSIZE)) && (addr < USER_STACK)) { vm_stack_growth(addr); return true; }..
[sw 정글] pintos 3주차 - part 2: Anonymous page & Lazy Loading
·
지난 글 모음
Anonymous page 파일으로부터 매핑되지 않은, 커널로부터 할당된 페이지를 뜻한다. 익명 페이지는 힙을 거치지 않고 할당받은 메모리 공간 스택, 힙과 같은 실행 파일에서 사용됨 Lazy Loading(Demanding Paging) lazy loading은 메모리 로딩이 필요한 시점까지 지연되는 디자인 가상 page만 할당해두고 필요한 page를 요청하면 page fault가 발생하고 해당 page를 type에 맞게 초기화하고 frame과 연결하고 userprogram으로 제어권을 넘긴다. 지연로딩 순서 커널이 새 page를 요청하면 vm_alloc_page_with_initializer 호출 initializer는 페이지 구조를 할당하고 페이지 type에 따라 적절한 initalizer를 할당하..
[sw 정글] pintos 3주차 - part 1: Memory Management
·
지난 글 모음
1, 2 주차 pintos는 노션에만 대충 정리하여 블로그에 올릴 내용이 아닌듯하여 3주 차부터 올리려고 한다. 많은 정글 동료, 선배들이 좋은 내용을 많이 블로그에 작성해두었으니 부족한 내용은 좀 더 찾아보면 도움이 될 것이다. 기존 pintos 메모리 문제점 PML4를 가진 기존의 핀토스는 가상 메모리와 물리 메모리가 바로 맵핑되어 있다. 기존 핀토스 메모리 탑재 과정 각 세그멘트(stack, Data, BSS, Code)가 물리페이지에 탑재 heap 제외(pintos에는 heap이 없음) 이 페이지 테이블에 맵핑된 물리주소는 다른 프로세스와 같은 곳을 가리킬 수 있고 이럴 때 page fault가 된다. 그리고 한번 맵핑되면 물리메모리에서 항상 공간을 차지하기에 효율적인 메모리 관리가 되지 않는다...