Uitvoerbare bestandsindelingen. PE (draagbaar uitvoerbaar): op vreemdere getijden

College 3. Bestandsstructuur

Literatuur

o Moderne besturingssystemen, E. Tanenbaum, 2002, St. Petersburg, St. Petersburg, 1040 pagina's, (in djvu 10,1 MB) meer>>

o Netwerkbesturingssystemen N.A. Oliver, V.G. Olifer (zip-archief 1.1Mb)

o Netwerkbesturingssystemen N.A. Oliver, V.G. Oliver, 2001, St. Petersburg, St. Petersburg, 544 pagina's, (6,3 MB in djvu)meer>>

Bestanden

Vereisten voor informatieopslag:

o de mogelijkheid om grote hoeveelheden gegevens op te slaan

o informatie moet worden bewaard na beëindiging van het proces

o meerdere processen moeten gelijktijdig toegang hebben tot informatie

2.1.1 Bestanden een naam geven

De lengte van de bestandsnaam is afhankelijk van het besturingssysteem en kan van 8 (MS-DOS) tot 255 (Windows, LINUX) tekens zijn.

Besturingssystemen kunnen onderscheid maken tussen hoofdletters en kleine letters. WINDOWS en windows voor MS-DOS zijn bijvoorbeeld hetzelfde, maar voor UNIX zijn het verschillende bestanden.

Op veel besturingssystemen bestaat de bestandsnaam uit twee delen gescheiden door een punt, zoals windows.exe. Het gedeelte na de punt heet bestandsextensie. Op basis daarvan onderscheidt het systeem het bestandstype.

MS-DOS heeft een extensie van 3 tekens. Volgens dit maakt het systeem onderscheid tussen het type bestand en kan het ook worden uitgevoerd of niet.

UNIX heeft een extensie die beperkt is tot 255 tekens in de bestandsnaam, en UNIX kan meerdere extensies hebben, maar extensies worden meer gebruikt door toepassingsprogramma's dan door het besturingssysteem. Bij uitbreiding kan UNIX niet bepalen of het een uitvoerbaar bestand is of niet.

2.1.2 Bestandsstructuur

Drie hoofdbestandsstructuren:

1. Bytereeks- Het besturingssysteem is niet geïnteresseerd in de inhoud van het bestand, het ziet alleen de bytes. Het grote voordeel van een dergelijk systeem is de flexibiliteit in gebruik. Gebruikt op Windows en UNIX.

2. Volgorde van records- Records met een vaste lengte (bijv. ponskaart) worden sequentieel gelezen. Nu niet gebruikt.

3. Opnameboom- elk record heeft een sleutel, de records worden gelezen door de sleutel. Het grote voordeel van een dergelijk systeem is de zoeksnelheid. Nog steeds in gebruik op mainframes.

Drie soorten bestandsstructuren.

2.1.3Bestandstypen

Belangrijkste bestandstypen:

O Normaal- gebruikersinformatie bevatten. Gebruikt op Windows en UNIX.

O Catalogi- systeembestanden die de structuur van het bestandssysteem ondersteunen. Gebruikt op Windows en UNIX.

O Symbolisch- voor input-output simulatie. Alleen gebruikt op UNIX.

O Blok- voor schijfmodellering. Alleen gebruikt op UNIX.

Belangrijkste soorten reguliere bestanden:

O ASCII-bestanden- bestaan ​​uit tekststrings. Elke regel eindigt met een regelterugloop (Windows), een regelinvoer (UNIX) en beide (MS-DOS). Daarom, als u een tekstbestand opent dat is geschreven in UNIX op Windows, dan zullen alle regels samenvloeien tot één grote regel, maar onder MS-DOS zullen ze niet samenvoegen ( dit is een vrij veel voorkomende situatie.). Belangrijkste voordelen van ASCII-bestanden:
- kan op het scherm worden weergegeven en zonder conversie naar de printer worden uitgevoerd
- kan door bijna elke editor worden bewerkt

O binaire bestanden- andere bestanden (geen ASCII). In de regel hebben ze een interne structuur.

De belangrijkste soorten binaire bestanden zijn:

O Uitvoerbaar- programma's, ze kunnen worden verwerkt door het besturingssysteem zelf, hoewel ze worden geschreven als een reeks bytes.

O Niet-uitvoerbaar- ander.

Voorbeelden van uitvoerbare en niet-uitvoerbare bestanden

"Magisch nummer"- het bestand als uitvoerbaar identificeren.

2.1.4Bestandstoegang

Belangrijkste soorten bestandstoegang:

O Consistent- bytes worden in volgorde gelezen. Gebruikt toen er magneetbanden waren.

2.1.5 Bestandskenmerken

Belangrijkste bestandskenmerken:

o Beveiliging - wie en hoe toegang krijgen tot het bestand (gebruikers, groepen, lezen/schrijven). Gebruikt op Windows en UNIX.

o Wachtwoord - wachtwoord voor het bestand

o Maker - wie heeft het bestand gemaakt

o Eigenaar - de huidige eigenaar van het bestand

o Alleen-lezen vlag - 0 - lezen/schrijven, 1 - alleen lezen. Gebruikt in Windows.

o Markeer "verborgen" - 0 - zichtbaar, 1 - onzichtbaar in de lijst met bestanden in de map (standaard). Gebruikt in Windows.

o Vlag "systeem" - 0 - normaal, 1 - systeem. Gebruikt in Windows.

o Vlag "Archief" - al dan niet gereed voor archivering (niet te verwarren met compressie). Gebruikt in Windows.

o Vlag "gecomprimeerd" - het bestand is gecomprimeerd (vergelijkbaar met zip-archieven). Gebruikt in Windows.

o Versleutelde vlag - het versleutelingsalgoritme wordt gebruikt. Als iemand een bestand probeert te lezen dat geen toestemming heeft om dit te doen, kan hij het niet lezen. Gebruikt in Windows.

o ASCII-vlag/binair - 0 - ASCII, 1 - binair

o Willekeurige toegangsvlag - 0 - alleen serieel, 1 - willekeurige toegang

o Markeer "tijdelijk" - 0 - normaal, 1 - om het bestand aan het einde van het proces te verwijderen

o Blokkeringsvlag - toegang tot het bestand blokkeren. Als het druk is om te bewerken.

o Aanmaaktijd - datum en tijd van aanmaak. UNIX wordt gebruikt.

o Laatste toegangstijd - datum en tijd van de laatste toegang

o Laatst gewijzigde tijd - datum en tijd van de laatste wijziging. Gebruikt op Windows en UNIX.

o Huidige grootte - bestandsgrootte. Gebruikt op Windows en UNIX.

2.1.6Bestandsbewerkingen

Basissysteem vereist het werken met bestanden:

o Maken - maak een bestand zonder gegevens.

o Verwijderen - verwijder bestand.

o Openen - open een bestand.

o Sluiten - sluit het bestand.

