Beruflich Dokumente
Kultur Dokumente
#include
#include
#include
#include
#include
<types.h>
<kern/errno.h>
<lib.h>
<thread.h>
<addrspace.h>
<vm.h>
struct frame_table_entry {
int free;
int locked;
};
/*
top_of_ram
_______________________
frametable
_______________________
int free_head
_______________________
int free_queue[nframes]
_______________________
*/
/* Place your frametable data-structures here
* You probably also want to write a frametable initialisation
* function and call it from vm_bootstrap
*/
static struct spinlock stealmem_lock = SPINLOCK_INITIALIZER;
static struct spinlock frametable_lock = SPINLOCK_INITIALIZER;
static int nframes;
int *queue = 0;
struct frame_table_entry *frametable = 0;
int *free_frame_head;
}
//we will never fill the free queue as frame table will be taking up frames
//thus we have the queue head stored in the lowest queue location
//queue is fifo, and grows downwards from the bottom of the frametable
//frametable
//_________________
//queue
//|
//| grows downwards
//V
queue[0] = tablepages+free_base;
return;
}
i = queue[queue[0]];
//increment head
queue[0]++;
//convert index to paddr
addr = i*PAGE_SIZE;
//convert into kaddr
addr = PADDR_TO_KVADDR(addr);
//verify frame is valid
if( addr > (paddr_t)&frametable[(nframes - 1)] ){
panic( "Out of ram/Invalid addr obtained" );
}
//assign page as occupied
frametable[i].free = 0;
//zero out frame
int *blockhead = (int *)addr;
int noints = PAGE_SIZE/sizeof(int);
for( i=0; i<noints; i++ ){
blockhead[i] = 0;
}
//release lock
spinlock_release(&frametable_lock);
//return kernel address
return addr;
}
}
// free previously allocated pages
void free_kpages(vaddr_t addr)
{
(void) addr;
if( frametable == 0 ){
(void) addr;
}
else{
//get frametable spinlock
spinlock_acquire(&frametable_lock);
//get table index from address
int i = KVADDR_TO_PADDR( addr ) / PAGE_SIZE;
if( frametable[i].locked != 1 ){
//mark frame as free on table
frametable[i].free = 1;
queue[0]--;
queue[queue[0]] = i;
}
else{
panic(" tried to free reserved frame");
}
//release frametable spinlock
spinlock_release(&frametable_lock);
}
}