[05.30/week12]TIL

CHO WanGi·2025년 5월 30일

KRAFTON JUNGLE 8th

목록 보기
62/89

오늘 하루 요약

✏️ 오늘의 한 일

  • PintOS VM Gitbook Introduction 재정리 & Memory Management
  • Supplemental Page Table 초기화(미완료)

🌈오늘의 성장!

PintOS VM Gitbook Introduction 재정리 & Memory Management

AS IS

현재 PintOS 에는 가상 주소와 물리주소 매핑하는 (하드웨어) 페이지 테이블(pml4) 이 존재

pml4는 현재 물리메모리에 올라온 것만 관리 가능

TO BE

이 하드웨어 페이지 테이블인 (pml4)를 보조하기 위한 추가적인 페이지 테이블이 필요

메모리에 올라오려고 하는 예정된 것들 등등을 담는 SPT

구현 위치 : vm/vm.c

  1. void supplemental_page_table_init (struct supplemental_page_table *spt);

    1. 역할 : 전달 받은 보조 테이블 spt를 초기화
    2. 자료구조 설정 ⇒ 해시, 배열, 비트맵…
    3. 호출 시점
      1. 새로운 프로세스 시작시 (userprog/process.cinitd 함수 내부) ⇒ifdef 로 구현
      2. 프로세스가 복제(fork) 될 경우 ( userprog/process.c__do_fork 함수 내부) ⇒ ifdef 로 구현
  2. struct page *spt_find_page (struct supplemental_page_table *spt, void *va);

    1. 역할 : 주어진 보조 테이블(spt)에서 특정 가상 주소(VA) 에 해당하는 struct page 정보 탐색
    2. Return value
      1. 성공시 해당 struct page 의 포인터를 반환
      2. 실패시 NULL 을 반환( 해당 VA를 찾을 수 없음)
  3. bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);

    1. 역할 : spt에 전달된 struct page 정보를 삽입
    2. 유효성 검사 : 삽입 전 해당 Page의 가상 주소(Page→va) 가 이미 spt 내 존재하는지 반드시 확인
    3. Return Value
      1. 삽입에 성공하면 true
      2. 실패시 false(가상 주소 중복 등)

Supplemental Page Table 초기화(팀원 검증 미완료)

우리 조는 해시함수 자료구조를 사용하기로 했고

  • Page 구조체에 멤버변수 추가
struct page
{
	const struct page_operations *operations;
	void *va;						 /* Address in terms of user space */
	struct frame *frame; /* Back reference for frame */

	/* Hash 자료구조 활용 위한 멤버변수 추가 */
	struct hash_elem hash_elem; /* Hash table element. */
	void *addr;									/* Virtual address. */

	/* Per-type data are binded into the union.
	 * Each function automatically detects the current union */
	union
	{
		struct uninit_page uninit;
		struct anon_page anon;
		struct file_page file;
#ifdef EFILESYS
		struct page_cache page_cache;
#endif
	};
};
  • vm.h 내 supplemental_page_table 구조체 내 해시 테이블 정의
#include "lib/kernel/hash.h" // 해시 함수 자료구조 활용 위한 import

struct supplemental_page_table
{
	struct hash pages;
};
  • vm.c 에서 spt init 함수에 hash_init 삽입

/* Initialize new supplemental page table */
void supplemental_page_table_init(struct supplemental_page_table *spt UNUSED)
{
	// 인자로 받은 spt의 pages 해시 테이블을 초기화
	hash_init(&spt->pages, page_hash, page_less, NULL);
}

위와같이 SPT 정의와 SPT 초기화 함수를 구현했다.

⛏ 오늘의 삽질

해시함수로 구현하는 방법 어떻게 해야하나 고민했는데
APPENDIX에 있더라...

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글