(TIL)swap마저 진행하기

낚시하는 곰·2025년 6월 11일

jungle TIL

목록 보기
15/20

vm_anon_init 수정

flow

→ disk를 초기화 한다.

→ disk의 정보를 가져와서

→ disk size를 계산한다.

→ swap table을 생성한다.

구현

// assertion `intr_handlers[vec_no] == NULL' failed.
/* 익명 페이지를 위한 데이터를 초기화합니다 */
void vm_anon_init(void)
{
    // TODO: swap 구현 시 아래 내용을 추가해야 함. 사유는 그때 가서 이해하기.
    /* swap_disk를 설정하세요. */
    swap_disk = disk_get(1, 1); // NOTE: disk_get 인자값 적절성 검토 완료.
    if(swap_disk == NULL){
        PANIC("[vm_anon_init] swap dist를 가져오는 데 실패함\n");
    }
    size_t sector_count = disk_size(swap_disk); // SECTORS_PER_PAGE;
    size_t slot_count = sector_count / 8;
    swap_table = bitmap_create(slot_count); // disk size만큼 slot을 생성한다. slot은 bitmap으로 관리하며 slot의 사용여부는 0과 1로 판단한다.
}

static bool anon_swap_in (struct page page, void kva);

구상

  • read(slot idx)
    • swap disk → anon page로 데이터를 읽어와야 한다.
  • bitmap reset(slot idx)
    • slot을 다시 사용할 수 있게 데이터를 reset한다.
  • slot idx 초기화
  • anon page initializer()
  • swap in()이 성공했으면 return true

구현

/* 스왑 디스크에서 내용을 읽어 페이지를 스왑인합니다 */
static bool
anon_swap_in(struct page *page, void *kva)
{
    // 스왑 디스크 데이터 내용을 읽어서 익명 페이지를(디스크에서 메모리로)  swap in합니다. 
    // 스왑 아웃 될 때 페이지 구조체는 스왑 디스크에 저장되어 있어야 합니다. 
    // 스왑 테이블을 업데이트해야 합니다(스왑 테이블 관리 참조).
    struct anon_page *anon_page = &page->anon;
    for(int i=0; i<8; i++){
        disk_read(swap_disk, anon_page->swap_slot_idx * DISK_SECTOR_COUNT + i, kva + DISK_SECTOR_SIZE * i);
    }
    bitmap_reset(swap_table, anon_page->swap_slot_idx);
    // lock??
    anon_page->swap_slot_idx = BITMAP_ERROR; // 스왑 슬롯을 NULL로 초기화 해준거나 같음.

    return true;
}

static bool anon_swap_out (struct page *page);

구상

  • bitmap_scan_and_flip()를 사용해서 slot bit가 0인 slot을 찾는다.
  • memcpy(anon, swap slot)인줄 알았지만 swap disk에 메모리를 복사하는 게 아니다… disk write()를 이용해서 anon page의 데이터를 swap disk의 slot공간에다가 write()해줘야 한다…
  • swap slot idx를 anon page struct에 멤버 변수로 만들어주고,
  • swap slot idx를 초기화 해준다.
  • swap out()이 성공했다면 return true

구현하면서 알게 됐던 점

  • 1page = 1slot이고, 1slot = 8sector이고, 1sector = 512byte이다.
  • swap disk에 메모리를 복사하는 게 아니다… disk write()를 이용해서 anon page의 데이터를 swap disk의 slot공간에다가 write()해줘야 한다… → swap disk의 swap slot에 anon page의 데이터를 저장해야 한다. → disk write()로 swap disk에 write()할 수 있는 최대 size는 512byte이다. 따라서 1page 데이터를 옮기려면 512 * 8(=4096)을 disk write()해줘야 함. → page→frame→kva의 주소가 slot의 top이라고 생각하면 1번 loop을 돌 때마다 +512byte를 해줘야 함.
    • → disk는 연속된 sector로 이루어져 있고, 원하는 sector에 write()하려면 slot idx에다 sector count를 곱해줘야 함. 그냥 slot idx를 사용할 경우 원하는 sector idx가 아닌 엉뚱한 sector에 값을 덮어쓸 수 있음

구현

/* 스왑 디스크에 내용을 써서 페이지를 스왑아웃합니다 */
static bool
anon_swap_out(struct page *page)
{
    // TODO: 메모리에서 디스크로 내용을 복사하여 익명 페이지를 스왑 디스크로 교체합니다. 

    // 먼저 스왑 테이블을 사용하여 디스크에서 사용 가능한 스왑 슬롯을 찾은 다음 데이터 페이지를 슬롯에 복사합니다. 
    // 데이터의 위치는 페이지 구조체에 저장되어야 합니다. 디스크에 사용 가능한 슬롯이 더 이상 없으면 커널 패닉이 발생할 수 있습니다.
    struct anon_page *anon_page = &page->anon;
    size_t swap_slot_idx = bitmap_scan_and_flip(swap_table, 0, 1, false);
    if(swap_slot_idx == BITMAP_ERROR){
        PANIC("[anon_swap_out] 비어있는 swap slot을 찾는데 실패했습니다\n");
    }
    
    for(int i=0; i<8; i++){
        disk_write(swap_disk, swap_slot_idx * DISK_SECTOR_COUNT + i, page->frame->kva + DISK_SECTOR_SIZE * i);
    }

    anon_page->swap_slot_idx = swap_slot_idx;

    return true;
}

debug

try 1

Kernel PANIC at ../../threads/interrupt.c:213 in register_handler(): assertion `intr_handlers[vec_no] == NULL' failed.
// assertion `intr_handlers[vec_no] == NULL' failed.
/* 익명 페이지를 위한 데이터를 초기화합니다 */
void vm_anon_init(void)
{
    // TODO: swap 구현 시 아래 내용을 추가해야 함. 사유는 그때 가서 이해하기.
    /* swap_disk를 설정하세요. */
    // disk_init();
    swap_disk = disk_get(1, 1); // NOTE: disk_get 인자값 적절성 검토 완료.
    if(swap_disk == NULL){
        PANIC("[vm_anon_init] swap dist를 가져오는 데 실패함\n");
    }
    size_t sector_count = disk_size(swap_disk); // SECTORS_PER_PAGE;
    size_t slot_count = sector_count / 8;
    swap_table = bitmap_create(slot_count); // disk size만큼 slot을 생성한다. slot은 bitmap으로 관리하며 slot의 사용여부는 0과 1로 판단한다.
}

vm anon init()에서 disk init()를 호출해서 문제가 발생한 거였음. disk init()은 시스템이 부팅될 때 호출이 되기 때문에 중복 호출이 발생함.

profile
취업 준비생 낚곰입니다!! 반갑습니다!!

0개의 댓글