diff --git a/Makefile b/Makefile index 2eaa940..b094506 100644 --- a/Makefile +++ b/Makefile @@ -4,10 +4,10 @@ CCFLAGS = -g -O0 -Iinc/ -I. main: main.o kernel.o mmu.o process.o random.o gcc $(CCFLAGS) -o main main.o kernel.o mmu.o process.o random.o -main.o: src/main.c +main.o: src/main.c config.h gcc $(CCFLAGS) -c -o main.o src/main.c -kernel.o: src/kernel.c +kernel.o: src/kernel.c config.h gcc $(CCFLAGS) -c -o kernel.o src/kernel.c mmu.o: src/mmu.c diff --git a/config.h b/config.h index 3bd10e0..e201281 100644 --- a/config.h +++ b/config.h @@ -1 +1,2 @@ -#define PHYSICAL_PAGE_AMOUNT 128 +#define PHYSICAL_PAGE_AMOUNT 64 +#define PAGE_REPLACEMENT_ALGORITHM 1 diff --git a/src/kernel.c b/src/kernel.c index f4e99ce..be61a45 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -5,6 +5,7 @@ #include "kernel.h" #include "process.h" +#include "config.h" extern struct RunQ *runq; @@ -87,5 +88,29 @@ KERNEL_page_fault(struct PageTableEntry *pt, size_t page_no) this_page->prev->next = this_page; this_page->next->prev = this_page; } + } else { + printf("[kernel:page_fault] No free pages available, trying to swap...\n"); + + #if PAGE_REPLACEMENT_ALGORITHM == 1 + printf("[kernel:page_fault:random] Selected physical page #%d for replacement\n", first_busy_page->ppn); + + // clear presence 'bit' from old PTE + first_busy_page->pt[first_busy_page->pt_index].p = 0; + + // update physical page data + first_busy_page->pt = pt; + first_busy_page->pt_index = page_no; + + // update PTE data + pt[page_no].p = 1; + pt[page_no].ppn = first_busy_page->ppn; + + // move hand to next physical page + first_busy_page = first_busy_page->next; + + printf("[kernel:page_fault:random] Auto-advanced the list of busy pages to ppn %d\n", first_busy_page->ppn); + #elif PAGE_REPLACEMENT_ALGORITHM == 2 + printf("[kernel:page_fault:wsclock] Not implemented\n"); + #endif } }