o Lezen - lezen uit een bestand, vanaf de huidige positie van het bestand.

o Schrijven - schrijven naar een bestand, naar de huidige positie van het bestand.

o Toevoegen - toevoegen aan het einde van het bestand.

o Zoeken - stelt de bestandsaanwijzer in op een specifieke positie in het bestand.

o Attributen ophalen - bestandsattributen ophalen.

o Stel attributen in - stel bestandsattributen in.

o Hernoemen - hernoem het bestand.

Als u het Linux-bestandssysteem, de directorystructuur, de configuratie, de uitvoerbare bestanden en de tijdelijke bestandslocaties begrijpt, kunt u uw systeem beter begrijpen en een succesvolle systeembeheerder worden. Het Linux-bestandssysteem zal ongebruikelijk zijn voor een beginner die net is overgestapt van Windows, omdat alles hier compleet anders is. In tegenstelling tot Windows bevindt het programma zich niet in een enkele map, maar wordt het meestal verdeeld over het rootbestandssysteem. Aan deze verdeling zijn bepaalde regels verbonden. Heb je je ooit afgevraagd waarom sommige programma's in /bin, of /sbin, /usr/sbin, /usr/local/bin staan, wat is het verschil tussen deze mappen?

Het less-programma bevindt zich bijvoorbeeld in de directory /usr/bin, maar waarom niet in /sbin of /usr/sbin. En programma's zoals ifconfig of fdisk staan ​​in de /sbin directory en nergens anders.

Dit artikel behandelt de structuur van het Linux-bestandssysteem volledig. Na het te hebben gelezen, zult u de betekenis van het gebruik van de meeste mappen in de Linux-hoofdmap kunnen begrijpen.

/ - wortel

Dit is de hoofdmap op een Linux-systeem. In feite is dit het Linux-bestandssysteem. Er zijn geen schijven of iets dergelijks in Windows. In plaats daarvan beginnen de adressen van alle bestanden met de root en zijn extra partities, flashdrives of optische schijven verbonden met de mappen van de rootdirectory.

Merk op dat de rootgebruiker een homedirectory van /root heeft, maar niet / zelf.

/bin - (binaire bestanden) binaire bestanden van gebruikers

Deze map bevat uitvoerbare bestanden. Hier zijn programma's die kunnen worden gebruikt in de modus voor één gebruiker of in de herstelmodus. Kortom, de hulpprogramma's die kunnen worden gebruikt, zijn nog niet verbonden met de /usr/-directory. Dit zijn veelvoorkomende commando's zoals cat, ls, tail, ps, etc.

/sbin - (systeembinaire bestanden) systeembinaire bestanden

Net als /bin bevat het binaire uitvoerbare bestanden die vroeg in het opstartproces beschikbaar zijn wanneer de map /usr niet is aangekoppeld. Maar hier zijn programma's die alleen kunnen worden uitgevoerd met superuser-rechten. Dit zijn verschillende hulpprogramma's voor systeemonderhoud. Bijvoorbeeld iptables, reboot, fdisk, ifconfig, swapon, etc.

/etc - (etcetera) configuratiebestanden

Deze map bevat configuratiebestanden voor alle programma's die op het systeem zijn geïnstalleerd.

Naast configuratiebestanden zijn er in het initialisatiesysteem Init Scripts scripts voor het starten en beëindigen van systeemdaemons, het aankoppelen van bestandssystemen en het automatisch laden van programma's. De linux-directorystructuur in deze map kan een beetje verwarrend zijn, maar het doel van al deze mappen is setup en configuratie.

/dev - (apparaten) apparaatbestanden

In Linux is alles, inclusief externe apparaten, bestanden. Alle aangesloten flashdrives, toetsenborden, microfoons en camera's zijn dus gewoon bestanden in de /dev/-directory. Deze map bevat een ongebruikelijk bestandssysteem. De structuur van het Linux-bestandssysteem en de bestanden in de map /dev worden bij het opstarten van het systeem geïnitialiseerd door de udev-service. Alle aangesloten apparaten worden gescand en er worden speciale bestanden voor gemaakt. Dit zijn apparaten zoals: /dev/sda, /dev/sr0, /dev/tty1, /dev/usbmon0, etc.

/proc - (proces) procesinformatie

Dit is ook een ongebruikelijk bestandssysteem, maar een subsysteem dat dynamisch door de kernel wordt gecreëerd. Het bevat alle informatie over het uitvoeren van processen in realtime. In wezen is dit een pseudo-bestandssysteem met gedetailleerde informatie over elk proces, de Pid, ​​de naam van het uitvoerbare bestand, startopties, toegang tot RAM, enzovoort. U kunt hier ook informatie vinden over het gebruik van systeembronnen, zoals /proc/cpuinfo, /proc/meminfo of /proc/uptime. Naast de bestanden in deze map is er een grote linux-mappenstructuur waaruit u veel informatie over het systeem kunt vinden.

/var (variabele) - Variabele bestanden

De naam van de /var directory spreekt voor zich, het zou bestanden moeten bevatten die regelmatig veranderen. Deze bestanden worden steeds groter. Het bevat systeemlogbestanden, verschillende caches, databases, enzovoort. Overweeg vervolgens de toewijzing van Linux-mappen in de /var/-map.

/var/log - Logbestanden

/var/lib - databases

Een ander type bestanden dat wordt gewijzigd, zijn databasebestanden, pakketten die zijn opgeslagen door de pakketbeheerder, enzovoort.

/var/mail - mail

De mailserver slaat alle ontvangen of verzonden e-mails op in deze map, de logs en configuratiebestanden kunnen hier ook worden gevonden.

/var/spool - printer

Aanvankelijk was deze map verantwoordelijk voor de printwachtrijen op de printer en de werking van de cpus-set van programma's.

/var/lock - bestanden vergrendelen

Hier zijn de vergrendelingsbestanden. Deze bestanden betekenen dat een bepaalde bron, bestand of apparaat bezet is en niet door een ander proces kan worden gebruikt. Apt-get vergrendelt bijvoorbeeld zijn database zodat andere programma's deze niet kunnen gebruiken terwijl het programma ermee werkt.

/var/run - PID van processen

Bevat bestanden met proces-PID's die kunnen worden gebruikt om tussen programma's te communiceren. In tegenstelling tot de map /run blijven gegevens behouden tijdens het opnieuw opstarten.

/tmp (temp) - Tijdelijke bestanden

Deze map bevat tijdelijke bestanden die zijn gemaakt door het systeem, programma's of gebruikers. Alle gebruikers hebben schrijftoegang tot deze directory.

De bestanden worden bij elke herstart verwijderd. De analoog van Windows is de map Windows \ Temp, hier worden ook alle tijdelijke bestanden opgeslagen.

/usr - (gebruikerstoepassingen) Gebruikersprogramma's

