Jeg prøver at forstå forskellen mellem byte adressering og ord adressering.
En 4-vejs sæt-associerende cache-hukommelsesenhed med en kapacitet på 16 KB er bygget ved hjælp af en blokstørrelse på 8 ord. Ordlængden er 32 bit. Størrelsen på det fysiske adresseområde er 4 GB.
Antal sæt i cachen $ = (16 * 1024) / (4 * 8 * 4) = 2 ^ 7 $
Hvis der bruges ordadressering:
Bloker forskydning $ = 3 \ bits $
Da PAS er $ 4 \ GB $ , totalt antal adresser = $ 2 ^ {32} / 2 ^ 2 = 2 ^ {30} $
Så samlede adressebit $ = 30 \ bits $
Adressestruktur:
Tagbits: $ 20 \ bits $
Set bit: $ 7 \ bits $
Bloker offset-bits: $ 3 \ bits $
Antag nu, at CPUen ønsker at få adgang til 3. byte af et bestemt ord.
- Cache-controlleren bruger $ 7 \ bits $ sætfelt til at indeksere i et sæt og derefter sammenlignes det højere $ 20 \ bits $ tag-felt med alle $ 4 $ blokke i sættet. Hvis der findes et match, opstår cache-hit, og den nedre $ 3 \ bits $ blokerer forskydning for at sætte et af ordene ud af $ 8 $ ord i et af de generelle formål register. CPUen ekstraherer derefter den 3. byte fra ordet og udfører operationen.
- Hvis tags ikke overføres, opstår der cache-fejl, der sendes et hukommelseslæsningssignal og på grund af den geografiske referencelokalitet en blok indeholdende ord overføres til cachen.
Hvis CPUen kan adresseres til byte:
Samlede adressebits $ = 32 $
Adressestruktur: Tagbits: $ 20 \ bits $
Indstil bits: $ 7 \ bits $
Bloker offset-bits: $ 5 \ bits $
Hvis CPUen vil have adgang til 3. byte af en word:
- Samme som i trin 1 i ord, der kan adresseres, men CPUen kan nu direkte adressere den 3. byte af ordet ved hjælp af den nedre $ 2 \ bits $ byte offset. Imidlertid forvirrede jeg, hvordan det ville ske. Da CPU-registerstørrelsen har en bredde på 1 ord, svarende til ordet adressering, vil et ord ud af de 8 ord i blokken blive overført til registeret. Men hvordan ville trinet “byteudtrækning” er lettere her? Og hvorfor kalder vi det byte-adressering, hvis vi stadig adresserer et ord?
- Samme som i trin 2 i ordadressering. Blok af data overføres fra hukommelsen til cachen i tilfælde af cachemiss.
Også dette svar siger, at fysisk hukommelse altid er byte adresserbar. Hvad er nu forskellen mellem hukommelsens adresserbarhed og CPU-arkitekturens adresserbarhed?
Svar
Word-adressering betyder, at antallet af linjer i adressebussen i processoren er mindre end antallet af bits i selve ordet.
Lad os sige, at vi har et 4 byte ord. (32 bit adresseområde)
Hvis denne maskine er byte-adresseab le, så vil adressebussen til CPUen have 32 linjer, hvilket gør det muligt at få adgang til hver byte i hukommelsen.
Hvis denne maskine kan ordadresseres, vil adressebussen til CPUen have 30 linjer ( $ 32 – log_ {2} 4 = 30 $ ), som gør det muligt at få adgang til hukommelse KUN i ord / bidder på 4 bytes, og det også fra adresser, der er et multiplum af ordstørrelsen.
Hvis du nu beder CPUen om at hente en byte fra en bestemt adresse, vil den først slippe de 2 mindst signifikante bits (ved drop betyder jeg at overskrive dem med 0 “s) af adressen, hente et ord fra den resulterende adresse og returnere en byte ved hjælp af de 2 mindst signifikante bits som en forskydning inden for det hentede ord.
Dette får hukommelsesadgangstiden til at øges, da CPUen skal bruge mere tid på at ændre adressen og behandlingen det hentede ord. Men det hjælper også med at reducere hardwareomkostningerne, da kredsløbets kompleksitet reduceres på grund af reduktionen i adressebuslinjer.
Denne overhead opstår dog aldrig i en byte adresserbar maskine, derfor “byte udpakning af “er lettere.
Kommentarer
- Jeg forstår, hvad du ' siger. Men hvad ' Ll ske i tilfælde af byte adressering? Antag at CPUen har brug for den 3. byte af ordet. Den sender 32 bit adressen med mindst 2 signifikant bit sat til 10, righ t?Men hvordan gemmer den derefter byten, da den bruger et register med 1 ordbredde? Vandt ' t CPUen i dette tilfælde også henter ordet fra cachen og gemmer det i det ' s register?
- For dig 1. spørgsmål: Byte-adressering af CPUer har separate skriveinstruktioner baseret på størrelsen på de data, der skal skrives. En for en byte, en for en dobbelt byte, en for en firebyte, en for et ord osv. (Faktisk har enhver CPU separate skriveinstruktioner, hver af de for forskellige understøttede størrelser af data, der skal skrives). byte, der skal skrives, lagres normalt i registerets 8 LSBer, hvorefter skriveinstruktionen for en byte udføres. Dette medfører, at KUN de 8 LSB-bits i registret indlæses på databussen, og kun en byte på adressen i hukommelsen ændres.
- Jeg gjorde ikke ' forstår ikke dit 2. spørgsmål. Kunne du uddybe.
- Jeg formoder, at det samme sker for at læse en byte i en maskine, der kan adresseres, ikke? Lad f.eks. ' s sige der ' s et tegnarray
char arr[10]
og CPU ønsker at læse det 3. tegn, dvs.arr[2]
. Derefter gemmer den den efter adgang til byten ved hjælp af 32 bit-adresse i de 8 LSBer i registret. Men i tilfælde af ord, der kan adresseres, beregner CPUen først adressen på det ord, som den 3. byte tilhører (dvs. overskriver de 2 LSBer med 0) og henter ordet i det ' s register. Derefter bruger den byteoffset til at få den krævede byte. Er dette korrekt? - Mange tak. Jeg vil bede dig om at samle alle disse i det originale svar, så det kan hjælpe enhver fremtidig læser.