キャッシュのサイズ (バイト単位)、各キャッシュ ラインの長さ (バイト単位)、およびキャッシュ内のセット/グループの数を取得する CPU キャッシュ エミュレーターを作成しています。
私はそのほとんどを書きましたが、何時間も苦労してきたのは、指定されたアドレスのタグとインデックスフィールドを抽出するために左/右にシフトする必要があるビット数を把握することです。
たとえば、アドレスが48の場合、タグとインデックスを特定する必要があります。
タグを抽出するために私が持っているものは次のとおりですが、それは間違っていると確信しています。
int extractTag(int address, int sets){
int bits = exp2(sets); // number of bits to shift: 2^sets
unsigned int tag;
int tag = address >> (32 - bits);
return tag;
}