2012-03-23 36 views
0

所以我创建了一个直接映射回写缓存模拟器。在测试我的东西时,我写了地址0x14c的值“99”,它最初是一个值“4C” 然后我读取值0x348,这使得回写函数发生,因为这两个地址低于相同的插槽号码,只是不同的标签。在Java中使用System.arraycopy

基本上,我需要写入从“缓存”对象到main_mem对象的插槽中的所有数据。我使用System.array副本。

我可以看到值99被成功写回主存储器阵列。

但是,当我想再次读取地址14C(它应该拉动它的整个块,包括99)时,它会打印最初的内容,而不是反映我写的这个改变。

是否System.arraycopy不从特定索引处从数组中提取数据?它只是从第一个索引的值中算起来吗?

这里是我的read()和write()方法和输出

 public static void readAddress() { 
      System.out.println("What address? "); 

      address = keyboard.nextInt(16); 
      startAddress = address & 0x758; 
      tag = (address >> 6) & 0x1F; 
      slot = (address >> 3) & 0x7; 

      //Valid bit is 0, empty slot 
      if (cache[slot].getValidBit() == 0) {    

       cache[slot].setValidBit(1); 
       cache[slot].setTag(tag); 
       cache[slot].setStartAddress(startAddress); 

       System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 

       System.out.println("Cache Miss"); 
       System.out.print("The value at that address is: "); 
       System.out.printf("%X", 0xFF & address); 
       System.out.println(); 
       System.out.println(); 
      } 
      //Valid bit 1 but tags don't match 
      else if (cache[slot].getValidBit() == 1 && cache[slot].getTag() != tag) { 
       System.out.println("Cache Miss "); 

       if (cache[slot].getDirty() == 1) { 
        System.out.println("This is a dirty slot!"); 
        //copy contents of slot back into main memory before loading new block 
        System.out.println("Slot is dirty and will be written back, val for 14c is " +cache[slot].dataBlock[4]); 
        System.arraycopy(main_Mem, cache[slot].getStartAddress(), cache[slot].dataBlock, 0, cacheSize); 
        System.out.println("Everything should have been copied to main by now. The value for 332 is " + main_Mem[332]); 
       } 

       startAddress = address & 0x7F8; 
       cache[slot].setTag(tag); 
       cache[slot].setStartAddress(startAddress); 
       //set dirty back to 0, incase it was 1 
       cache[slot].setDirty(0); 

       for (int i = 0; i < cacheSize; i++) { 
        for (int j = cache[slot].getStartAddress(); j<cacheSize; j ++) { 
         cache[slot].dataBlock[i] = main_Mem[j]; 
        } 
       } 
       //System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 
       System.out.print("The value at that address is: "); 
       System.out.printf("%X", 0xFF & address); 
       System.out.println(); 
       System.out.println(); 
      } 
      //Valid bit 1 and tags match, hit 
      else if (cache[slot].getValidBit() == 1 && tag == cache[slot].getTag()) { 
       System.out.println("Cache Hit"); 
       System.out.print("The value at that address is: "); 
       System.out.printf("%X", 0xFF & address); 
       System.out.println(); 
       System.out.println(); 
      } 

      menu(); 
    } 

    public static void writeAddress() { 

     System.out.println("What address do you want to write to? "); 
     address = keyboard.nextInt(16); 
     System.out.println("And what value do you want to write to it? "); 
     int input = keyboard.nextInt(16); 

     startAddress = address & 0x758; 
     tag = (address >> 6) & 0x1F; 
     slot = (address >> 3) & 0x7; 
     //Valid bit 1, tag matches, hit, just modify value 
     if (cache[slot].getValidBit() != 0 && cache[slot].getTag() == tag) { 
      System.out.println("Cache Hit"); 
      System.out.printf("%X", 0xFF & address); 

      for (int i = 0; i <8; i++) { 
       if (cache[slot].dataBlock[i] == (0xFF & address)) { 
        cache[slot].dataBlock[i] = input; 
        cache[slot].setDirty(1); 
       } 
      } 
     } 
     //Valid bit 1, tags don't match-Check dirty bit and write back first if valid 
     else if (cache[slot].getValidBit() == 1 && cache[slot].getTag() != tag) { 

      if (cache[slot].getDirty() ==1) { 
       //copy contents of slot back into main memory before loading new block 
       for (int i = 0; i < cacheSize; i++) { 
        for (int j = startAddress; j<cacheSize; j++) { 
         cache[slot].dataBlock[i] = main_Mem[j]; 
        } 
       } 
       //System.arraycopy(cache[slot].dataBlock, 0, main_Mem, cache[slot].getStartAddress(), cacheSize); 
      } 

      System.out.println("Cache Miss"); 
      cache[slot].setValidBit(1); 
      cache[slot].setTag(tag); 
      cache[slot].setDirty(1); 
      cache[slot].setStartAddress(startAddress); 
      //copy new block into cache now 
      System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 

      for (int i = 0; i <8; i++) { 
       if (cache[slot].dataBlock[i] == (0xFF & address)) { 
        System.out.println("Writing over the value of that address now..."); 
        cache[slot].dataBlock[i] = input; 
       } 
      } 

     } 
     //Empty slot, no need to write back 
     else if (cache[slot].getValidBit() == 0) { 
      System.out.println("Cache Miss"); 
      System.out.println("Setting the dirty bit to 1"); 
      System.out.println("Dirty bit was " + cache[slot].getDirty()); 

      cache[slot].setValidBit(1); 
      cache[slot].setTag(tag); 
      cache[slot].setDirty(1); 
      System.out.println("And is now " +cache[slot].getDirty()); 
      cache[slot].setStartAddress(startAddress); 
      //copy from main mem to cache 
      System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 

      //writes to selected value in the cache 
      for (int i = 0; i <8; i++) { 
       if (cache[slot].dataBlock[i] == (0xFF & address)) { 
        System.out.println("Writing over the value of that address now..."); 
        cache[slot].dataBlock[i] = input; 
       } 
      } 
     } 
     menu(); 
    } 