Dit is de grootste catalogus met veel functies. Dit is de grootste Linux-directorystructuur. Hier vindt u uitvoerbare bestanden, programmabronnen, verschillende toepassingsbronnen, afbeeldingen, muziek en documentatie.

/usr/bin/ - Uitvoerbare bestanden

Bevat uitvoerbare bestanden van verschillende programma's die niet nodig zijn in de eerste fasen van het opstarten van het systeem, bijvoorbeeld muziekspelers, grafische editors, browsers, enzovoort.

/usr/sbin/

Bevat binaire bestanden voor systeembeheerprogramma's die als root moeten worden uitgevoerd. Bijvoorbeeld, zoals Gparted, sshd, useradd, userdel, etc.

/usr/lib/ - Bibliotheken

Bevat bibliotheken voor programma's in /usr/bin of /usr/sbin.

/usr/local - Gebruikersbestanden

Bevat bestanden van programma's, bibliotheken en instellingen die door de gebruiker zijn gemaakt. Programma's die zijn gecompileerd en geïnstalleerd op basis van bronnen en met de hand geschreven scripts kunnen hier bijvoorbeeld worden opgeslagen.

/home - Thuismap

Deze map bevat de homedirectories van alle gebruikers. Daarin kunnen ze hun persoonlijke bestanden, programma-instellingen, enz. opslaan. Bijvoorbeeld /home/sergiy, enz. In vergelijking met Windows is dit uw gebruikersmap op station C, maar in tegenstelling tot WIndows bevindt home zich meestal in een aparte sectie, dus wanneer u het systeem opnieuw installeert, worden al uw gegevens en programma-instellingen opgeslagen.

/boot - Bootloader-bestanden

Bevat alle bestanden die zijn gekoppeld aan de systeem-bootloader. Dit zijn de vmlinuz-kernel, de initrd-afbeelding en de bootloader-bestanden die in de map /boot/grub staan.

/lib (bibliotheek) - Systeembibliotheken

Bevat systeembibliotheekbestanden die worden gebruikt door uitvoerbare bestanden in de mappen /bin en /sbin.

Bibliotheken hebben bestandsnamen met de extensie *.so en beginnen met het prefix lib*. Bijvoorbeeld libncurses.so.5.7. De map /lib64 op 64-bits systemen bevat 64-bits versies van bibliotheken van /lib. Deze map is te vergelijken met WIndows\system32, alle systeembibliotheken worden daar ook geladen, alleen daar worden ze gemengd met uitvoerbare bestanden, maar hier is alles gescheiden.

/opt (Optionele toepassingen) - Extra programma's

In deze map worden eigen programma's, games of stuurprogramma's geïnstalleerd. Dit zijn programma's die door de fabrikanten zelf als afzonderlijke uitvoerbare bestanden zijn gemaakt. Dergelijke programma's worden geïnstalleerd in de /opt/-submappen, ze lijken erg op Windows-programma's, alle uitvoerbare bestanden, bibliotheken en configuratiebestanden bevinden zich in dezelfde map.

/mnt (mount) - Mount

Systeembeheerders kunnen externe of aanvullende bestandssystemen aan deze map koppelen.

/media - Verwisselbare media

In deze map koppelt het systeem alle aangesloten externe schijven - USB-flashstations, optische schijven en andere opslagmedia.

/srv (server) - Server

Deze map bevat de server- en servicebestanden. De apache-webserverbestanden kunnen bijvoorbeeld ingesloten zijn.

/run - processen

Een andere map die proces-PID-bestanden bevat, vergelijkbaar met /var/run, maar anders dan deze, bevindt deze zich in TMPFS en daarom gaan na een herstart alle bestanden verloren.

/sys (systeem) - Systeeminformatie

Het doel van de Linux-mappen in deze map is om systeeminformatie rechtstreeks uit de kernel te halen. Dit is een ander bestandssysteem dat door de kernel wordt georganiseerd en waarmee je veel parameters voor systeemwerking kunt bekijken en wijzigen, bijvoorbeeld de werking verwisselen, ventilatoren aansturen en nog veel meer.

Verduisteraars

debuggers

Debugger of debugger(Engelse debugger) is een ontwikkelomgevingsmodule of een afzonderlijke applicatie die is ontworpen om fouten in het programma te vinden. Met de debugger kunt u door de tracering gaan, de waarden van variabelen bewaken, instellen of wijzigen tijdens de uitvoering van het programma, breekpunten of onderbrekingscondities instellen en verwijderen, enzovoort.

Verduistering(van het Latijn obfuscare - naar obscure, obscure; en Engels obfuscate - om niet voor de hand liggend, verwarrend, verwarrend te maken) of code verduistering - de brontekst of uitvoerbare code van het programma in een vorm brengen die zijn functionaliteit behoudt, maar het moeilijk maakt om de werkingsalgoritmen en modificaties tijdens decompilatie te analyseren, te begrijpen.

« verduistering»code kan geïmplementeerd worden op het niveau van algoritme, broncode en/of assembler. Om versluierde assembler-tekst te maken, kunnen gespecialiseerde compilers worden gebruikt die niet voor de hand liggende of niet-gedocumenteerde functies van de programma-uitvoeringsomgeving gebruiken. Er zijn ook speciale programma's die verduistering uitvoeren, de zogenaamde verduisteraars.

Uitvoerbare (uitvoerbare) module, uitvoerbaar bestand (Engels uitvoerbaar bestand)- een bestand dat een programma bevat in een vorm waarin het (na te zijn geladen in het geheugen en lokaal geconfigureerd) kan worden uitgevoerd door een computer.

Meestal bevat het een binaire weergave van machine-instructies voor een bepaalde processor (om deze reden wordt in programmeertaal het woord binair gebruikt), maar het kan ook instructies in een geïnterpreteerde programmeertaal bevatten, waarvoor een tolk uit te voeren. Met betrekking tot dit laatste wordt vaak de term "script" gebruikt.

Binaire bestanden worden uitgevoerd door in hardware en software geïmplementeerde machines. De eerste omvatten processors, bijvoorbeeld de x86- of SPARC-families. De tweede zijn virtuele machines, zoals de virtuele Java-machine of het .NET Framework. Het formaat van een binair bestand wordt bepaald door de architectuur van de machine die het uitvoert. Bekende machines zijn zowel in hardware als software geïmplementeerd, bijvoorbeeld processors van de x86-familie en de virtuele VMware-machine.

De uitvoerbaarheidsstatus van een bestand wordt meestal bepaald door geaccepteerde conventies. In sommige besturingssystemen worden uitvoerbare bestanden dus herkend vanwege de bestandsnaamconventie (bijvoorbeeld door de bestandsextensie - . exe of. bin), terwijl in andere uitvoerbare bestanden specifieke metadata hebben (zoals het uitvoerpermissiebit op UNIX-achtige besturingssystemen).

