[Main]
[Docs]
[Installs]
[Search]
[Team]
[Guestbook]
[Links]
Používanie resload_Protect#?
Teória
Existujú rôzne situácie, v ktorých sa môže
hodiť informovanosť o prístupoch nainštalovaného programu do určitých oblastí
pamäti. S pomocou funkcie resload_Protect#?
je možné chrániť určité oblasti pamäte pred čítaním alebo zapisovaním
procesorom. Ochrana znamená, že každý prístup do tatko chránenej oblasti vyvolá
Access Fault výnimku, ktorá vyústi v chybové hlásenie programu WHDLoad. Ak
označíte oblasť pamäte ako chránenú použitím funkcie resload_Protect#?, WHDLoad zmení popisy
danej oblasti v translation tree MMU. Potom pri každom prístupe do danej
pamäte, CPU vytvorí výnimku Access Fault. Ovládač výnimiek vo vnútri WHDLoad overí
dôvod pre výnimku. Ak bola príčina v prístupe do chránenej stránky,ale prístup sa nezhoduje s chránenou
oblasťou, potom bude tento prístup emulovaný a program bude pokračovať
v normálnom chode. Inak sa WHDLoad ukončí s adekvátnym chybovým
hlásením, alebo inými slovami funkcie resload_Protect#?
Ovplyvnia len čítanie a zapisovanie dát. Fakt, že každý prístup do
chránenej stránky (veľkosť stránky je momentálne $1000) vytvorí zlyhanie prístupu,
i keď chránená oblasť má len dĺžku 1 byte, vyústi do silného spomalenia
chodu programu, hlavne ak sú chránené časti kódu v rovnakej stránke pamäti. Ak
je program závislý na určitej rýchlosti, odchýlky vo funkčnosti nie sú
vylúčené, čo znamená, že niektoré programy nemusia s ochranou pamäte fungovať.
Príklad: checksum kódu
Ak inštalujete hru pomocou WHDLoad, budete
musieť upraviť pôvodný loader v hre tak, aby sa dáta programu nahrávali cez
WHDLoad. Niektoré hry kontrolujú súčet kľúčových oblastí svojho kódu a tým
zisťujú, či kód nebol zmenený. Niekedy sa však tieto rutiny ťažko hľadajú.
Použitím funkcií resload_Protect#? vo
WHDLoad však problém rieši. Všetko, čo musíte urobiť, je chrániť zmenené bajty
pred prečítaním. Potom každá rutina, ktorá sa pokúša vypočítať checksum a
prečítať váš opravený kód, spôsobí prístupovú chybu a vy tak zistíte, kde je
kontrolná rutina lokalizovaná.
Obmedzenie
Nesmiete chrániť stránku pamäťe, na ktorú
odkazuje SSP. Ak to spravíte a objaví sa výnimka, dôjde k dvojitej chybe na
zbernici, pretože CPU nebude schopné zapísať stackframe výnimky. Potom sa dá
program už len resetovať. WHDLoad overuje, či existuje konflikt chránenej
oblasti s SSP a ak áno, ukončí sa. To ale nepomôže, ak sa SSP zmení neskôr.
- 68020 + 68851
- tento hardvér nie je momentálne podporovaný
- 68030
- 3-Byte presuny nie sú podporované a
spôsobia Access Fault, také presuny sa stávajú, ak sa k longword
pristupuje na nepárnej adrese (napr. tst.l $fff), zatiaľ čo chránená
oblasť pamäte začína na $1000). Pretože toto je nesprávne na 68000, možno
na to nikdy nenarazíte.
- uzamknuté presuny spôsobené TAS, CAS or
CAS2 nie sú podporované a spôsobia reálnu Access Fault, to ale nie
je problém, pretože tieto presuny nie sú podporované hardvérom Amigy.
- 68040
- tento hardvér nie je momentálne podporovaný
- 68060
- misaligned data stream prístupy nie sú
podporované a spôsobia Access Fault, misaligned access je taký prístup
ktorý sa vzťahuje na dve stránky (a jedna z nich je chránená), napr.
“tst.l ($ffe)” ovplyvňuje stránku $0..$fff a stránku $1000..$1fff,
toto obmedzenie je skutočný problém a občas je kvôli tomu schopnosť
resload_Protect takmer nepoužiteľná, možno to neskôr opravím, ale je to
ťažké
- misaligned instructions stream prístupy nie
sú podporované a vytvoria Access Fault, ak sú obe stránky chránené, vo
väčšine prípadov sa takej situácii dá vyhnúť
- uzamknuté presuny spôsobené TAS alebo CAS
nie sú podporované a vytvoria skutočný Access Fault, to ale nie je
problém, pretože tieto presuny nie sú podporované hardvérom Amigy.
- inštrukcie, ktoré ležia v chránenej stránke
(a preto musia byť emulované) a pristupujú k Supervisor časti status
registra, budú vykonané nesprávne, tieto inštrukcie vždy vidia trace bit
ako 1 a masku priority výnimky ako 7, akákoľvek modifikácia Supervisor
časti bude neúčinná (Supervisor časť zostane nezmenaná).
movem
inštrukcie môžu pristupovať k
chránenej oblasti bez vytvorenia Access Fault. To je možné vďaka tomu, že
je overovaný len prvý prístup k chránenej oblasti (word alebo longword)
move16
a double precision operácie (FPU)
nie sú podporované a vytvora Access Fault
- "move (mem),(mem)" s
prekračujúcimi zdrojovými a cieľovými adresami generujú Access
Fault, pretože misaligment bude vykonaný nesprávne.
Napríklad: "
move.l ($ffc),($ffe)
" kde je stránka $1000..$1fff chránená, a pamäť pred spustením
obsahuje ($ffc)=$11112222, ($1000)=$33334444, po spustení $1000 bude obsahovať $11114444 a nie $22224444
[Main]
[Docs]
[Installs]
[Search]
[Team]
[Guestbook]
[Links]