[준비]
supplemental_page_table_init()
│
└─ hash_init() 에게 규칙 전달
├─ 규칙1: page_hash (va로 해시값 계산)
└─ 규칙2: page_less (va로 페이지 비교)
----------------------------------------------------
[실행]
spt_find_page(spt, 0x12345000)
│
├─ 1. 임시 page 생성 { .va = 0x12345000 }
│
├─ 2. hash_find(spt, 임시 page) 호출
│ │
│ ├─ 3. (내부) page_hash(임시 page) 호출 -> 해시값 'K' 계산
│ │
│ ├─ 4. (내부) 해시 테이블의 'K'번째 버킷으로 이동
│ │
│ └─ 5. (내부) page_less()로 버킷 내 페이지들과 va 비교
│
└─ 6. va가 일치하는 실제 page 발견 후 반환
<aside>
준비 단계 (초기화)
</aside>
프로세스가 처음 시작될 때, 해당 프로세스의 보조 페이지 테이블(SPT)을 사용할 수 있도록 초기 설정을 진행
supplemental_page_table_init()
함수가 호출hash_init()
를 호출하여 SPT가 사용할 해시 테이블을 생성 & 초기화page_hash
(주소 계산 규칙)
va
)를 사용해 숫자 값(해시 값)을 만들어, 저장될 위치(버킷)를 결정page_less
(비교 규칙)
va
)가 같은지를 비교하여 동일한 페이지인지 판단
<aside>
실행 단계 (페이지 찾기)
</aside>
이제 특정 가상 주소에 접근할 때, 해당 주소에 대한 정보가 SPT에 있는지 확인 (예 : 페이지 폴트가 발생했을 때)
spt_find_page(spt, target_va)
함수가 호출됩니다. target_va
는 우리가 찾으려는 가상 주소page
구조체를 하나 만듦va
멤버에 target_va
값을 설정hash_find(spt, &임시_page->hash_elem)
를 호출하여 해시 테이블 검색을 시작hash_find
는 준비 단계에서 등록한 규칙들을 사용
page_hash
규칙을 임시 페이지에 적용하여 target_va
에 해당하는 해시 값을 계산하고, 해당 버킷으로 즉시 이동page_less
규칙으로 하나씩 비교하며 va
가 정확히 일치하는 항목을 찾음va
가 일치하는 실제 page를 찾으면, hash_entry
매크로를 통해 hash_elem
으로부터 struct page
전체의 주소를 얻어내어 반환
NULL
을 반환