[WIL] Pintos Project 3-2

jw3215·2022년 12월 13일
0

Virtual Memory

  • 프로세스가 메모리 전체를 차지하고 있다는 착각을 만들어줌.
  • 서로 다른 프로세스에서 같은 가상주소를 사용할 수 있다. (page table mapping)
    • cr3 레지스터에 pml4 주소 기억
    • mmu는 cr3 레지스터에 기록된 pml4를 참조하여 가상주소를 물리주소로 변환함
    • 가상주소 - 물리주소 mapping을 pml4_set_page()를 통해 pml4(page table)에 추가
  • swap영역을 추가하여 실제 물리메모리보다 더 큰 메모리를 사용할 수 있다.
    • 현재 프로세스가 필요한 영역은 swap in, 필요없는 영역은 swap out(eviction policy에 따름)

Supplemental page table

  • Lazy Loading 구현을 위해 필요함.
  • vm_alloc_page()로 페이지(유저영역)를 할당할 때, 실제로 4kB를 할당하는 것이 아니라, supplemental page table에 페이지 객체를 추가한다.
  • pml4(page table)에 없고, 실제로 할당된 주소가 아니므로, 해당 주소에 접근하게되면 page fault가 발생하게 된다.
  • page fault exception이 발생하면 vm_try_handle_page_fault()함수를 통해, 페이지 폴트를 핸들링한다.
  • supplemetal page table()에 fault address(유저영역)을 나타내는 페이지 객체가 존재한다면, vm_do_claim_page()를 호출하여 실제로 페이지를 할당해준다.
  • 만약 존재하지 않는다면 진짜로 page fault가 발생한 것이므로, 에러 메세지와 함께 프로세스를 종료한다.

Iterator

  • Pintos의 hash table 자료구조는 iterator 를 제공한다.
  • supplemental table이 hash table로 구현되어 있다면, supplemental page table copy를 구현할때 유용하게 사용됨.
  • 디버깅 중에 supplemental page table을 확인해야 할때도 사용했음.
  • hash_next()를 호출하며 다음요소 순회.
  • iteration idiom
   struct hash_iterator i;

   hash_first (&i, h);
   while (hash_next (&i)) {
       struct foo *f = hash_entry (hash_cur (&i), struct foo, elem);
   	   ...do something with f...
   }
  • hash_first()로 iterator를 초기화한다.
  • hash_next()를 호출하며, hash_next()의 리턴값이 null이 될때까지 반복문 수행
    다른 high level 언어에서도 iterable을 통해 collection을 순회하는 것을 추상화를 했는데, python의 for 문을 예로 들자면,
for x in arr1:
	print(x)

for x in string1:
	print(x)

iterable object는 iterator를 가지고 있는 객체다. 순회할 대상이 iterable이기만 하면, string, list, dictionary 등 어떤 타입이더라도 같은 문법으로 순회할 수 있다. 위의 python 예시에서는 iterable object(arr1, string1)가 __iter__() 메서드를 구현했기 때문에(iterator를 가지고 있기 때문에) 가능한 것이다.

arr1 = [1,2,3,4,5]  # <- iterable object
iter1 = iter(arr1)  # <- iterator

python에서 iterable의 iterator는 iter()함수를 통해 얻을 수 있다.

마치며...

frame table을 구현할 때 자료구조로 처음에 List를 골랐다. 그런데 예상치 못한 버그가 발생했다. 디버깅에 너무 오랜시간이 걸렸고, 결국 Array로 자료구조를 바꿨다. 이후 커널 패닉이 없어지기는 했다만, List 구조를 사용하면서 버그를 잡은 것이 아니라 아쉽다. 팀 회의 때 malloc 대신 calloc을 써보는게 어떻냐는 제안을 받았는데, 나중에 시간이 난다면 테스트해봐야겠다.

0개의 댓글