에러
- Anonymous, Stack growth를 통과했는데, page-linear를 돌리면 에러가 났다.
0x00000080042095f3: intr_handler (threads/interrupt.c:352)
0x0000008004209a11: intr_entry (threads/intr-stubs.o:?)
0x000000800421ad55: hash_clear (lib/kernel/hash.c:58)
0x0000008004221cb9: supplemental_page_table_kill (vm/vm.c:332)
0x000000800421c70c: process_cleanup (userprog/process.c:378)
0x000000800421c6a8: process_exit (userprog/process.c:362)
0x00000080042072bd: thread_exit (threads/thread.c:313)
0x000000800421daa2: fork (userprog/syscall.c:155)
0x000000800421d7b2: syscall_handler (userprog/syscall.c:68)
0x000000800421d663: no_sti (userprog/syscall-entry.o:?)
0x0000000000401020: (unknown)
- supplemental_page_table_kill 의 내용을 없애면 에러가 나지 않았다.
- 한편, supplemental_page_table_kill 안에 있던 hash_clear 내에서도 hash를 480번때까지 잘 지우다가 중간에 터지는 문제가 있었다.
- 좀 더 들어가보니 hash_clear의 콜백함수로 넘겨준 hash_page_destroy의 p->frame->page=NULL 이 문제였다.
void
supplemental_page_table_kill (struct supplemental_page_table *spt) {
hash_clear(&spt->pages,hash_page_destroy);
}
void hash_page_destroy(struct hash_elem *e, void *aux){
const struct page *p = hash_entry (e, struct page, hash_elem);
p->frame->page=NULL; //요기가 문제
vm_dealloc_page(p);
}
- 처음엔 supplemental_page_table_copy에서 copy를 제대로 해오지 않는 줄 알았는데, 그것도 아니였다.
- 다시 생각해보니 page를 지우는 도중 frame이 배정되지 않은, 즉 lazy_loading중인 page에서 frame이 NULL이라서 에러가 생기는 것이었다.
- 아래와 같이 frame NULL체크를 해주면 해결된다.
void hash_page_destroy(struct hash_elem *e, void *aux){
const struct page *p = hash_entry (e, struct page, hash_elem);
if(p->frame){
p->frame->page=NULL;
}
vm_dealloc_page(p);
//swap, filebacked 처리
}
- 그렇지만 사실 이것도 하지 않아도 되는데, 아래 있는 vm_dealloc_page(p) 에서 free(p)를 해주기 때문에, frame->page 가 가리키고 있는 부분이 자연스럽게 NULL이 될 것이기 때문이다
void hash_page_destroy(struct hash_elem *e, void *aux){
const struct page *p = hash_entry (e, struct page, hash_elem);
vm_dealloc_page(p);
//swap, filebacked 처리
}
void
vm_dealloc_page (struct page *page) {
destroy (page);
free (page);
}