On 03/01/2015 05:45 PM, Pontus Pihlgren wrote:
On Sun, Mar 01, 2015 at 05:07:22PM +0100, Bjarni Juliusson wrote:
Oj, hmm. Då måste vi dels komma ihåg adressen för den föregående instruktionen, dels ogöra dess effekt i efterhand. Vi kan ju
nja. magnus sa ju att mmu:n skulle ignorera minnesaccesser, skulle inte det helt ogöra instruktionens effekter?
Nej.
Eller är det sidoeffekter i CPU:n du tänker på, flaghor som sätts eller liknande?
Ja. Processorn exekverar ju instruktionen oavsett vad den får för data från minnet. I efterhand måste vi kunna återställa ackumulatorn, X, Y, flaggorna, och stackpekaren. Så MMU:n måste komma ihåg var senaste opkoden fetchades ifrån innan trappen, så att vi kan se vad den var, ogöra effekten, och sätta tillbaka programräknaren för att starta om instruktionen. Insåg just att man lyckligtvis inte kan göra dataåtkomster med indirekt absolut adressering. Det hade varit rena döden. Enda indirekta data-adresseringen är via sida 0, som man rimligen alltid har mappad och både läs- och skrivbar. Så det där jag sa om I/O är nog ingen fara, man kan inte råka göra I/O man inte skulle ha gjort. Eller ja, förutom totalt degenererade situationer som att man gör ett indirekt hopp via en adress som ligger på skarven mellan en omappad sida och en I/O-sida, så att det slutar med att man gör en läsning till ett I/O-register två gånger. Det känns som en situation som det är helt acceptabelt att lösa genom att blänga på programmeraren. Bjarni