Jeg prøver å forstå forskjellen mellom byte adressering og ordadressering.
En 4-veis set-associativ cache-minneenhet med en kapasitet på 16 KB er bygget med en blokkstørrelse på 8 ord. Ordlengden er 32 bits. Størrelsen på den fysiske adresseområdet er 4 GB.
Antall sett i hurtigbufferen $ = (16 * 1024) / (4 * 8 * 4) = 2 ^ 7 $
Hvis ordadressering brukes:
Blokkeringsforskyvning $ = 3 \ bits $
Siden PAS er $ 4 \ GB $ , totalt antall adresser = $ 2 ^ {32} / 2 ^ 2 = 2 ^ {30} $
Så, totale adressebiter $ = 30 \ bits $
Adressestruktur:
Tagbiter: $ 20 \ bits $
Sett bits: $ 7 \ bits $
Blokker offsetbiter: $ 3 \ bits $
Anta nå at CPU-en vil ha tilgang til 3. byte av et bestemt ord.
- Cache-kontrolleren vil bruke $ 7 \ bits $ settfelt for å indeksere til et sett og deretter sammenligner du det høyere $ 20 \ bits $ -feltet med alt $ 4 $ blokker i settet. Hvis det blir funnet et samsvar, oppstår cache-treff og den nedre $ 3 \ bits $ blokkerer forskyvning for å sette et av ordene ut av $ 8 $ ord i et av registeret for generelle formål. CPUen trekker deretter ut den tredje byten fra ordet og utfører operasjonen.
- Hvis tagger ikke samsvarer, oppstår cache-feil, et minnesavlesignal sendes og på grunn av den romlige referanselokaliteten, en blokk som inneholder ord overføres til hurtigbufferen.
Hvis CPU-en kan bytes adresseres:
Totale adressebiter $ = 32 $
Adressestruktur: Tagbiter: $ 20 \ bits $
Sett bits: $ 7 \ bits $
Blokker offsetbiter: $ 5 \ bits $
Hvis CPU-en vil ha tilgang til 3. byte av en ord:
- Samme som i trinn 1 i adresserbar ord, men CPU kan nå adressere den tredje byten av ordet ved å bruke den nedre $ 2 \ bits $ byte offset. Imidlertid forvirret jeg hvordan det ville skje. Siden CPU-registerstørrelsen har en bredde på 1 ord, som ligner på ordet adressering, vil ett ord av de 8 ordene i blokken overføres til registeret. Men hvordan trinnet «byteutpakking» er lettere her? Og hvorfor kaller vi det byteadressering hvis vi fremdeles adresserer et ord?
- Samme som i trinn 2 i ordadressering. Blokk av data vil bli overført fra minnet til hurtigbufferen i tilfelle hurtigbuffer.
Også dette svaret sier at fysisk minne alltid er byte adresserbar. Nå, hva er forskjellen mellom adressekapasiteten til minnet og adressabiliteten til CPU-arkitekturen?
Svar
Ordadressering betyr at antall linjer i adressebussen i prosessoren er mindre enn antall bit i selve ordet.
La oss si at vi har et 4 byte ord. (32 biters adresserom)
Hvis denne maskinen er byteadresse le, da vil adressebussen til CPUen ha 32 linjer, som gjør det mulig å få tilgang til hver byte i minnet.
Hvis denne maskinen kan ordadresseres, vil adressebussen til CPUen ha 30 linjer ( $ 32 – log_ {2} 4 = 30 $ ), som gjør det mulig å få tilgang til minne KUN i ord / biter på 4 byte og det også fra adresser som er et multiplum av ordstørrelsen.
Nå hvis du ber CPUen om å hente en byte fra en bestemt adresse, vil den først slippe de to minst betydningsfulle bitene (med dråpe mener jeg å overskrive dem med 0 «s) av adressen, hente et ord fra den resulterende adressen og returner en byte ved å bruke de to minst signifikante bitene som en forskyvning i det hentede ordet.
Dette fører til at minnetilgangstiden øker, siden CPUen må bruke mer tid på å endre adressen og behandlingen Det hentede ordet. Men det hjelper også til å redusere maskinvarekostnadene siden kompleksiteten til kretsene er redusert på grunn av reduksjonen i adressebusslinjer. å pakke ut «er lettere.
Kommentarer
- Jeg forstår hva du ' sier. Men hva ' Skjer det i tilfelle byte-adressering? Anta at CPU-en trenger den tredje byten av ordet. Den vil sende 32-biters adresse med minst 2 signifikante bit satt til 10, rett t?Men hvordan lagrer den byten gitt at den bruker register med 1 ordbredde? Vant ' t CPUen i dette tilfellet også henter ordet fra hurtigbufferen og lagrer det i det ' s register?
- For deg første spørsmål: Byte-adressering-prosessorer har separate skriveinstruksjoner basert på størrelsen på dataene som skal skrives. En for en byte, en for en dobbel byte, en for en firebyte, en for et ord osv. (Egentlig har en hvilken som helst CPU separate skriveinstruksjoner hver for de forskjellige støttede størrelsene på data som skal skrives). byte som skal skrives lagres vanligvis i de 8 LSB-ene i registeret, så blir skriveinstruksjonen for en byte utført. Dette fører til at KUN de 8 LSB-bitene i registeret lastes på databussen, og bare en byte på adressen i minnet blir endret.
- Jeg gjorde ikke ' t forstår ditt andre spørsmål. Kan du utdype det.
- Jeg antar at det samme skjer for å lese en byte i en maskin som kan adresseres, ikke sant? La for eksempel ' si det ' er et tegnarray
char arr[10]
og CPU ønsker å lese 3. tegn, dvs.arr[2]
. Etter at du har tilgang til byten ved hjelp av 32-biters adresse, vil den lagre den i de 8 LSB-ene i registeret. Men når det gjelder ordet adresserbart, vil CPU først beregne adressen til ordet som 3. byte tilhører (dvs. overskrive de 2 LSBene med 0) og hente ordet i det ' s register. Etter det vil den bruke byteforskyvningen for å få ønsket byte. Er dette riktig? - Tusen takk. Jeg vil be deg om å sette alle disse sammen i det opprinnelige svaret, slik at det kan hjelpe enhver fremtidig leser.