In moderne computerarchitecturen bevatten uitvoerbare bestanden grote hoeveelheden gegevens die geen computerprogramma zijn: een beschrijving van de softwareomgeving waarin het programma kan worden uitgevoerd, gegevens voor het debuggen van het programma, gebruikte constanten, gegevens die het besturingssysteem mogelijk nodig heeft start het proces (bijvoorbeeld de aanbevolen stapelgroottes), en zelfs beschrijvingen van de vensterstructuren van het grafische subsysteem die door het programma worden gebruikt.



Vaak bevatten uitvoerbare bestanden oproepen naar bibliotheekfuncties, zoals oproepen naar functies van het besturingssysteem. Dus, samen met processorafhankelijkheid (elk binair uitvoerbaar bestand dat machinecode bevat, is machineafhankelijk), kunnen uitvoerbare bestanden worden gekenmerkt door afhankelijkheid van de versie van het besturingssysteem en zijn componenten.

PE-bestandsstructuur

Algemene beschrijving van het PE-bestand

Het oplossen van een breed scala aan programmeertaken vereist kennis van de interne structuur van uitvoerbare bestanden en inzicht in hoe ze in het geheugen worden geladen.

In alle 32-bits takken van Windows OS worden object (.OBJ), bibliotheek (.LIB) en uitvoerbare (.EXE en .DLL) bestanden opgeslagen in een enkele COFF-indeling (Common Object File Format), die door sommigen wordt gebruikt. systemen van de Unix-familie en OS VMS.

Het PE-formaat (Portable Executable) is een COFF-specialisatie voor het opslaan van uitvoerbare modules. Het werd in 1993 gestandaardiseerd door de Tool Interface Standard Committee (Microsoft, Intel, IBM, Borland, Watcom, enz.) en is sindsdien beetje bij beetje bijgewerkt (de laatste update die ik ken was in februari 1999, maar bevat geen metadata-ondersteuning voor .NET toegevoegd in 2000). De naam Portable Executable is te danken aan het feit dat dit formaat niet afhankelijk is van de architectuur van de processor waarvoor het uitvoerbare bestand is gebouwd.

Er zijn momenteel twee PE-bestandsindelingen: PE32 en PE32+. Beiden beperken de programma-adresruimte tot 4 GB (0xFFFFFFFF), maar PE32 gebruikt 32-bits adressen (Win32-architectuur) en PE32+ gebruikt 64-bits adressen (Win64-architectuur).

De meeste van de hieronder beschreven structuren en constanten bevinden zich in het standaard Windows-headerbestand WINNT.H.

Elk PE-bestand bestaat uit verschillende koppen en verschillende (van 1 tot 96) secties. Headers bevatten service-informatie die verschillende eigenschappen van het uitvoerbare bestand en de structuur ervan beschrijft. Secties bevatten gegevens die in de adresruimte van het proces worden geplaatst wanneer het uitvoerbare bestand in het geheugen wordt geladen.

PE-bestanden zijn bestanden met relatief laden, d.w.z. theoretisch kan worden geplaatst in de adresruimte 0x00000000 - 0xFFFFFFFF vanaf elk adres, het basisadres genoemd. Aangezien het basisadres niet vooraf bekend is, is de structuur van PE-bestanden gebaseerd op het concept van RVA (relatief virtueel adres, relatief virtueel adres). RVA is de offset van het basisadres van het uitvoerbare bestand naar het opgegeven adres. Met andere woorden, om het lineaire adres in het virtuele geheugen van het proces te krijgen, voegt u RVA toe aan het basisadres.

Er moet vooral worden benadrukt dat RVA's niets te maken hebben met offsets ten opzichte van het begin van het bestand. Tijdens het laden van een bestand wordt elk van zijn secties in het geheugen geplaatst vanuit zijn eigen RVA en, indien nodig, opgevuld met nullen tot de opgegeven grootte. In dit geval zijn de RVA-sectie en de grootte in het geheugen in het algemeen op geen enkele manier gerelateerd aan de locatie en grootte in het bronbestand.

De algemene structuur van een PE-bestand wordt weergegeven in Tabel 2.1:

Tabel 2.1 - Structuur van het re-bestand

Elk van deze structuren wordt hieronder in detail beschreven.

Algemene beschrijving van de DOS-header en stub

Omdat zowel DOS-toepassingen als Windows-toepassingen de extensie .EXE hebben, gebruiken alle uitvoerbare bestanden van Windows het dual-boot-schema. Het bestaat uit het feit dat het bestand begint met een DOS-header, gevolgd door een stub (stub), d.w.z. een klein DOS-geformatteerd EXE-bestand. Wanneer u probeert een bestand vanuit DOS te laden, wordt een stub uitgevoerd en wanneer een bestand vanuit Windows wordt geladen, ontleedt de lader de DOS-header en extraheert daaruit de offset naar de echte header van het uitvoerbare bestand.

b De DOS-headerstructuur wordt IMAGE_DOS_HEADER genoemd. Ik zal de DOS-header niet volledig beschrijven, omdat: we zijn daarin alleen geïnteresseerd in twee velden, namelijk:

ь 2-byte (WORD) handtekening op offset 0 (e_magic) en gelijk aan "MZ" (IMAGE_DOS_SIGNATURE);

ь 4-byte (DWORD) offset vanaf het begin van het bestand naar de PE-header, gelegen op offset 0x3C (e_lfanew).

Wanneer u een PE-bestand laadt, moet u eerst de DOS-handtekening controleren, vervolgens de offset naar de PE-header zoeken en vervolgens de PE-handtekening aan het begin van de koptekst controleren. Deze handtekening bestaat uit 4 bytes en is gelijk aan "PE" (IMAGE_NT_SIGNATURE aanduiding).

