카테고리 없음

[pintos] pj4-file system

bananackck 2025. 2. 20. 23:33

[블로그 이전]

2022.11.24

 

먼저 src/vm에 새로운 파일을 추가하라고 한다.

아래 6개 파일을 일단 쓰자. 일단.

새로운 파일을 만들었으니 이제 makefile에 이 파일을 추가해야 한다.

src/Makefile.build 파일에 들어가 보면 아래와 같이 되있다.

이런 식으로 쭉 있는데

디렉토리명_SRC = 파일경로

디렉토리명_SRC += 나머지 파일경로

이렇게 되있는거 같다.

vm에는 아무것도 없었으니까 아래처럼 되있다.

vm 디렉토리 밑에는 file.c 파일이 없다. 아 주석처리 되있구나. 그냥 해놓은거 같다. 그럼 시작 파일을 머라고 해야될까.

다른 애들을 보니까 상관 없는거 같기도하다.

걍 아무거나 해보자.

보니까 헤더파일은 안 적혀 있다. 소스 코드 파일만 다 적어보자.

이게 맞나..... make 돌려보니 일단 오류는 없다.

자 다음


이제 userprog/execption.c 에서 page_fault()를 조작해야한다.

page_fault() 아래를 보면 이런게 있다.

주석을 읽어보면 virtual memory 하려면 아래를 다 지우란다. 지워주자.

지워준 코드 위에 보면 이게 있다. fault_addr를 가져와서 커널 addr인지 확인한다. 맞으면 종료한다. 그니까 page_fault()가 발생한 곳이 유저 영역이여야 하는구나.

흠 그래라

피피티에 있는 flow chart이다.

이걸 따라가보자.

먼저 Is valid reference? 무슨 뜻이냐. 유효한 참조입니까? 머가 유요한 참조라는 거냐.

메모리 참조가 유요하냐를 물어본거란다.

메모리..........를 그니까....... 먼가 건너뛰었다.

피피티의 위로 넘어가자.


자. 다시 피피티를 읽어보니까

이번 프로젝트에서 해야할 것은 3가지이다.

  1. page table 관리 -> page table 조작하고, page fault handler 구현
  2. paging to and from swap disk -> page가 physical mem에 없을 때 swap하기. 이때 LRU 알고리즘 순서 사용
  3. stack growth -> stack이 모자라서 page fault 나는 경우 해결

1번 부터 해야지 그럼.

기존 page table을 찾아보자. 이건 threads/pte.h 에 있단다.

여기에 필요한 정보를 추가해야 한다.

필요한 정보가 무엇인지는 핀토스 매뉴얼에 적혀있는 거 같다.

노트북으로 작은 글씨 보기 싫으니까 여기까지하고 집에 가야지.

집 가서 프린트해서 볼꺼야. 배도 고프고...ㅠㅜ

으아으아으아으아으아으아으아 집에 왔다. ㅎ 프린트도 했다. ㅎ 성공이야! 나는 할 수 있었던거였어! 침대에 눕지 않았어! 이거야이거!!

기존의 page table은 정보가 부족하다.

따라서 새로운 supplemental page table을 새로 만들어야 한다.

  1. 이거는 어디에 만들까?

=> vm/page.h에 만든다.

2. 여기에 뭘 추가해야 할까?

=> hash table을 추가한다.

그리고 supplemental page table의 pte를 만든다. 이것두 vm/page.h에다가

내 생각에는 page table entry가 page를 말하는 것 같다.

이게 pte도 만들었으니까 프로세스 create을 하면 어떤일이 벌어질까.

먼저 hash table을 초기화 해야겠지.

이를 위해 아래 함수 추가 vm/page.c 에다가

struct  supplemental_page_table* vm_spt_create(void)
static unsigned vm_hash_func(const struct hash_elem *e, void *aux)
static bool vm_less_func(const struct hash_elem *e1, const struct hash_elem *e2)