.exe failid

.exe failid on täitmisfailid, mis töötavad mõnevõrra teisiti kui andmefailid, sest nad võivad otseselt operatsioonisüsteemi API funktsioone kasutada. Samas andmefailid vajavad töötamiseks lisaks juba olemasolevat programmi. EXE-fail (ingliskeelse sõna esitähtedest executable) on kasutusel operatsioonisüsteemides DOS, OpenVMS, Microsoft Windows, ReactOS ja OS/ 2. DLL failid on EXE-faili osad, mis teevad programmi modulaarsemaks, andes igale DLL failile oma ülesande.

MS Windowsi .exe faili formaat.

Fail algab DOS(Disk Operating System) päisega, mis on jääk kunagisest 16 bitisest operatsioonisüsteemist. DOS päises on viit PE päisele, mida kasutavad 32 bitised ja uuemad operatsioonisüsteemid. Kõik need päised on kirjeldatud Microsofti SDK-s WinNT.h failis.

Põhimõtteliselt on EXE-fail sarnane nii andmekandjal olles kui ka töötavana käitusajal(runtime) mällu laetuna. Peamine erinevus on, et EXE-failid on mälus ümberpaigutatavad, mis tähendab, et neid võib operatsioonisüsteemis laadida erinevatele virtuaalsetele aadressidele. Kuid juba laetuna neid enam ümber ei paigutata.

Virtuaalseid mäluaadresse on 32-bit operatsioonisüsteemis 2^32 ehk umbes 4 GB, 64 bit OS-is vastavalt 2^64.  Põhjus ümberpaigutamiseks on, et operatsioonisüsteem laeb DLL failid samasse aadressiruumi. DLL tähendab kokkuhoidu mälukasutuses, sest kui mitu EXE-faili kasutab sama DLL faili, siis neid DLL-e ei laeta uude mälupiirkonda vaid kaardistatakse ümber. Kuid igal DLL failil on määratud oma baas aadress ja kui samasse aadressiruumi laaditakse palju DLL faile, siis võib juhtuda, et DLL faili baas aadress on juba võetud ja toimub ümberpaigutamine.

Sellepärast ei ole EXE-faili päistes kunagi absoluutseid aadresse, vaid relatiivsed(suhtelised) virtuaalsed aadressid. Käitusajal lisatakse RVA-le DLL-i baas aadress. RVA on lihtsalt offset(nihe) faili algusest.

Exe-fail on lisaks jagatud osadeks: koodi sektsioon(code section), andme sektsioon jne. ükskõik kui palju sektsioone on vastaval programmil vaja. Erinevad sektsioonid tuleb programmi käitamisel joondada mälus erinevalt, sest neile on faili päises määratud erinevad juurdepääsu seadistused. Kuna neid juurdepääsu(access) settinguid saab määrata virtuaalses mälus ainult ühe lehekülje(page) suurusele tükile, siis tekibki joondamisega probleem. Sest fail diskil muutuks väga suureks, kui näiteks joondada kõik sektsioonid 4k suuruse lehekülje piiridesse. Sellepärast on PE päises kaks joondamist: sektsiooni joondus ja faili joondus. RVA on offset faili algusest kasutades sektsiooni joondust, mitte faili joondust. Sellepärast tuleb EXE-faili lugedes teha mõned ümberarvutused.

Advertisements