Andere bestanden (uitvoerbare bestanden van Win16 en OS/2 en Windows 9x VxD-stuurprogramma's) gebruiken hetzelfde dual-boot-schema, dus controleren of de PE-handtekening correct is, is een must.

Normaal gesproken zal de DOS-stub een bericht weergeven als "Dit programma vereist Microsoft Windows" en afsluiten. Bij het bouwen van een programma kunnen we echter elk DOS EXE-bestand op de opdrachtregel van de bouwer specificeren als een stub. Hiermee kunt u "dubbele" programma's maken die zowel in DOS als Windows werken.

DOS-headerstructuur

typedef struct _IMAGE_DOS_HEADER ( // DOS.EXE header

USHORT e_magie; // Magisch nummer

USHORT e_cblp; // Aantal bytes op de laatste pagina van het bestand

USHORT e_cp; // Aantal pagina's in het bestand

USHORT e_crlc; // Locaties

USHORT e_cparhdr; // Kopgrootte in alinea's

USHORT e_minalloc; // Minimaal extra paragrafen nodig

USHORT e_maxalloc; // Maximaal aantal extra alinea's nodig

USHORT e_ss; // Initiële (relatieve) waarde van het SS-register

USHORT e_sp; // Beginwaarde van het SP-register

USHORT e_csum; // Controleer som

USHORT e_ip; // Initiële IP-registerwaarde

USHORT e_cs; // Initiële (relatieve) waarde van het CS-register

USHORT e_lfarlc; // Adres in bestand naar doorstuurtabel

USHORT e_ovno; // Aantal overlays

USHORT e_res; // Gereserveerd

USHORT e_oemid; // OEM-ID (voor e_oeminfo)

USHORT e_oeminfo; // OEM-informatie; e_oemid specifiek

USHORT e_res2 ; // Gereserveerd

LANG e_lfanew; // Adres in bestand van nieuwe .exe-header

) IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

Het belangrijkste veld hier is e_lfanew, dat een offset van 4 bytes bevat vanaf het begin van het bestand naar de PE-header. Het eerste veld van de e_magic-structuur bevat de handtekening van het uitvoerbare bestand. Alle MS-DOS-compatibele uitvoerbare bestanden hebben de handtekening 0x54AD, die in ASCII-tekens wordt weergegeven door twee MZ-tekens. Om deze reden wordt de DOS-header vaak de MZ-header genoemd.

Koptekst PE-structuur

De PE-header (IMAGE_NT_HEADERS) bestaat uit drie delen (zie tabel 2.2):

Tabel 2.2 - Headerstructuur

struct IMAGE_NT_HEADERS (

DWORD-handtekening;

IMAGE_FILE_HEADER Bestandskop;

IMAGE_OPTIONAL_HEADER Optionele koptekst;

De PE-header begint altijd met een 4-byte "PE"-handtekening (IMAGE_NT_SIGNATURE). Het wordt gevolgd door twee headers: een bestandsheader (IMAGE_FILE_HEADER) en een optionele header (IMAGE_OPTIONAL_HEADER). Ondanks zijn naam is IMAGE_OPTIONAL_HEADER altijd aanwezig in een PE-bestand (het is optioneel in termen van het algemene COFF-formaat, omdat het niet wordt gebruikt in object- en bibliotheekbestanden).

Bestandskop

De bestandsheader bestaat uit 0x14 bytes (definitie image_SIZEOF_FILE_HEADER), wordt direct na de handtekening geplaatst en bevat een algemene beschrijving van het bestand. Het bestaat uit de volgende velden:

Tabel 2.3 - Structuur van de bestandskop

Beschrijving van het doel van de velden.

Machineveld

Een 16-bits getal dat de processorarchitectuur aangeeft waarop dit programma kan draaien.

TijdDateStempel veld

Een 32-bits nummer dat de datum en tijd bevat waarop het bestand is gemaakt. Het formaat van dit veld is niet gedocumenteerd, maar de Microsoft-verzamelaars voeren de tijd hier in als het aantal seconden sinds 01/01/1970 middernacht in UTC (d.w.z. ze gebruiken het Unix-tijdformaat dat wordt geretourneerd door de tijdfunctie van de C-taal). Dit betekent overigens dat de huidige stand van het PE-formaat slechts geldig is tot 18/01/2038.

Aangezien het formaat van dit veld niet gedocumenteerd is, slaan sommige externe assembleurs de waarde op in andere formaten. Dit kan belangrijk zijn omdat: dit veld wordt gebruikt bij het dynamisch koppelen van importen vanuit een DLL.

Velden PointerToSymbolTable en NumberOfSymbols

Volgens de COFF-standaard moeten deze velden van 4 bytes toegang bieden tot foutopsporingsinformatie in het bestand. Alle verzamelaars die ik ken, plaatsen er echter nullen in en er wordt een andere methode gebruikt om toegang te krijgen tot debug-informatie (zie de debug-informatiecatalogus).

VeldgrootteOfOptionalHeader

Een 16-bits getal dat de grootte van de optionele header aangeeft. Het is 0xE0 voor PE32-bestanden (IMAGE_SIZEOF_NT_OPTIONAL32_HEADER) en 0xF0 voor PE32+-bestanden (IMAGE_SIZEOF_NT_OPTIONAL64_HEADER).

Veld Eigenschappen

Een 16-bits vlaggenveld dat de COFF-kenmerken van het bestand bevat.

Optionele titel

De optionele header heeft twee verschillende formaten: voor PE32 en voor PE32+. De corresponderende structuren heten IMAGE_OPTIONAL_HEADER32 en IMAGE_OPTIONAL_HEADER64. Hun velden zijn samengevat in tabel 2.4:

Tabel 2.4 - Optionele kopstructuur

Offset (hex, PE32/PE32+)

Maat (PE32/PE32+)

Soort (PE32/PE32+)

Naam

Beschrijving

kop handtekening.

MajorLinkerVersie

Het hoogste cijfer van het versienummer van de assembler. De lader wordt niet gebruikt.

MinorLinkerVersie

Het lage cijfer van het versienummer van de bouwer. De lader wordt niet gebruikt.

De som van de groottes van alle secties die programmacode bevatten.

SizeOfInitializedData

De som van de grootten van alle secties die geïnitialiseerde gegevens bevatten.

Grootte van niet-geïnitialiseerde gegevens

De som van de grootten van alle secties die niet-geïnitialiseerde gegevens bevatten.

AddressOfEntryPoint

Startpunt van het RVA-programma. Voor een driver is dit het DriverEntry-adres; voor een DLL is dit het DllMain-adres of nul.

RVA van het begin van de programmacode.

RVA start data programma. Niet-vertrouwd veld, niet gebruikt door loader. Niet beschikbaar in PE32+!

Het voorkeursbasisadres van het programma in het geheugen, in veelvouden van 64 KB. De standaardwaarde is 0x00400000 voor EXE-bestanden op Windows 9x/NT, 0x00010000 voor EXE-bestanden op Windows CE en 0x10000000 voor DLL's. Door het programma vanaf dit adres te downloaden, hoeft u geen adressen meer te configureren.

Sectie-uitlijning

Byte-uitlijning voor secties wanneer geladen in het geheugen, groter dan of gelijk aan FileAlignment. De standaardwaarde is gelijk aan de paginagrootte van het virtuele geheugen voor de gegeven processor.

Byte-uitlijning voor secties binnen een bestand. Moet een macht van 2 zijn tussen 512 en 64 KB inclusief. De standaardwaarde is 512. Als SectionAlignment kleiner is dan de paginagrootte van het virtuele geheugen, moet FileAlignment hiermee overeenkomen.

MajorOperatingSystemVersion

Het meest significante cijfer van het versienummer van het besturingssysteem. De lader wordt niet gebruikt.

MinorOperatingSystemVersion

Het kleine cijfer van het versienummer van het besturingssysteem. De lader wordt niet gebruikt.

MajorImageVersie

Het eerste cijfer van het versienummer van dit bestand. De lader wordt niet gebruikt.

MinorImageVersie

Het lage cijfer van het versienummer van dit bestand. De lader wordt niet gebruikt.

MajorSubsystemVersie

Het hoge cijfer van het versienummer van het subsysteem.

MinorSubsysteemVersie

Het lage cijfer van het versienummer van het subsysteem.

Win32VersieWaarde

Gereserveerd, altijd 0.

De grootte van het bestand in het geheugen, inclusief alle headers. Moet een veelvoud zijn van SectionAlignment.

De totale grootte van de DOS-header en stub, PE-header en sectieheaders, uitgelijnd met de FileAlignment-grens. Specificeert de offset vanaf het begin van het bestand tot de eerste sectiegegevens.

De controlesom van het bestand.

Het Windows-uitvoeringssubsysteem voor dit bestand.

DllKenmerken

Aanvullende bestandskenmerken.

GrootteVanStackReserve

De grootte van de opstartthreadstack van het programma, in bytes virtueel geheugen. Bij het laden in het fysieke geheugen worden alleen SizeOfStackCommit-bytes weergegeven, daarna wordt één pagina met virtueel geheugen later weergegeven. De standaardwaarde is 1 MB.

SizeOfStackCommit

De initiële grootte van de programma-stack in bytes. De standaardwaarde is 4 KB.

GrootteVanHeapReserve

De grootte van de programmaheap in bytes. Bij het laden in het fysieke geheugen worden alleen SizeOfHeapCommit-bytes weergegeven, daarna wordt één pagina met virtueel geheugen later weergegeven. De standaardwaarde is 1 MB. Op alle 32-bits versies van Windows wordt de heap alleen beperkt door de grootte van het virtuele geheugen, en dit veld lijkt te worden genegeerd.

SizeOfHeapCommit

De initiële grootte van de heap van het programma, in bytes. De standaardwaarde is 4 KB.

Verouderd veld, niet gebruikt.

AantalRvaAndMaten

Het aantal beschrijvingen van gegevensdirectory's. Momenteel is het altijd 16.

IMAGE_DATA_DIRECTORY

Beschrijvingen van gegevensdirectory's.

Een 16-bits veld dat de handtekening van de koptekst bevat. Kan waarden aannemen (zie tabel 2.4):

Tabel 2.4 - Geldige waarden van het Magische veld

MajorSubsystemVersion en MinorSubsystemVersion velden

Een 16-bits getal dat de verwachte versie van Windows aangeeft. In tegenstelling tot alle andere velden met versienummers, werd dit veld geanalyseerd bij het laden van programma's in NT 4.0 en 95. met name het ontbreken van driedimensionale dialoogstijlen, enz.). Momenteel ongebruikt en bijna altijd gelijk aan 4.0.

Veld Controlesom

32-bits controlesom van het bestand. Alleen gecontroleerd op Windows NT bij het laden van kernelstuurprogramma's en verschillende systeem-DLL's. Het algoritme voor het berekenen van de checksum is niet gedocumenteerd, maar u kunt de systeemfunctie CheckSumMappedFile uit de bibliotheek IMAGEHLP.DLL gebruiken om het te berekenen.

Subsysteem veld

Een 16-bits getal dat aangeeft op welk Windows API-subsysteem dit bestand moet worden uitgevoerd. De mogelijke waarden worden weergegeven in tabel 2.5:

Tabel 2.5 - Geldige waarden van het veld Subsysteem

Naam

Betekenis

subsysteem

IMAGE_SUBSYSTEM_UNKNOWN

onbekend subsysteem.

IMAGE_SUBSYSTEM_NATIVE

Het subsysteem is niet vereist, wordt gebruikt door stuurprogramma's en native NT-toepassingen.

IMAGE_SUBSYSTEM_WINDOWS_GUI

Windows grafisch subsysteem.

IMAGE_SUBSYSTEM_WINDOWS_CUI

Windows-console-subsysteem.

IMAGE_SUBSYSTEM_OS2_CUI

OS/2 console-subsysteem.

IMAGE_SUBSYSTEM_POSIX_CUI

Het POSIX-consolesubsysteem.

IMAGE_SUBSYSTEM_NATIVE_WINDOWS

"Native" Win 9x-stuurprogramma.

IMAGE_SUBSYSTEM_WINDOWS_CE_GUI

Grafisch subsysteem Windows CE.

IMAGE_SUBSYSTEM_EFI_APPLICATION

EFI-programma.

IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER

Een EFI-stuurprogramma dat een opstartservice biedt.

IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER

Runtime EFI-stuurprogramma.

IMAGE_SUBSYSTEM_EFI_ROM

Firmware-ROM voor EFI.

IMAGE_SUBSYSTEM_XBOX

Xbox-subsysteem.

DLL Karakteristieken veld

Een 16-bits vlagveld dat aanvullende bestandskenmerken specificeert. Mogelijke vlagwaarden worden weergegeven in tabel 2.6.

Tabel 2.6 - Mogelijke waarden van de vlaggen van het veld DLLCharacteristics

Velden NumberOfRvaAndSizes en DataDirectory

Aan het einde van de optionele header staat een 32-bits nummer dat het aantal informatiemapbeschrijvingen opslaat. Het wordt gevolgd door een reeks descriptoren zelf, die er elk als volgt uitzien:

struct IMAGE_DATA_DIRECTORY (

DWORD virtueel adres;

Momenteel bevat het veld NumberOfRvaAndSizes altijd het getal 16 (symbolische naam IMAGE_NUMBEROF_DIRECTORY_ENTRIES). Dienovereenkomstig bestaat de DataDirectory-array ook uit 16 descriptors. Elke descriptor bevat de RVA en grootte voor één gegevensdirectory. Als er geen map in het bestand is, zijn beide velden van de descriptor gelijk aan nul.

Elk van de datacatalogi bevat bepaalde service-informatie. Het type van deze informatie wordt bepaald door het directorynummer in de reeks descriptors. Aangezien gegevensmappen zich meestal in secties bevinden, zullen we, om toegang te krijgen tot hun inhoud, eerst de structuur van secties moeten onderzoeken.

Sectiekoppen

Direct na de PE-header in het bestand staat een array van sectieheaders. De grootte wordt gespecificeerd door het veld NumberOfSections van de bestandskop. Elke sectiekop bestaat uit 0x28 bytes en heeft de volgende structuur (zie tabel 2.7):

Tabel 2.7 - Sectiekopstructuur

Offset (hex)

Naam

Beschrijving

Sectie naam.

diversen Virtuele Grootte

Sectiegrootte in het geheugen. Als deze waarde groter is dan SizeOfRawData, wordt de sectie in het geheugen opgevuld met null-bytes.

RVA-secties in het geheugen.

Sectiegrootte in het bestand. Altijd een veelvoud van de FileAlignment van de optionele header. Als de sectie alleen niet-geïnitialiseerde gegevens bevat, is dit veld nul.

PointerToRawData

De offset in het bestand voor het begin van deze secties. Altijd een veelvoud van de FileAlignment van de optionele header. Als de sectie alleen niet-geïnitialiseerde gegevens bevat, is dit veld nul.

PointerToVerhuizingen

PointerToLinenummers

In uitvoerbare bestanden is dit veld altijd nul.

AantalVerhuizingen

In uitvoerbare bestanden is dit veld altijd nul.

AantalLijnnummers

In uitvoerbare bestanden is dit veld altijd nul.

Eigenschappen

sectie attributen.

Sectie naam

De sectienaam bevat 0 tot 8 ASCII-tekens. In plaats van de constante 8 kunt u de definitie IMAGE_SIZEOF_SHORT_NAME gebruiken. Als de lengte van de naam minder dan 8 tekens is, wordt deze opgevuld met null-bytes. Als het uit precies 8 tekens bestaat, is er geen afsluitende nulbyte. Het is belangrijk op te merken dat de titel van een sectie in het algemeen niets te maken heeft met de inhoud ervan. Elke compiler gebruikt zijn eigen naamgevingsconventie voor secties, dus u kunt niet vertrouwen op de naam van een sectie bij het ontleden. De enige betrouwbare manier om te bepalen wat een bepaalde sectie bevat, is door de attributen en de gegevensdirectory's ervan te onderzoeken.

Sectie-attributen

Het 32-bits veld Eigenschappen bevat een set vlaggen die de inhoud van deze sectie beschrijven. Secties van een uitvoerbaar bestand kunnen de volgende kenmerken hebben (zie Tabel 2.8):

Tabel 2.8 - Sectie-attributen

Naam

Betekenis

Beschrijving

IMAGE_SCN_CNT_CODE

De sectie bevat de uitvoerbare code.

IMAGE_SCN_CNT_INITIALIZED_DATA

De sectie bevat geïnitialiseerde gegevens.

IMAGE_SCN_CNT_UNINITIALIZED_DATA

De sectie bevat niet-geïnitialiseerde gegevens.

IMAGE_SCN_MEM_DISCARDABLE

De sectie kan uit het geheugen worden verwijderd nadat het proces is gemaakt.

IMAGE_SCN_MEM_NOT_CACHED

De sectie kan niet in de cache worden opgeslagen.

IMAGE_SCN_MEM_NOT_PAGED

De sectie kan niet worden uitgewisseld naar het wisselbestand.

IMAGE_SCN_MEM_SHARED

Alle kopieën van een bepaald bestand kunnen één gemeenschappelijk exemplaar van deze sectie hebben. Blijkbaar alleen gebruikt voor gegevenssecties van dynamische bibliotheken.

IMAGE_SCN_MEM_EXECUTE

De sectie kan worden uitgevoerd als programmacode.

IMAGE_SCN_MEM_READ

IMAGE_SCN_MEM_WRITE

U kunt naar de sectie schrijven.

De secties zelf bevinden zich in het bestand na alle sectiekoppen. Elke sectie wordt uitgelijnd op een FileAlignment-grens van een optionele koptekst.

Bij het analyseren van de inhoud van secties moet er rekening mee worden gehouden dat deze inhoud heterogeen kan zijn. Een sectie kan bijvoorbeeld zowel uitvoerbare code als een importtabel bevatten.

2.1 Bestanden

Vereisten voor informatieopslag:

    de mogelijkheid om grote hoeveelheden gegevens op te slaan

    informatie moet worden bewaard na beëindiging van het proces

    meerdere processen moeten gelijktijdig toegang hebben tot informatie

2.1.1 Bestandsnaamgeving

De lengte van de bestandsnaam is afhankelijk van het besturingssysteem en kan van 8 (MS-DOS) tot 255 (Windows, LINUX) tekens zijn.

Besturingssystemen kunnen onderscheid maken tussen hoofdletters en kleine letters. WINDOWS en windows voor MS-DOS zijn bijvoorbeeld hetzelfde, maar voor UNIX zijn het verschillende bestanden.

Op veel besturingssystemen bestaat de bestandsnaam uit twee delen gescheiden door een punt, zoals windows.exe. Het gedeelte na de punt heet bestandsextensie. Op basis daarvan onderscheidt het systeem het bestandstype.

MS-DOS heeft een extensie van 3 tekens. Volgens dit maakt het systeem onderscheid tussen het type bestand en kan het ook worden uitgevoerd of niet.

UNIX heeft een extensie die beperkt is tot 255 tekens in de bestandsnaam, en UNIX kan meerdere extensies hebben, maar extensies worden meer gebruikt door toepassingsprogramma's dan door het besturingssysteem. Bij uitbreiding kan UNIX niet bepalen of het een uitvoerbaar bestand is of niet.

2.1.2 Bestandsstructuur

Drie hoofdbestandsstructuren:

    Bytereeks- Het besturingssysteem is niet geïnteresseerd in de inhoud van het bestand, het ziet alleen de bytes. Het grote voordeel van een dergelijk systeem is de flexibiliteit in gebruik. Gebruikt op Windows en UNIX.

    Volgorde van records- Records met een vaste lengte (bijv. ponskaart) worden sequentieel gelezen. Nu niet gebruikt.

    Opnameboom- elk record heeft een sleutel, de records worden gelezen door de sleutel. Het grote voordeel van een dergelijk systeem is de zoeksnelheid. Nog steeds in gebruik op mainframes.

Drie soorten bestandsstructuren.

2.1.3 Bestand types

Belangrijkste bestandstypen:

    Normaal- gebruikersinformatie bevatten. Gebruikt op Windows en UNIX.

    Catalogi- systeembestanden die de structuur van het bestandssysteem ondersteunen. Gebruikt op Windows en UNIX.

    Symbolisch- voor input-output simulatie. Alleen gebruikt op UNIX.

    Blok- voor schijfmodellering. Alleen gebruikt op UNIX.

Belangrijkste soorten reguliere bestanden:

    ASCII-bestanden- bestaan ​​uit tekststrings. Elke regel eindigt met een regelterugloop (Windows), een regelinvoer (UNIX) en beide (MS-DOS). Daarom, als u een tekstbestand opent dat is geschreven in UNIX op Windows, dan zullen alle regels samenvloeien tot één grote regel, maar onder MS-DOS zullen ze niet samenvoegen ( dit is een vrij veel voorkomende situatie.). Belangrijkste voordelen van ASCII-bestanden:
    - kan op het scherm worden weergegeven en zonder conversie naar de printer worden uitgevoerd
    - kan door bijna elke editor worden bewerkt

    binaire bestanden- andere bestanden (geen ASCII). In de regel hebben ze een interne structuur.

De belangrijkste soorten binaire bestanden zijn:

    Uitvoerbaar- programma's, ze kunnen worden verwerkt door het besturingssysteem zelf, hoewel ze worden geschreven als een reeks bytes.

    Niet-uitvoerbaar- ander.

Voorbeelden van uitvoerbare en niet-uitvoerbare bestanden

"Magisch nummer"- het bestand als uitvoerbaar identificeren.

2.1.4 Toegang tot bestanden

Belangrijkste soorten bestandstoegang:

    Consistent- bytes worden in volgorde gelezen. Gebruikt toen er magneetbanden waren.

2.1.5 Bestandskenmerken

Belangrijkste bestandskenmerken:

    Beveiliging - wie en hoe heeft toegang tot het bestand (gebruikers, groepen, lezen/schrijven). Gebruikt op Windows en UNIX.

    Wachtwoord - wachtwoord voor het bestand

    Maker - wie heeft het bestand gemaakt

    Eigenaar - de huidige eigenaar van het bestand

    Alleen-lezen vlag - 0 - lezen/schrijven, 1 - alleen-lezen. Gebruikt in Windows.

    Markeer "verborgen" - 0 - zichtbaar, 1 - onzichtbaar in de lijst met bestanden in de map (standaard). Gebruikt in Windows.

    Vlag "systeem" - 0 - normaal, 1 - systeem. Gebruikt in Windows.

    Markeer "gearchiveerd" - klaar of niet voor archivering (niet te verwarren met compressie). Gebruikt in Windows.

    Markeer "gecomprimeerd" - het bestand is gecomprimeerd (vergelijkbaar met zip-archieven). Gebruikt in Windows.

    Markeer "versleuteld" - het versleutelingsalgoritme wordt gebruikt. Als iemand een bestand probeert te lezen dat geen toestemming heeft om dit te doen, kan hij het niet lezen. Gebruikt in Windows.

    ASCII-vlag/binair - 0 - ASCII, 1 - binair

    Willekeurige toegangsvlag - 0 - alleen serieel, 1 - willekeurige toegang

    Markeer "tijdelijk" - 0 - normaal, 1 - om het bestand aan het einde van het proces te verwijderen

    Blokkeringsvlag - toegang tot het bestand blokkeren. Als het druk is om te bewerken.

    Aanmaaktijd - datum en tijd van aanmaak. UNIX wordt gebruikt.

    Laatste toegangstijd - datum en tijd van de laatste toegang

    Laatst gewijzigde tijd - de datum en tijd van de laatste wijziging. Gebruikt op Windows en UNIX.

    De huidige grootte is de grootte van het bestand. Gebruikt op Windows en UNIX.

2.1.6 Bestandsbewerkingen

Basissysteem vereist het werken met bestanden:

    Maken - maak een bestand zonder gegevens.

    Verwijderen - verwijder bestand.

    Openen - een bestand openen.

    Sluiten - sluit het bestand.

    Lezen - lezen uit een bestand, vanaf de huidige positie van het bestand.

    Schrijven - schrijf naar het bestand, naar de huidige positie van het bestand.

    Toevoegen - toevoegen aan het einde van het bestand.

    Zoeken Stelt een bestandsaanwijzer in op een specifieke positie in een bestand.

    Kenmerken ophalen - bestandskenmerken ophalen.

    Stel attributen in - stel bestandsattributen in.

    Hernoemen - hernoem een ​​bestand.

2.1.7 Bestanden toegewezen aan geheugenadresruimte

Soms is het handig om een ​​bestand aan het geheugen toe te wijzen (u hoeft geen I/O-systeemaanroepen te gebruiken om met het bestand te werken), en met geheugen te werken en het gewijzigde bestand vervolgens naar schijf te schrijven.

Bij gebruik van wisselgeheugen wordt niet het hele bestand geladen, maar alleen de benodigde pagina's.

Bij gebruik van gesegmenteerde geheugenorganisatie wordt het bestand in een apart segment geladen.

Een voorbeeld van het kopiëren van een bestand via geheugentoewijzing.

Algoritme:

    Er wordt een segment gemaakt voor bestand 1

    Bestand weergegeven in geheugen

    Er wordt een segment gemaakt voor bestand 2

    Segment 1 wordt gekopieerd naar segment 2

    Segment 2 opgeslagen op schijf

Nadelen van deze methode:

    Moeilijk om de lengte van het uitvoerbestand te bepalen

    Als een proces een bestand in het geheugen heeft toegewezen en het heeft gewijzigd, maar het bestand is nog niet opgeslagen, zal het tweede proces hetzelfde bestand openen en met het verouderde bestand werken.

    Het bestand kan groot zijn, groter dan een segment of virtuele ruimte.

2.2 Directory's

2.2.1 Directorysystemen op één niveau

In dit systeem bevinden alle bestanden zich in één map.

Eén directorysysteem met vier bestanden, twee bestanden A, maar verschillende eigenaren

Systeem voordelen:

    Eenvoud

    De mogelijkheid om het bestand snel te vinden, het is niet nodig om mappen te beklimmen

Systeem nadelen:

    Verschillende gebruikers kunnen bestanden met dezelfde naam maken.

2.2.2 Directorysystemen op twee niveaus

Elke gebruiker heeft zijn eigen directory.

Catalogussysteem op twee niveaus

De gebruiker komt bij het betreden van het systeem in zijn directory en werkt er alleen mee. Dit maakt het problematisch om systeembestanden te gebruiken.

Dit probleem kan worden opgelost door een systeemdirectory te maken, met gedeelde toegang.

Als een gebruiker veel bestanden heeft, heeft hij mogelijk ook bestanden met dezelfde naam nodig.

2.2.3 Hiërarchische catalogussystemen

Elke gebruiker kan zoveel mappen aanmaken als hij nodig heeft.

Hiërarchisch catalogussysteem

Bijna alle moderne universele besturingssystemen zijn op deze manier georganiseerd. Gespecialiseerde besturingssystemen hebben dit mogelijk niet nodig.

2.2.4 Padnaam

Om een ​​mappenboom te ordenen, heb je een manier nodig om een ​​bestand op te geven.

De twee belangrijkste methoden voor het specificeren van een bestand zijn:

    absolute padnaam- specificeert het pad van de hoofdmap, bijvoorbeeld:
    - voor Windows \usr\ast\mailbox
    - voor UNIX /usr/ast/mailbox
    - voor MULTICS >usr>ast>mailbox

    relatieve padnaam- het pad wordt gespecificeerd vanuit de huidige directory (werkdirectory), bijvoorbeeld:
    - als de huidige directory /usr/ is, dan wordt het absolute pad /usr/ast/mailbox herschreven naar ast/mailbox
    - als de huidige directory /usr/ast/ is, dan wordt het absolute pad /usr/ast/mailbox herschreven in de mailbox
    - als de huidige map /var/log/ is, dan wordt het absolute pad /usr/ast/mailbox herschreven naar ../../usr/ast/mailbox

./ - betekent de huidige map

../ - betekent bovenliggende map

2.2.5 Directorybewerkingen

Basissysteem vereist het werken met directory's:

    Aanmaken - maak een map aan

    Verwijder - verwijder map

    OpenDir - een map sluiten

    CloseDir - een map sluiten

    Hernoemen - hernoem map