コード例 #1
0
/**
 * 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;
}
コード例 #2
0
ファイル: memory.c プロジェクト: Edward-Wei/CS2200-HW
/**
 * 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;
}
コード例 #3
0
ファイル: memory.c プロジェクト: Edward-Wei/CS2200-HW
/*******************************************************************************
 * 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;
}
コード例 #4
0
/*******************************************************************************
 * 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;
}
コード例 #5
0
ファイル: vmm.c プロジェクト: poifra/dernier_2245
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;
}
コード例 #6
0
ファイル: vmm.c プロジェクト: dejla-ben/tp3
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 {