life is egg
[PINTOS] 구조체 초기화 본문
pintos 프로젝트 3 가상메모리
가상메모리 관련 구현중 vm_alloc_page_with_initial() 함수에 관한 오류이다.
vm_alloc_page_with_initial() 은 페이지가 로드 될때 .. 스택을 늘려줘야할때 등등
가상메모리에 페이지를 할당해주고 첫번째 페이지폴트가 났을때 페이지가 어떤 방향으로 초기화 될지(nuinit_new) 초기화 해주는 함수이다.


비슷해 보이는 코드이지만 page 구조체의 writable 초기화 위치가 다르다
왼쪽 코드는 uninit_new 를 호출하고 나서 writable을 초기화 해주고
오른쪽으 코드는 uninit_new 호출전에 writable을 초기화해준다
간단한 확인을위해 프린트문 찍어주고



출력결과를 보면 출력 결과가 다른걸 볼 수있다.
왼쪽의 코드는 자세히보면 page writable..... ! 오타네.... 무튼 writable의 결과가 모두 false로 출력 되는걸 알 수있다.
uninit_new 함수에서 무슨일이 일어나는지 봐야한다

uninit_new 함수에서 할당받은 페이지를 새로 초기화 시켜주 기때문에 uninit_new 전에 page의 writable을 초기화 해줘도 의미가 없던것..
지금보면 단순해 보이지만 당시에는 오랜동안 머릿속에 물음표를 띄운 문제였다.
배운점은..
프로젝트 초반에 투입될때는 함수들을 꼼꼼하게 확인...
그렇다면 왜 writable이 false로 들어올 때도 있고 true 들어올 때도 있을까?
vm_alloc_page_with_initial()는 현재 프로그램을 exec 하는 과정중.. load함수에서 호출되고 있는 함수인데
load시에 코드영역과 데이터영역을 할당해주는데 코드영역은 read only로 들어오고 데이터영역은 read only로 들어올 수도 있지만 writable하게 들어올 수 도 있기 때문
무튼 그렇다..
'sw정글 > C' 카테고리의 다른 글
| [PINTOS] victim frame (0) | 2024.05.28 |
|---|---|
| [PINTOS] syn_read 와... 인터럽트 검증 관련 오류 (0) | 2024.05.14 |
| [PINTOS] priority conditon variable test (0) | 2024.05.03 |
| [PINTOS] 타이머 인터럽트의 주체는 (0) | 2024.04.29 |
| [Malloc] Implict (0) | 2024.04.18 |