/** * Stores the data given by the virtual address, using the virutal -> physical * translation system of the CPU. * * @param va The virtual address to write. * @param data The data to write to the address. */ void mem_store(vaddr_t va, word_t data) { vpn_t vpn; pfn_t pfn, offset; vpn = VADDR_PAGENUM(va); pfn = tlb_lookup(vpn, 1); offset = VADDR_OFFSET(va); printf("STORE %5.5u <- %3.3u (VPN %5.5u PFN %5.5u OFFSET %5.5u)\n", va, data, vpn, pfn, offset); count_writes++; memory[pfn * page_size + offset] = data; }
/** * Stores the data given by the virtual address, using the virutal -> physical * translation system of the CPU. * * @param va The virtual address to write. * @param data The data to write to the address. */ void mem_store(vaddr_t va, word_t data) { vpn_t vpn; pfn_t pfn, offset; vpn = VADDR_PAGENUM(va); pfn = tlb_lookup(vpn, 1); offset = VADDR_OFFSET(va); printf("STORING %3.3u as data in virtual address %5.5u.\nVirtual Address information: (VPN: %5.5u PFN: %5.5u OFFSET: %5.5u)\n", data, va, vpn, pfn, offset); count_writes++; memory[pfn * page_size + offset] = data; }
/******************************************************************************* * Loads the data given by the virtual address, using the virutal -> physical * translation system of the CPU. * * @param va The virtual address to read. * @return The data at the given address. */ word_t mem_load(vaddr_t va) { vpn_t vpn; pfn_t pfn, offset; word_t data; vpn = VADDR_PAGENUM(va); pfn = tlb_lookup(vpn, 0); offset = VADDR_OFFSET(va); data = memory[pfn * page_size + offset]; printf("LOADING %3.3hu as data from virtual address %5.5hu.\nVirtual Address Information: (VPN: %5.5hu PFN: %5.5hu OFFSET: %5.5hu)\n", data, va, vpn, pfn, offset); count_reads++; return data; }
/******************************************************************************* * Loads the data given by the virtual address, using the virutal -> physical * translation system of the CPU. * * @param va The virtual address to read. * @return The data at the given address. */ word_t mem_load(vaddr_t va) { vpn_t vpn; pfn_t pfn, offset; word_t data; vpn = VADDR_PAGENUM(va); pfn = tlb_lookup(vpn, 0); offset = VADDR_OFFSET(va); data = memory[pfn * page_size + offset]; printf("LOAD %5.5hu -> %3.3u (VPN %5.5hu PFN %5.5hu OFFSET %5.5hu)\n", va, (unsigned int)data, vpn, pfn, offset); count_reads++; return data; }
int16_t whatsUpWithTheFrame(struct virtual_memory_manager *vmm, uint16_t pageNum) { int16_t frameNum = -1; frameNum = tlb_lookup (&vmm->tlb, pageNum); if (frameNum == -1) { //tlb lookup failed printf ("Page not in TLB. Bummer.\n"); vmm->tlb_miss_count++; if (vmm->page_table[pageNum].flags & 0x1) //if verification bit, aka if page is loaded { vmm->page_found_count++; frameNum = vmm->page_table[pageNum].frame_number; tlb_add_entry (&vmm->tlb, pageNum, frameNum); } else { /* page fault 1. find free frame 2. read page from backing store 3. place read page in frame 4. set page verification flag */ printf ("This page seems to be all hidey and not loaded. Let's take care of that...\n"); frameNum = pm_demand_page (&vmm->pm, pageNum); // pm_backup_frame(&vmm->pm,frameNum,pageNum); vmm->page_table[pageNum].frame_number = frameNum; vmm->page_table[pageNum].flags |= 0x1; //page is loaded. set verification bit vmm->page_fault_count++; } } else { vmm->tlb_hit_count++; vmm->page_found_count++; } return frameNum; }
vmm_read (struct virtual_memory_manager *vmm, uint16_t laddress) { // Vous devez fournir les arguments manquants. Basez-vous sur la signature de // la fonction. uint16_t page = laddress>>8; uint16_t offset=laddress&0xFF; int32_t frame; uint16_t paddress=0; char value='0'; // chercher dans le tlb frame=tlb_lookup(&vmm->tlb,page); if(frame == -1){ vmm->tlb_miss_count++; //chercher dans la table du page frame = vmm->page_table[page].frame_number; if(frame==-1){ vmm->page_fault_count++; frame=pm_demand_page(&vmm->pm,page,vmm->page_table ); if (frame==-1) { vmm->page_fault_count++; } else {