[dirty:segfault] stage 1

This commit is contained in:
2025-03-06 21:50:29 +02:00
commit b4edf54aa6
12 changed files with 266 additions and 0 deletions

52
src/kernel.c Normal file
View File

@@ -0,0 +1,52 @@
#include <stddef.h>
#include <stdlib.h>
#include "kernel.h"
#include "process.h"
struct RunQ *
RunQ(size_t max_procs)
{
struct RunQ *runq = malloc(sizeof(struct RunQ));
runq->current_proc = NULL;
runq->max_procs = max_procs;
runq->proc_amount = 0;
runq->next_proc_id = 1;
return runq;
}
void
RUNQ_add_process(size_t max_page_accesses,
size_t total_pages_owned)
{
if (runq->proc_amount >= runq->max_procs)
return;
struct Process *new_p = Process(runq->next_proc_id, max_page_accesses, total_pages_owned);
if (!runq->current_proc) {
runq->current_proc = new_p;
new_p->next = new_p;
new_p->prev = new_p;
} else {
new_p->next = runq->current_proc;
new_p->prev = runq->current_proc->prev;
new_p->next->prev = new_p;
new_p->prev->next = new_p;
runq->current_proc = new_p;
}
runq->proc_amount++;
runq->next_proc_id++;
}
void
KERNEL_page_fault(struct PageTableEntry *pt, size_t page_no)
{
if (first_free_page) {
pt[page_no].ppn = first_free_page->ppn;
pt[page_no].p = 1;
}
}

44
src/main.c Normal file
View File

@@ -0,0 +1,44 @@
#include <stdio.h>
#include <process.h>
#include <stdlib.h>
#include "kernel.h"
#include "config.h"
int
main(void)
{
first_busy_page = NULL;
struct PhysPage *first_free_page = malloc(sizeof(struct PhysPage));
first_free_page->ppn = 0;
first_free_page->busy_flag = 0;
first_free_page->prev = first_free_page;
first_free_page->next = first_free_page;
for (int i = 1; i <= PHYSICAL_PAGE_AMOUNT; i++) {
struct PhysPage *pp = malloc(sizeof(struct PhysPage));
pp->ppn = i;
pp->busy_flag = 0;
/*
* insert into here
* |
* v
* [ ] [ ] [ ]
* ^
* |
* *first_free_page
*/
pp->prev = first_free_page->prev;
pp->next = first_free_page;
pp->next->prev = pp;
pp->prev->next = pp;
}
runq = RunQ(10);
RUNQ_add_process(10000, 50);
RUNQ_add_process(10000, 50);
RUNQ_add_process(10000, 50);
}

18
src/mmu.c Normal file
View File

@@ -0,0 +1,18 @@
#include "kernel.h"
void MMU_read(struct PageTableEntry *pt, size_t page_no)
{
if (!pt[page_no].p)
KERNEL_page_fault(pt, page_no);
pt[page_no].r = 1;
}
void MMU_write(struct PageTableEntry *pt, size_t page_no)
{
if (!pt[page_no].p)
KERNEL_page_fault(pt, page_no);
pt[page_no].r = 1;
pt[page_no].m = 1;
}

43
src/process.c Normal file
View File

@@ -0,0 +1,43 @@
#include <stdlib.h>
#include <stdio.h>
#include "process.h"
#include "mmu.h"
#include "random.h"
struct Process *
Process(size_t proc_id, size_t max_accesses, size_t total_pages_owned)
{
struct Process *p = malloc(sizeof(struct Process));
p->id = proc_id;
p->max_accesses = max_accesses;
p->pages_accessed = 0;
p->total_pages_owned = total_pages_owned;
p->pt = malloc(sizeof(struct PageTableEntry) * total_pages_owned);
for (size_t i = 0; i < p->total_pages_owned; i++)
p->pt[i].p = 0;
return p;
}
size_t PROCESS_run_for(struct Process *p, size_t time_bits)
{
for (size_t i = 0;
(i < time_bits) && (p->pages_accessed < p->max_accesses);
i++, p->pages_accessed++)
{
// no working set yet
int accessed_page_no = randint(p->total_pages_owned);
if (randint(10) > 7) {
printf("[process] Writing to page #%d\n", accessed_page_no);
MMU_write(p->pt, accessed_page_no);
} else {
printf("[process] Reading from page #%d\n", accessed_page_no);
MMU_read(p->pt, accessed_page_no);
}
}
return p->pages_accessed >= p->max_accesses;
}

14
src/random.c Normal file
View File

@@ -0,0 +1,14 @@
#include <fcntl.h>
#include <stddef.h>
#include <unistd.h>
size_t randint(size_t max)
{
size_t random_value;
int f = open("/dev/urandom", O_RDONLY);
read(f, &random_value, 8);
close(f);
return random_value % max;
}