Использование System.arraycopy в Java - PullRequest
1 голос
/ 23 марта 2012

Итак, я создал симулятор кэша обратной записи с прямым отображением.

При тестировании своих вещей я записал на адрес 0x14c значение «99», изначально это было значение «4C». Затем я прочитал значение 0x348, что заставляет функцию обратной записи выполняться, потому что оба этих адреса нижек тому же номеру слота, просто другому тегу.

По сути, мне нужно записать все данные в слоте из объекта «cache» в объект 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 Ответ

2 голосов
/ 24 марта 2012

Если startAddress является адресом в main_Mem, я думаю, вы хотите:

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

Not

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

Хотя полный вывод из одного из прогонов, вероятно, сделает его более понятнымчто не так и почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...