resload_Protect#?:n käyttö
Teoria
Monissa eri tilanteissa voi olla hyödyllistä tietää, koska asennettu ohjelma käyttää tiettyjä muistiosoitteita. Toiminnon resload_Protect#? avulla on mahdollista suojata tiettyjä muistialueita suorittimen lukemiselta ja/tai kirjoitukselta. Suojaus tarkoittaa, että jokainen haku suojatulle alueelle tuottaa Access Fault -poikkeuksen, josta WHDLoad antaa asiaankuuluvan valintaikkunan. Jos määrität muistialueen suojatuksi resload_Protect#?-funktiolla, WHDLoad muokkaa sitä koskevia sivun kuvaajia MMU:n kääntöpuussa. Nyt joka kerta yrittäessään käyttää suojattua sivua suoritin luo Access Fault -poikkeuksen. WHDLoadin sisäinen poikkeuskäsittelijä varmentaa poikkeuksen syyn. Jos syy oli suojatun sivun käyttö, mutta käyttö ei vastaa suojattua al
uetta käyttö emuloidaan ja normaali ohjelman suoritus jatkuu. Muuten WHDLoad lopettaa toiminnan ja antaa asiaankuuluvan ilmoituksen. Jos käyttö oli ohjevirran käyttö (ts. suoritin yritti ladata koodia), se emuloidaan aina, toisin sanoen resload_Protect#? -funktiot vaikuttavat vain tietojen lukuun ja kirjoitukseen. Se, että jokainen suojatun sivun käyttöyritys (sivun koko on $1000) luo access fault -poikkeuksen, vaikka suojattu alue olisi vain 1 tavun mittainen, hidastaa huomattavasti ohjelman suoritusta. Erityisesti, jos koodin osia on samalla sivulla. Jos ohjelma riippuu suoritusnopeudesta, se voi toimia eri tavoin. Siksi tietyt ohjelmat eivät ehkä toimi suojauksen kanssa.
Esimerkki: koodin tarkistussummat
Jos asennat pelin WHDLoadilla sinun on päivitettävä pelin alkuperäiset latausrutiinit niin, että ne lataavat pelitiedot WHDLoadilla. Jotkut pelit laskevat tarkastussummia koodialueista tunnistaakseen, onko alkuperäistä koodia muutettu. Näitä tunnistusrutiineja voi joskus olla vaikea löytää. Mutta WHDLoadin resload_Protect#? -funktioilla tästä tulee lapsellisen helppoa. Suojaa vain pelikoodissa muuttamasi tavut lukemiselta. Nyt jokainen tarkistussummaa laskeva rutiini, joka lukee päivitettyä koodia synnyttää access fault -poikkeuksen. Nin tiedät, missä rutiini sijaitsee.
Rajoitukset
Et voi suojata muistia, jonne SSP osoittaa. Jos teet niin ja tulee poikkeus, seurauksena on Double Bus Fault -virhe, koska suoritin ei voi kirjoittaa poikkeuksen pinokehystä. Double Bus Faultin jälkeen suoritusta voidaan jatkaa vain resetoimalla. WHDLoad tarkistaa suojatun alueen ja SSP:n ristiriidan ja keskeytyy jos näin on, mutta siitä ei ole apua jos SSP muuttuu myöhemmin.
- 68020 + 68851
- tätä laitteistoa ei tällä hetkellä tueta
- 68030
- 3 tavun siirtoja ei tueta ja ne luovat todellisen Access Faultin, tällaisia siirtoja tapahtuu jos käytetään longwordia parittomassa osoitteessa sivun rajalla (esim. "
tst.l ($fff)
" jossa sivu osoitteessa $1000 on suojattu), koska tämä ei kelpaa 68000:lla näet tuskin koskaan tällaista
- lukittuja siirtoja joita tekevät
tas
, cas
tai cas2
ei tueta ja ne luovat todellisen Access Faultin, tämä ei ole ongelma koska Amigan laitteisto ei tue lukittuja siirtoja
- 68040
- tätä laitteistoa ei tällä hetkellä tueta
- 68060
- väärin kohdistettuja tietovirran käyttöjä ei tueta ja ne luovat todellisen Access Faultin. Väärin kohdistettu käyttö on sellainen, joka kattaa kaksi sivua (joista ainakin toinen on suojattu), esimerkiksi "
tst.l ($ffe)
" vaikuttaa sivuun $0..$fff ja sivuun $1000..$1fff, tämä rajoitus on todellinen ongelma ja tekee resload_Protect -ominaisuudesta toisinaan miltei käyttökelvottoman, saatan myöhemmin yrittää tukea tätä, mutta se on vaikeaa
- väärin kohdistettuja käskyvirran käyttöjä ei tueta ja ne luovat todellisen Access Faultin, jos molemmat sivut on suojattu. Useimmiten tällaisen tilanteen voinee välttää
- lukittuja siirtoja joita tekevät
tas
tai cas
ei tueta ja ne luovat todellisen Access Faultin, tämä ei ole ongelma koska Amigan laitteisto ei tue lukittuja siirtoja
- käskyt, jotka ovat suojatulla sivulla (ja jotka siksi emuloidaan) ja jotka käyttävät tilarekisterin supervisor-osaa suoritetaan väärin. Nämä käskyt näkevät aina trace-bitin arvolla 1 ja keskeytysprioriteettimaskin arvolla 7, supervisor-osan muutoksella ei ole merkitystä (ts. supervisor-osa ei muutu).
movem
-käsky saattaa käyttää suojattua aluetta luomatta Access Fault -poikkeusta, tämä on mahdollista koska vain ensimmäinen käyttö (word tai longword) tarkistetaan suojatun alueen käytön varalta
move16
- ja kaksoistarkkuuden operaatioita (FPU) ei tueta ja ne luovat todellisen Access Faultin
- "
move (mem),(mem)
" jossa on päällekkäiset lähde- ja kohdeosoitteet luo Access Faultin, koska Misalignment suoritetaan väärin, esim. "move.l ($ffc),($ffe)
" jossa sivu $1000..$1fff on suojattu ja muistissa on ennen suoritusta ($ffc)=$11112222, ($1000)=$33334444, suorituksen jälkeen $1000 sisältää $11114444 eikä $22224444