Я пытаюсь создать много ошибок в кэше L1 и L2, если возможно, чтобы уничтожить кэш.Пример ниже - это фрагмент кода, над которым я работаю.В этом коде c_size - это размер кеша L1, L2 и L3.В моей системе L1, L2, L3 составляют 32 КБ, 256 КБ и 2048 КБ соответственно.Строка кэша составляет 64 байта.Моя цель - создавать ошибки в кэше, когда я читаю или пишу в память.Я пытался использовать разные размеры массивов, но я получаю несколько ошибок в кеше (меньше, чем ожидалось).Цель будет 50%.Я не уверен, что я не очень хорошо.Пожалуйста, кто-нибудь может объяснить, как этого добиться?
// allocate memory at an aligned address
int PAGE_SIZE = getpagesize();
int n_pages = c_size / PAGE_SIZE;
if (c_size % PAGE_SIZE != 0) n_pages++;
size_t alloc_size = n_pages * PAGE_SIZE;
void *x = mmap ((void *)mmap_addr, alloc_size, PROT_READ|PROT_WRITE,
MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, (off_t)0);
if (x == MAP_FAILED || x != mmap_addr) {
fprintf(stderr, "Could not allocate memory at %p: %s\n", mmap_addr,
strerror(errno));
exit (1);
}
char *addr;
int rand_t,rval;
uint64_t urand;
int i,j;
unsigned int A[32768];
uint64_t temp = 0xff000000ul << 24;
if (access_type == Write){
for(i = 0; i < 64; i++){
rand_t = rand();
A[i]=rand_t & temp;
rval = rand_t & temp; // random byte
addr = (char *) (mmap_addr+(rand_t % c_size));
//*addr = rval;
*addr = A[i];
//asm("rdrand %r14");
//printf("%p:\t%x\tmem:%hhx\n", addr, rval, *addr);
}