输出:

This is a cache simulator, type in what you want to do and press enter 

[r] to read [w] to write [d] to display 
w 
What address do you want to write to? 
14c 
And what value do you want to write to it? 
99 
Cache Miss 
Setting the dirty bit to 1 
Dirty bit was 0 
And is now 1 
Writing over the value of that address now... 
This is a cache simulator, type in what you want to do and press enter 

[r] to read [w] to write [d] to display 
r 
What address? 
348 
Cache Miss 
This is a dirty slot! 
Slot is dirty and will be written back, val for 14c is 153 
Everything should have been copied to main by now. The value for 332 is 76 
The value at that address is: 48 

This is a cache simulator, type in what you want to do and press enter 

[r] to read [w] to write [d] to display 
+1

你的问题并不十分清楚,但一个简短但完整的程序展示了这个问题会使它很容易回答,我敢肯定...... – 2012-03-23 19:23:30

+2

''这是一个脏插槽!元音远离热闹! – mre 2012-03-23 19:52:04

+0

对不起。我将数据从一个数组复制到另一个数组,当我尝试将该数据重新加载回原始数组时,这是不正确的。 – jackie 2012-03-23 20:03:00

回答

1

如果startAddress是内main_Mem的地址,我想你想:

System.arraycopy(main_Mem, startAddress, ...) 

不是

System.arraycopy(main_Mem, main_Mem[startAddress], ...) 

但是,其中一次运行的完整输出可能会使得它更清楚发生了什么问题以及为什么。

+0

我更新了我的问题,完全包含了我的读写方法。问题在于它说“332的价值是76”。它应该是153(0x99)。它不会像我们的副本那样保存到主内存中。 – jackie 2012-03-23 20:11:48

+0

问题是第二次读取14c地址(索引)。它不再携带99.输出是4c(就像程序初始化时一样)。 – jackie 2012-03-23 20:20:48

+0

@JackieAldama:你甚至读过这个答案吗? – ruakh 2012-03-26 13:46:53