→ 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)
{
// 스왑 디스크 데이터 내용을 읽어서 익명 페이지를(디스크에서 메모리로) 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);
/* 스왑 디스크에 내용을 써서 페이지를 스왑아웃합니다 */
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;
}
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()은 시스템이 부팅될 때 호출이 되기 때문에 중복 호출이 발생함.