[Main]
[Docs]
[Installs]
[Search]
[Team]
[Guestbook]
[Links]
resload_Protect#? használata
Elmélet
Vannak olyan helyzetek, amikor hasznos lehet tudni azt, hogy az installált
program milyen memória-hozzáféréseket hajt végre.
A resload_Protect#? funkciókkal
lehetséges bizonyos memóriahelyek védelme olvasás és/vagy írás ellen.
A védelem azt jelenti hogy minden ilyen védett területhez való hozzáférés
Access Fault kivétet fog létrehozni, amit a WHDLoad egy kérdezővel fog
megjeleníteni. Ha egy memóriarészt védettnek állítasz be a
resload_Protect#? funkcióval, a
WHDLoad módosítani fogja a lapleírókat az MMU fordítási fában.
Ezentúl minden védett laphoz való hozzáféréskor a CPU Access Fault kivétet fog
generálni. A kivét handler a WHDLoad-on belül elenőrzi a kivét okát.
Ha az ok egy hozzáférés volt egy védett laphoz de a
hozzáférés nem egyezik a védett területtel, akkor a hozzáférés emulálva lesz,
és normál programfuttatás folytatódik. Egyébként a WHDLoad kilép a megfelelő
kérdezővel. Ha a hozzáférés egy hozzáférés az utasításokhoz (pl. a cpu
megpróbál egy kódot betölteni), az mindig emulálva lesz, vagy más szavakkal a resload_Protect#? funkciók csak az adatok
olvasását és írását szabályozzák. Tény hogy minden védett laphoz való
hozzáférés (jelenlegi lapméret $1000) hozzáférési kivétet fog létrehozni, még
ha a védett terület csak egy byte, az eredmény a program nagymértékű
belassulása lesz. Különösen ha a kód ugyanazon a lapon van. Ha program függ a
végrehajtási sebességtől, a futásban problémák adódhatnak. Ezért előfordulhat,
hogy néhány program nem működik a védelmi funkcióval.
Példa: kódok ellenőrzése
Ha egy játékot installálsz a WHDLoad segítségével, módosítanod kell az eredeti
betöltő rutint úgy, hogy a WHDLoad töltse be a játék adatait. Néhány játék
ellenőrzi a kódterületeket, hogy nem módosították-e az eredeti kódot.
Ezeket az érzékelő rutinokat néha nehéz megtalálni. De a resload_Protect#? funkciók használatával
ez könnyű. Csak annyit kell tenned, hogy levéded olvasástól azokat a
területeket, amelyeket megváltoztattál. Ezután minden rutin amely megpróbálja
ellenőrizni és beolvasni a megváltoztatott kódot, egy hozzáférési hibát fog
generálni. És így megtudod, hogy hol van a rutin.
Korlátozások
Nem védheted le azt a területet amelyre az SSP mutat. Ha ezt teszed,
és egy kivét történik, az egy Double Bus Fault-ot eredményez, mivel a CPU
nem tudja kiírni a kivét stackframe-et. A Double Bus Fault után csak egy reset
után lehet folytatni a végrehajtást. A WHDLoad ellenőrzi a védett terület és az
SSP konfliktusát, és megszűnteti azt, de ez nem segít, ha az SSP később
megváltozik.
- 68020 + 68851
- ez a hardver jelenleg nem támogatott
- 68030
- 3-byte átvitelek nem támogatottak és valódi hozzáférési kivétet hoznak
létre, ilyen átvitelek történhetnek, ha egy longword hozzáférés történik egy páratlan címen a
laphatárnál (pl. "
tst.l ($fff)
" ahol a $1000 lap védett),
mivel ez érvénytelen 68000-en, ezért valószínűleg ilyet sose fogsz látni
- zárt átvitelek
tas
, cas
vagy cas2
kód miatt nem támogatottak és valódi hozzáférési kivétet hoznak létre, ez nem
gond, mert a zárt átvitelt nem támogatja az Amiga hardvere
- 68040
- ez a hardver jelenleg nem támogatott
- 68060
- félrecímzett adatfolyamok hozzáférés nem támogatott és valódi hozzáférési kivétet hoznak
létre, a félrecímzett hozzáférés egy olyan hozzáférés, amely két lapon nyúlik
át (és ezek közül legalább az egyik vagy mindkettő védett), például "
tst.l ($ffe)
"
a $0..$fff lapot és a $1000..$1fff lapot is módosítja, ez a korlát valódi
probléma és a resload_Protect funkciót majdnem használhatatlanná teszi,
valószínűleg később megpróbálom támogatni, de ez nehéz
- félrecímzett adatfolyamok hozzáférés nem támogatott és valódi hozzáférési kivétet hoznak
létre, és ha mindkét érintett lap védett, ezt az együttállást el kell kerülni
az esetek nagy részében
- zárt átvitelek
tas
, cas
vagy cas2
kód miatt nem támogatottak és valódi hozzáférési kivétet hoznak létre, ez nem
gond, mert a zárt átvitelt nem támogatja az Amiga hardvere
- a védett lapon lévő utasítások (és emiatt emuláltak) és az
állapotregiszter supervisor részéhez való hozzáférések hibásan lesznek
végrehajtva, ezek az utasítások mindig 1-re állítják a nyomkövető bitet és a
megszakítás prioritás maszkját 7-esre, a supervisor rész bármilyen módosítása
hatástalan lesz (pl. a supervisor rész változatlan marad)
movem
utasítás hozzáférhet egy védett területhez anélkül, hogy hozzáférési
hiba kivétet hozna létre, ez azért lehetséges, mert csak az első hozzáférés lesz
ellenőrizve (word vagy longword)
move16
és a dupla pontosságú műveletek (FPU) nem támogatottak
és valódi hozzáférési kivétet hoznak létre
- a "
move (mem),(mem)
" utasítás a átlapoló forrás és
célcímzéssel hozzáférési kivétet hoznak létre, mivel a félrecímzés helytelenül
lesz végrehajtva, például a "move.l ($ffc),($ffe)
" utasítás, ahol
a $1000..$1fff lap védett és a memória végrahajtás előtti tartalma: ($ffc)=$11112222, ($1000)=$33334444,
végrehajtás után a $1000 tartalma: $11114444 és nem $22224444
[Main]
[Docs]
[Installs]
[Search]
[Team]
[Guestbook]
[Links]