Skip to content
Snippets Groups Projects
Commit 12f5f1d5 authored by Thierno souleymane Bah's avatar Thierno souleymane Bah
Browse files

fix(mi_kernel.c file updated, swap disk functions deleted)

parent 26c378c6
No related branches found
No related tags found
No related merge requests found
File deleted
......@@ -15,7 +15,7 @@ pingpong : try.o pingpong.o
pingpongpang : try.o pingpongpang.o
gcc -o $@ $^ $(LIB)
mi_kernel : swap.o mi_user.o mi_kernel.o
mi_kernel : mi_user.o mi_kernel.o
gcc -o $@ $^ $(LIB)
%.o:%.c
......
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "hardware.h"
#include "mi_kernel.h"
#include "mi_user.h"
#include "MMUConfig.h"
#include "mi_syscall.h"
#include "swap.h"
int VM_MAPPING[VM_SIZE];
int PM_MAPPING[PM_SIZE];
int current_process = 0;
int first_pm_free = 0;
void mmu_handler()
{
......@@ -37,73 +32,6 @@ void mmu_handler()
//_out(TLB_ADD_ENTRY, *(int *)(&tlb));
}
int simple_swap_mmu_handler()
{
tlb_entry_t tlb;
int ppage = 1;
long int vaddr = ((long int)_in(MMU_FAULT_ADDR_HI) << 32) | (_in(MMU_FAULT_ADDR_LO) & 0xFFFFFFFF);
long int vpage = (vaddr >> 12) & 0xFFF;
if (vaddr < ((long int)virtual_memory) || vaddr > ((long int)virtual_memory) + VM_SIZE)
{
fprintf(stderr, "Adresse virtuelle incorrecte");
exit(EXIT_FAILURE);
}
// Sauvegarder la vpage dans le fichier swap
store_to_swap(vpage, ppage);
// Vider la MMU
_out(MMU_CMD, MMU_RESET);
// Rajouter l'entree dans la tlb
tlb.s.tlb_vpage = vpage;
tlb.s.tlb_ppage = ppage;
tlb.s.tlb_rwx = 7;
tlb.s.tlb_used = 1;
_out(TLB_ADD_ENTRY, tlb.i);
}
int swap_mmu_handler()
{
tlb_entry_t tlb;
long int vaddr = ((long int)_in(MMU_FAULT_ADDR_HI) << 32) | (_in(MMU_FAULT_ADDR_LO) & 0xFFFFFFFF);
long int vpage = (vaddr >> 12) & 0xFFF;
if (vaddr < ((long int)virtual_memory) || vaddr > ((long int)virtual_memory) + VM_SIZE)
{
fprintf(stderr, "Adresse virtuelle incorrecte");
exit(EXIT_FAILURE);
}
// Liaison de la vpage à la ppage
if (VM_MAPPING[vpage] == NULL)
VM_MAPPING[vpage] = (first_pm_free % PM_SIZE) + 1;
int ppage = VM_MAPPING[vpage];
int old_vpage = PM_MAPPING[ppage];
if (old_vpage == NULL)
{
PM_MAPPING[ppage] = vpage;
first_pm_free++;
}
else if (old_vpage != vpage)
{
store_to_swap(old_vpage, ppage);
fetch_from_swap(vpage, ppage);
}
// Rajouter l'entree dans la tlb
tlb.s.tlb_vpage = vpage;
tlb.s.tlb_ppage = ppage;
tlb.s.tlb_rwx = 7;
tlb.s.tlb_used = 1;
_out(TLB_ADD_ENTRY, tlb.i);
}
void switch_to_process0(void)
{
current_process = 0;
......
/* functions return non null value on error */
#include <stdio.h>
#include <stdint.h>
#include "hardware.h"
#include "hw_config.h"
#include "swap.h"
static FILE *swap_file = NULL;
static int
init_swap(void)
{
swap_file = fopen(".swap_file", "w+"); /* w+: create, read, write*/
return swap_file == NULL;
}
int store_to_swap(int vpage, int ppage)
{
if (swap_file == NULL)
if (init_swap())
return -2;
if (fseek(swap_file, vpage << 12, SEEK_SET) == -1)
return -1;
if (fwrite((void *)((ppage << 12) | (uintptr_t)physical_memory),
1, PAGE_SIZE, swap_file) == 0)
return -1;
return 0;
}
int fetch_from_swap(int vpage, int ppage)
{
if (swap_file == NULL)
if (init_swap())
return -2;
if (fseek(swap_file, vpage << 12, SEEK_SET) == -1)
return -1;
if (fread((void *)((ppage << 12) | (uintptr_t)physical_memory),
1, PAGE_SIZE, swap_file) == 0)
return -1;
return 0;
}
#if !defined(SWAP)
#define SWAP
#define PAGE_SIZE 4000
int store_to_swap(int vpage, int ppage);
int fetch_from_swap(int vpage, int ppage);
#endif // SWAP
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment