Používání resload_Protect#?
Teorie
Vyskytnou se různé situace, ve kterých se může hodit být informován o přístupech
nainstalovaného programu do určitých oblastí paměti. S pomocí funkcí resload_Protect#?
je možné chránit určité oblasti paměti před čtením anebo zapisovaním procesorem.
Chránit znamená, že každý přístup do tatko chráněné oblasti vyvolá Access Fault
vyjímku, která vyústí v chybový requester WHDLoadu. Jestliže označíte oblast paměti
jako chráněnou použitím resload_Protect#? funkce,
WHDLoad změní popisy oné oblasti v překladači MMU. Nyní při každém přístupu do dané
paměti CPU vytvoří vyjímku Access fault. Handler vyjímek uvnitř WHDLoadu ověří
důvod pro vyjímku a WHDLoad vyskočí s chybovým hlášením. Tato schopnost se ale
projevuje silným zpomalením běhu programu, obzvláště pokud jsou chráněné části
kódu ve stejné stránce paměti. Pokud program závisí na rychlosti běhu, rozdíly
ve funkčnosti jsou možné - některé programy nemusí s ochranou paměti fungovat.
Příklad: checksums kódu
Pokud instalujete hru pomocí WHDLoad, budete muset patchnout původní loader
ve hře tak, aby program nahrával přes WHDLoad. Některé hry provádějí kontrolní
součet klíčových oblastí programu, aby detekovaly změny původního kódu. Tyto
rutiny může být někdy těžké najít. Ale použití resload_Protect#? funkcí
ve WHDLoad problém řeší. Všechno, co musíte udělat, je chránit bajty, které jste
změnili v kódu hry před přečtením. Pak každá rutina, která se pokouší přečíst
váš opravený kód způsobí chybu a vy zjistíte, kde kontrola je.
Omezení
Nesmíte chránit paměť, kde je SSP. Pokud to uděláte a stane se vyjímka, dojde
k dvojité chybě na sběrnici, protože CPU nebude schopné zapsat stackframe vyjímky.
Poté už se dá program jen resetnout. WHDLoad ověřuje, jestli existuje konflikt chráněné
oblasti se SSP a pokud ano - ukončí se, ale to nepomůže, pokud se SSP později změní.
- 68020 + 68851
- tento hardware není momentálně podpořen
- 68030
- 3-Byte přesuny nejsou podporovány a způsobí Access Fault, takové přesuny
se stávají, pokud je přistupováno k longwordu na liché adrese (napr. tst.l $fff),
zatímco chráněná oblast paměti začíná na $1000). Protože tohle je nesprávně i na A500,
možná na to nikdy nenarazíte.
- uzamčené přesuny způsobené TAS, CAS or CAS2 nejsou podpořeny a zahlásí chybu,
to ale není problém, protože tyto přesuny nejsou podpořeny hardwarem Amigy.
- 68040
- tento hardware není momentálně podpořen
- 68060
- misalignované data stream přístupy nejsou podpořeny a způsobí chybu
(např. tst.l $fff, zatímco chráněná oblast paměti začíná na $1000), toto omezení
je problém a občas je kvůli tomu schopnost resload_Protect téměř neopužitelná,
možná to později opravím, ale je to těžké
- misalignované instructions stream přístupy nejsou podpořeny a vytvoří chybu,
pokud jsou obě zasažené stránky chráněné
- uzamčené přesuny způsobené TAS, CAS or CAS2 nejsou podpořeny a zahlásí chybu,
to ale není problém, protože tyto přesuny nejsou podpořeny hardwarem Amigy.
- instrukce, které leží na chráněné stránce paměti a přistupují k supervizor
části status registeru budou vykonány nepřesně, tyto instrukce vždy vidí trace bit
jako 1 a masku priority vyjímky jako 7, jakákoliv modifikace supervizor části
bude neúčinná
- movem instrukce mohou přistupovat k chráněné oblasti bez ohlášení chyby,
protože je ověřen jen první přístup k chráněné oblasti
- move16 a double precision operace (FPU) nejsou podpořené a ohlásí chybu
- "move (mem),(mem)" překračující hranice stránek paměti budou vykonány nesprávně