Projekt Fake för Virtutech

Relevanta dokument
Projekt Fake för Virtutech

Projekt Fake för Virtutech

Filsystem. Varför? Hur? För att kunna lagra data mer permanent än i RAM. Vettig organisation Vettiga namn

Flera processer. Minneshantering. Trashing kan uppstå ändå. Ersätta globalt

Operativsystem IS1350

Programmering B med Visual C

Öppna filer och filsystem i PintOS Hemuppgift TDDI81, 21/

Allmänt om programvaror och filer i Windows.

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Operativsystem - input/output, skydd, virtualisering

Flytt av. Vitec Mäklarsystem

Marcus Wilhelmsson 12 april 2013

Operativsystem Lektion 1. Lärare. Schema. Kurssajten Finns på adressen. Jan Erik Moström. Set Norman

Deluppgift 17 Processhantering: exec, sleep, exit, plist

TDDIU81. Processer och trådar. Andreas Dahlberg, Jonathan Doherty, Tony Magnusson, Patrik Ottosson, Rasmus Siljedahl

Programutvecklingsprojekt Projektgrupp Elvin. Detailed Design Document

Operativsystem - Filsystem

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Föreläsning 2. Operativsystem och programmering

Outline. Datorsystemtekni. Kravspecifikation. Kravspecifikation (forts.)

Objektorientering: Lagring och livstid

Datorsystem Laboration 2: Minnesmappade bussar

Länkning av Prolog under C

Systembeskrivning. Systemskiss. Moduler.

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

Språket Python - Del 2 Grundkurs i programmering med Python

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Installationsanvisningar VisiWeb. Ansvarig: Visi Closetalk AB Version: 2.3 Datum: Mottagare: Visi Web kund

Kopiering av objekt i Java

Föreläsning 5-6 Innehåll

Sammansatta datatyper Generics: Parametrisk polymorfism

Filsäkerhet i Windows NT (NTFS)

XML-produkter. -Registret över verkliga huvudmän (RVH) Teknisk handledning för webbtjänst mot RVH (Web Services) Datum: Version: 1.

Design av en klass BankAccount som representerar ett bankkonto

IDE USB kabel Windows XP, Vista 7 löäzxcvbnmqwertyuiopåasdfghjklöäz [Version 1.4, ]

Digital- och datorteknik

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Tentamen i Introduktion till programmering

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Fö 8: Operativsystem II. Minneshantering. Minneshantering (1) Minneshantering (2) Minneshantering och Virtuelltminne.

DDR PC SOFTWARE 2 RELEASENOTES VERSION 2.5. Swerob Service AB Global Robot Parts AB

Instruktioner för uppdatering av enheter med ISP

Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser

Classes och Interfaces, Objects och References, Initialization

TDDD78 Objektorientering: Lagring och livstid

Datum Den första bilden i installationsprogrammet visar vilken version det är. Klicka på Nästa eller tryck Enter för att fortsätta.

Reservföreläsningen inställd

Användarhandledning för koppling av dokument

Uppdragsbeskrivning. Paddel-appen Utmärkta kanotleder. Version 1.0 Mats Persson. Distributionslista. Namn Åtgärd Info.

Insamlingsverktyg - teknisk beskrivning av metadataformuläret

Lärare och handledare. Systemnära programmering. I dag. Föreläsningar & Gruppövningar & Handledning. Marcus Karlsson

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Operativsystem ID2206 Tentamen TEN1 4.5 hp :00-18:00

Regelverk. Infrastrukturen för vidareförmedling av grundläggande uppgifter om företag. Bilaga A. Tekniska ramverk. Version: 1.0

Övningar för del I av kursen

Tillämpad Programmering (ID1218) :00-13:00

Webservice & ERP-Integration Rapport

Introduktion till arv

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Mobilt Efos och ny metod för stark autentisering

Dagens OS. Unix, Linux och Windows. Unix. Unix. En översikt av dagens OS Titt på hur de gör. Många varianter Mycket gemensamt. En del som skiljer

Datorarkitekturer med Operativsystem

Installationsanvisning för LUQSUS-K version 3.0b

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

1 Klasser och objektorientering Vad är objektorientering?

Introduktion till programmering, hösten 2011

Föreläsning 2. Objektorienterad analys och design. Analys: att modellera världen. Design: att strukturera program.

Operativsystem - Windows 7

Objektorientering: Lagring, räckvidd och livstid

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Snabbguide Visma Compact API Copyright Visma Spcs AB

Installationsanvisning för LUQSUS version 2.0

Introduktion till programmering. Undervisning. Litteratur och examination. Lärare. Föreläsning 1

Ett minneselements egenskaper. F10: Minneselement. Latch. SR-latch. Innehåll:

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

XML-dokumentation. För Projektledare & utvecklare hos IT-leverantörer till Svenska Intensivvårdsregistret

Klasser och objekt. Henrik Johansson. August 20, 2008

Uppgift 1 ( Betyg 3 uppgift )

Programmet är avsett för vidarebehandling av Finvoice-nätfakturor som mottagits via ett bank-förbindelseprogram.

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Guide för Innehållsleverantörer

JavaRats. Kravspecifikation. Version 1.1. Gustav Skoglund Marcus Widblom Senast ändrad: 13 / 05 / 08

Datorteknik ERIK LARSSON

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

Lunds Tekniska Högskola Datorarkitektur med operativsystem EITF60. Superscalar vs VLIW. Cornelia Kloth IDA2. Inlämningsdatum:

Utskrift till PDF och e-post

Operativsystem. Informationsteknologi sommarkurs 5p, Agenda. Slideset 7. Exempel på operativsystem. Operativsystem

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Föreläsning 5: Introduktion av pekare

Manual - Phonera Online Backup

TDTS04: Distansvektorroutning i java

Drivrutinen DrvTC2 används för att kommunicera via ADS och PLC:er från Beckhoff.

Transkript:

Kungl. Tekniska Högskolan NADA 2D1954, Programutvecklingsprojektet för D3 Period 3-4, 2003 Grupp A6, Uppdrag 30e för Virtutech Projekt Fake för Virtutech Designdokument Lars Dobos Marcus Johansson Fredrik Jönsson Christian Liljequist Andreas Nilsson Peder Sparell Jacob Tardell Revision: RCSfile: design.tex,v Revision: 1.9 Date: 2003/05/16 11:32:36

2 Innehåll 1 Inledning 1 1.1 Syfte.................................. 1 1.2 Begränsning.............................. 1 1.3 Termer................................. 1 1.4 Referenser............................... 1 1.5 Dokumentstruktur.......................... 1 2 Övergripande beskrivning 2 2.1 Relation till andra projekt och moduler.............. 2 3 Krav 2 3.1 Funktionella krav........................... 2 3.2 Prestandakrav............................ 3 3.3 Säkerhetskrav............................. 3 3.4 Synkroniseringskrav......................... 3 3.5 Interferrenskrav............................ 3 3.6 Systemkrav.............................. 3 3.7 Funktionalitet i implementationen................. 3 4 Övergripande design 3 5 Implementation 4 5.1 Sammanfattning av exekveringsflödet................ 4 5.2 Anropsflöde för inladdning...................... 5 5.3 Anropsflöde för öppning av filer................... 5 5.4 Anropsflöde vid läsning....................... 6 5.5 Anropsflöde vid listning....................... 6 6 Operativsystemets moduler 7 6.1 FakeFS funktioner (ett axplock)................... 7 6.2 FakeFS strukturer.......................... 7 6.2.1 DEVICE_EXTENSION................... 7 6.2.2 FCB.............................. 7 6.2.3 CCB.............................. 7 6.3 Operativsystemets funktioner.................... 8 6.4 Operativsystemets strukturer.................... 8 7 Implementering 8 7.1 Nolloperations filsystemsfunktioner................. 8 7.2 Betydande filsystemsfunktioner................... 9 7.2.1 DriverEntry.......................... 10 7.2.2 DriverUnload......................... 10 7.2.3 FakeFsIrpCreate....................... 10 7.2.4 FakeFsIrpClose........................ 10 7.2.5 FakeFsIrpWrite........................ 10 7.2.6 FakeFsIrpCleanup...................... 10 7.2.7 FakeFsIrpDeviceControl................... 11 7.3 FakeFsIrpDirectoryControl...................... 11 7.4 FakeFsIrpQueryInformation..................... 11

3 7.5 FakeFsIrpQueryVolumeInformation................. 11 7.6 FakeFsIrpRead............................ 11 7.7 FakeFsIrpShutdown.......................... 11 7.8 Noll-operation............................. 11 7.9 Hjälpfunktioner............................ 12 7.9.1 FakeFsLocateFcb....................... 12 7.9.2 FakeFsFreeFcb........................ 12 7.9.3 FakeFsAllocateCcb...................... 12 7.10 Simicsspecifika............................ 12 7.11 Hjälp till Simics HostFs....................... 13 7.11.1 HostFsLookupRecursive................... 13 7.11.2 HostFsInitialize........................ 13 7.11.3 HostFsUninitialize...................... 13 8 Implementationssteg 13 9 Referenser för filsystemet 14 9.1 Kort referenslista av funktioner och strukturer.......... 14

1 1 Inledning 1.1 Syfte Detta dokument är ett designdokument av Windows 2000/XP-implementationen av Simics HostFS filsystem. En tillhörande och utförlig kravspecifikation finns tillgänglig i User Requirements Document. 1.2 Begränsning Designdokumentet är begränsat till att beskriva implementationen av FakeFS, det innefattar ingen fördjupande beskrivning av filsystem eller operativsystem generellt. Dokumentet fordrar en god kännedom om operativsystem generellt. Dokumentet ntintro.pdf ger en inblick i arkitekturen bakom Windows NT specifikt, därutöver finns ett par referenser till andra källor i slutet av dokumentet. 1.3 Termer Simics Simulatorn som simulerar i386 och kör Windows Simics HostFS Ett plug-in till Simics som erbjuder simuleringen att nå ut i värddatorn FakeFS Projektgruppens filsystem, inbegriper FakeFS Module och HostFS Module. HostFS Module Klientdelen till Simics HostFS som används av FakeFS för att anropa Simics HostFS. Vidarebefordrar anrop från FakeFS Module till Simics HostFS. Har bara som uppgift att förenkla anropen till Simics HostFS. FakeFS Module Klientdelen till I/O Manager som vidarebefordrar filanrop till HostFS Module. I/O Manager Tillhör kerneln i Windows. Tillhandahåller ett generiskt gränssnitt för alla filsystem i Windows. I/O Manager anropar FakeFS för att nå värddatorn. 1.4 Referenser Designen av FakeFS är hårt reglerat av de regler som specificeras av operativsystemet respektive HostFS-protokollet. En beskrivning av regelverket ligger utanför ramen för designdokumentet. En del beskrivs utförligt i dokumentet ntintro.pdf. En detaljerad beskrivning av operativsystemets regelverk finns att tillgå i Devicedriver Development Kit (www.microsoft.com/ddk) respektive Installable File System Kit (www.microsoft.com/ddk/ifskit). En specifikation av Simics HostFS-protokollet finns att tillgå i dokumentet virtu_pro.txt. 1.5 Dokumentstruktur Designdokumentet är uppdelat i flera avsnitt. De inledande två avsnitten ger en övergripande beskrivning av funktionaliteten. Därefter följer ett avsnitt med

2 övergripande design och en redogörelse över de vanligaste meddelandeflödena. Dokumentet avslutas med en mer detaljerad specificering av gränssnitten samt referenser till informationsresurser som används vid implementationen. 2 Övergripande beskrivning Dokumentet reglerar endast designen av de grundläggande kraven på filsystemet. De grundläggande kraven innefattar ett read-only filsystem, utan möjlighet att manipulera värddatorns filsystem. En utförlig kravspecifikation finns tillgänglig i User Requirements Document. FakeFS har en enkel uppgift - att underlätta arbetet med att kopiera in filer i en simulerad Windows-miljö i Simics. Simics har som uppgift att simulera en verklig datorplattform, inklusive hardware och firmware för plattformen. Svårigheten är att det saknas ett smidigt sätt att flytta in filer i simuleringen. Avsikten med FakeFS är att göra det möjligt att anropa ett filsystem utanför simuleringen, exempelvis värddatorns filsystem, och att därefter kunna kopiera in filer och kataloger till simuleringen. 2.1 Relation till andra projekt och moduler Filsystemet är starkt beroende av gränssnitten som tillhandahålls av operativsystemet och av Simics. Gränssnittet till operativsystemet följer definitionen för filsystem till NT 3.51. Inga avgörande förändringar har skett sedan dess. Gränssnitten är alltid in development, vilket innebär att filsystemen kan förlora kompabilitet med Windows. Beroendet mot Simics är enklare - en ny version av Simics HostFS måste vara bakåtkompatibel med existerande versioner. 3 Krav 3.1 Funktionella krav För HostFS-modulen gäller att hela stödet för read-only mode är implementerat. Detta inkluderar, men är inte begränsat till: uppslagning av filnamn - Lookup öppna fil - Open stäng fil - Close läsa filinnehåll - Read lista kataloginnehåll - ReadDir fråga attribut - GetAttr fråga volym - VfsStat För filsystems-modulen är kraven striktare, här krävs att alla funktioner implementeras. Det finns dock möjlighet att returnera en felkod för de funktioner som saknas. Detta berör främst write-stödet (skapa fil, ta bort filer, skriva filinnehåll).

3 3.2 Prestandakrav Det finns inga prestandakrav. 3.3 Säkerhetskrav Det finns inga säkerhetskrav, annat än de stabilitetskrav som krävs för att uppfylla synkroniseringskravet. 3.4 Synkroniseringskrav Filsystemet bör synkronisera alla filoperationer, så att inga obestämda tillstånd uppträder. 3.5 Interferrenskrav Filsystemet ska ha ett tillstånd som matchar den simulerade miljön, den ska inte påverkas av värddatorns miljö. Filsystemet ska i möjligaste mån skrivas så att förloppen ska vara deterministiska. 3.6 Systemkrav FakeFS exekverar under Windows i en simulering av i386 under Simics. Det krävs att Simics har HostFS-modulen inladdad. Windows 2000 ska vara installerad i simuleringen. 3.7 Funktionalitet i implementationen Filsystemet skrivs i C. Filsystemet är uppdelat i två moduler, dels filsystemslogik, dels simics hostfslogik. Meddelandeflödet börjar i operativsystemet (som en följd av disk I/O) och propagerar in i filsystemslogiken. Filsystemslogiken översätter meddelandet och skickar det vidare till HostFS-logiken som trycker ut meddelandet till Simics HostFS. Simics HostFS fångar upp meddelandet och utför anropet i värddatorns filsystem. Programkoden ska följa samma indelning som modulerna. Callbacksen för filsystemslogiken är placerad i filen irps.cpp, medan Simics HostFS återfinns i hostfs.cpp. Stödfunktioner för filsystemslogiken placeras i mainfs.cpp. Nolloperationsfunktioner placeras i fastio.cpp. Filsystemsfunktionerna namnges med FakeFS som prefix, t ex FakeFsIrpRead för exempelvis läsanropet. Simics HostFS-stödet namnges med HostFS som prefix, exempelvis HostFsHandshake som används för att initiera Simics HostFS. 4 Övergripande design HostFS-modulen hanterar all kommunikation med Simics HostFS. HostFS består av stödfunktioner som används av filsystemslogiken för att expediera anropen. Det erbjuder en abstraktion av Simics HostFS. En förändring i protokollet kommer inte att påverka filsystemet, utan isoleras helt till HostFS-modulen.

4 Filsystemsmodulen, kallad FakeFS-modulen, implementerar gränssnittet till operativsystemet. Dess struktur är totalt reglerad av operativsystemets krav som gäller för alla filsystem. 5 Implementation Implementationen tar sin början i de grundläggande FakeFS-funktionerna. Avsikten är att få en möjlighet att verifiera att designen ser ut att fungera. Därefter implementeras hela HostFS-modulen, så att gränssnittet till Simics kan verifieras. Slutligen implementeras de återstående FakeFS-funktionerna och hela filsystemet verifieras. 5.1 Sammanfattning av exekveringsflödet Vid inladdning av drivrutinen anropas DriverEntry för att ge möjlighet att initiera drivrutinen. OS:et förväntar sig att filsystemet ger tillbaka adresser till alla de funktioner som operativsystemet kommer att anropa för att utföra filanrop (callback-funktioner). De mest centrala callbacksen är FakeFsIrpCreate, som anropas vid öppning av en fil eller katalog FakeFsIrpRead, som anropas vid läsning från fil FakeFsDirectoryControl, som anropas vid listning ur ett bibliotek När initieringen i DriverEntry är avklarad, kommer OS:et att anropa filsystemet över dessa funktioner. Gemensamt för de tre funktionerna är typdeklarationen: NTSTATUS FakeFsIrpCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) Beskrivning av parametrar DeviceObject är pekaren till filsystemets enhet i namnrymden. Endast DeviceObject->DeviceExtension är av intresse, den pekar ut c-strukturen (DEVICE_EXTENSION). Där placeras data som rör Simics, filsystemet och resten av miljön. Operativsystemet har inget intresse av DeviceExtension. Irp är hårdare reglerat; den innehåller parametrar för just det här filanropet. De viktigaste medlemmarna Irp->UserBuffer är adressen som användaren skickade. Därifrån läser eller skriver filsystemet. IrpSp är den sista, viktiga pekaren i Irp. Den anger parametrar till drivrutinen Skillnaden mellan Irp och IrpSp är att Irp innehåller parametrar för alla drivrutiner i enhetsstacken, medan IrpSp bara innehållet parametrar för just den här drivrutinen. Två av variablerna i IrpSp är, IrpSp->Read.ByteOffset, som anger var i filen som skrivning/läsning samt IrpSp->Read.Length som anger hur stor UserBuffer är. En mer utförlig beskrivning finns i ntintrot.ps i CVSn.

5 5.2 Anropsflöde för inladdning Filsystemets main heter DriverEntry, som anropas av IO Manager när användaren vill ladda in filsystemet. All initiering av filsystemet sker i DriverEntry, däribland sätter DriverUnload-pekaren i DriverObject, medför att drivrutinen kan laddas ur anropar FakeFsInitIrpCallbacks för att sätta de verksamma funktionspekarna anropar FakeFsInitFastIoCallbacks för att sätta pekare till noll-funktionerna anropar IoCreateDevice och FsRtlRegisterUncProvider för att registrera filsystem anropar HostFsInitialize för att initiera Simics HostFS-objektet i minnet FakeFsInitIrpCallbacks har till uppgift att registrera alla de funktioner som tillhör MajorFunctions i DriverObject genom att sätta funktionspekarna (callbacksen) till filsystemets funktioner. FakeFsInitFastIoCallbacks fyller samma funktion, men med tillägget att pekarvektorn måste allokeras i minnet först. HostFsInitialize har till uppgift att låsa Simics HostFS-adressen på minnesbussen. Det görs genom MmMapIoSpace, som ger en adress för att kommunicera med Simics HostFS. HostFS-objektet finns tillgängligt på en hög adress i bussrymden, men översätts med MmMapIoSpace till en adress som är bussoberoende. Ett problem är att minnesadressen som används av HostFS ingår i ett minnesspann som är reserverat av en annan drivrutin (hal.dll). Minnesadressen ockuperas ändå. 5.3 Anropsflöde för öppning av filer I/O Manager anropar FakeFsIrpCreate för att öppna filer i filsystemet. Huvuduppgiften är att bestämma om filen redan är öppen, alternativt vilken identitet (nodnummer) som filen tilldelats i Simics HostFS. Skillnaden mot Unix är att filsystemet självt bestämmer hur sökvägen utformas, och hur den ska tolkas (vilket sker i HostFsLookupRecursive). Lämpligtvis tolkas den från vänster till höger, med slash och backslash som namnseparering. Pseudokoden ger ett enkelt flöde: 1. anropar HostFsLookupRecursive för att få ett nodnummer till filnamnet 2. anropar FakeFsLocateFcb för att få ett matchande filkontrollblock, Fcb, till noden 3. anropar FakeFsAllocateCcb för att få ett eget, privat, filhandtag 4. sätter FileObject->FsContext till adressen hos Fcb:n 5. sätter FileObject->FsContext2 till adressen hos Ccb

6 5.4 Anropsflöde vid läsning I/O Manager anropar FakeFsIrpRead för att läsa öppnade filer. Irp->FileObject->FsContext är identisk FsContext som i FakeFsIrpCreate. Irp->FileObject->FsContext2 är också densamma som förut. Därigenom finns både Fcb:n (FileObject->FsContext) och Ccb (FileObject- >FsContext2) tillgängliga vid läsningen. I IrpSp->Read.ByteOffset anges var i filen som läsningen ska ta sin början. I IrpSp->Read.Length finns längden på den buffer som användaren skickade. Irp->UserBuffer ger oss en pekare till bufferten som användaren skickade. De parametrar som finns tillgängliga: Pekare till bufferten som vi skriver till Filens nodnummer Offset i filen Längden på bufferten Först valideras bufferten genom att anropa ProbeForWrite. Lyckas anropet, kan bufferten betraktas som giltig. Därefter återstår själva anropet till Simics HostFS-objektet (genom HostFsRead). I HostFsRead finns stöd för att hugga upp anropet i mindre delar, då Simics HostFS-modulen bara stödjer paket med 1024 bytes i varje. 5.5 Anropsflöde vid listning I/O Manager anropar FakeFsIrpDirectoryControl för att lista filerna i en katalog. Irp->UserBuffer pekar på en buffert dit filnamnen ska skrivas. Irp->FileObject->FsContext är Fcb:n till katalogen Irp->FileObject->FsContext2 är Ccb:n till katalogen IrpSp->Parameters.QueryDirectory.FsInformationClass anger vilken typ av information som efterfrågas (bara filnamn, filstorlek etc) IrpSp->Parameters.QueryDirectory.FileIndex anger index relativt fillistan i den aktuella katalogen Genom att först iterativt fylla bufferten med HostFsReadDir tills bufferten är full, därefter lagra undan sista filindexet (som fick plats) i Ccb:n, så kan användaren åter anropa DirectoryControl för att komplettera listningen (tills alla poster har fått plats i bufferten).

7 6 Operativsystemets moduler Filsystemet byggs upp av ett par element Filsystemets funktioner Filsystemets strukturer Operativsystemets funktioner Operativsystemets strukturer 6.1 FakeFS funktioner (ett axplock) DriverEntry, första anropet till drivrutinen FakeFsIrpWrite, hit anropar OS:et när den vill skriva till en fil FakeFsFastIoXXX, måste finnas, men returnerar felkod HostFsLookup, gränsyta mot Simics HostFS, ger ett id för filen HostFsHandshake, handskakar med Simics HostFS-objektet, först av allt 6.2 FakeFS strukturer 6.2.1 DEVICE_EXTENSION Typiskt variabler som rör filsystemet som helhet Adress till Simics HostFS-objektet i minnet Länkad lista till alla öppna filer, FCB, filkontrollblock, varje öppen fil har ett (och endast ett) filkontrollblock 6.2.2 FCB Representerar en öppen fil i minnet. Varje fil kan högst ha en FCB i minnet samtidigt. hnode (ett unikt nummer, som tilldelas filen av Simics HostFS) Referensnummer, hur många har öppnat den här filen, (viktigt för att bestämma när vi kan stänga filen) Attribut, storlek Länkad lista till alla CCB:er för filen - det vill säga kopplingen mellan filkontrollblocket och filhandtaget 6.2.3 CCB Skapas för vid varje öppning av filen, tillhör ett visst FCB. filoffset (varje fopen ska ju kunna fseek:a utan att störa varandra) pekare till filkontrollblocket

8 6.3 Operativsystemets funktioner IoCreateDevice, för att deklarera filsystemet i namnrymden. RtlInitUnicodeString, för att konvertera en textsträng till en unicodesträng MmMapIoSpace, så att vi kan lägga beslag på HostFS-objektet. Skyddar också objektet från andra, klåfingriga program IoGetCurrentIrpStackLocation, ger parametrar till en viss drivrutin i stacken MmGetSystemAddressForMdlSafe, ger en pekare till minnet som användaren CcInitializeCacheMap, ger stöd för minnesmappade filer asm { asm _emit 0x87 asm _emit 0xDB }, triggar Simics till ett avbrott. Mycket praktiskt. 6.4 Operativsystemets strukturer DRIVER_OBJECT, representerar drivrutinen i minnet, initieras med callbacks så att OS:et kan återanropa filsystemet DEVICE_OBJECT, är filsystemets fasta punkt i namnrymden. Viktigast är DeviceExtension (som definieras av utvecklaren) IRP, används av I/O Manager för att skicka parametrar till en enhetsstack IO_STACK_LOCATION, utgör en del av IRP:n, innehåller de parametrar som berör en specifik drivrutin i enhetsstacken. Listan med IO_STACK_LOCATION:s är lika djup som enhetsstacken. Varje drivrutin har varsin plats i högen 7 Implementering Filer kan öppnas på två sätt, dels genom direkta läs- och skrivoperationer (typiskt fscanf), dels minnesmappat (där datafilen finns på en plats i minnet, finns generellt beskrivet på www.imit.kth.se/courses/2g1504/courselib/doc/lecturenotes/os5.pdf). För att filer ska kunna öppnas minnesmappade, ska ett antal cachehanteringsfunktioner finnas. De behöver dock inte gör något. FakeFS kommer att stödja minnesmappade filer, men bara returnera FALSE eller STATUS_SUCCESS. Därefter kommer Cache Manager att anropa filsystemet med IRP istället för cacheanrop. Noll-funktionerna implementeras i filerna fastio.h respektive fastio.cpp. 7.1 Nolloperations filsystemsfunktioner Noll-funktionerna finns i fastio.cpp och fastio.hpp FakeFsFastIoCheckIfPossible FakeFsFastIoRead

9 FakeFsFastIoWrite FakeFsFastIoQueryBasicInfo FakeFsFastIoQueryStandardInfo FakeFsFastIoLock FakeFsFastIoUnlockSingle FakeFsFastIoUnlockAll FakeFsFastIoUnlockAllByKey FakeFsFastIoDeviceControl FakeFsFastIoAcquireFileForNtCreateSection FakeFsFastIoReleaseFileForNtCreateSection FakeFsFastIoDetachDevice FakeFsFastIoQueryNetworkOpenInfo FakeFsFastIoAcquireForModWrite FakeFsFastIoMdlRead FakeFsFastIoMdlReadComplete FakeFsFastIoPrepareMdlWrite FakeFsFastIoMdlWriteComplete FakeFsFastIoReadCompressed FakeFsFastIoWriteCompressed FakeFsFastIoMdlReadCompleteCompressed FakeFsFastIoMdlWriteCompleteCompressed FakeFsFastIoQueryOpen FakeFsFastIoReleaseForModWrite FakeFsFastIoAcquireForCcFlush FakeFsFastIoReleaseForCcFlush 7.2 Betydande filsystemsfunktioner Därutöver finns funktioner som har en faktisk uppgift i filsystemet.

10 7.2.1 DriverEntry Entry-point för drivrutinen. Hit kommer första anropet från OS:et. 1. låsa HostFS-objektet i minnet 2. sätt callbacks för Irp- och FastIo-hantering 3. initiera enhetsobjektet i namnrymden, så att os kan montera filsystemet 7.2.2 DriverUnload Anropas för att ladda ur filsystemet ur minnet 1. ta bort enhetsobjektet ur namnrymden 2. frisläpper hostfsobjektet ur minnet 7.2.3 FakeFsIrpCreate Anropas av OS:et för att öppna (eller skapa) en fil. filnamnet kommer med anropet. omvandla filnamn till id (HostFsLookupRecursive) kontrollera om ett filkontrollblock redan finns, annars skapa ett nytt (genom FakeFsLocateFcb) allokera filhandtag till öppningsinstansen (med FakeFsAllocateCcb) anropa HostFsOpen för att öppna filen (om den inte redan är öppen) 7.2.4 FakeFsIrpClose Anropas för att stänga ett filhandtag. kontrollera huruvida referensnummer är noll om referensräknaren inte är noll, frigör CCB:n, och minska räknaren annars, stäng Simics-handtaget, frigör CCB och FCBn 7.2.5 FakeFsIrpWrite Anropas för att skriva till filen lås användarens minnesadress positionera i den öppna filen med HostFsSeek skriv till filen (med HostFsWrite) 7.2.6 FakeFsIrpCleanup Anropas för att frigöra filhandtaget, innan close urladda CacheManager med CcUninitializeCache

11 7.2.7 FakeFsIrpDeviceControl Anropas för special events i filsystemet. Används för att tolka UNC-sökvägar (exempelvis //fakefs/abc). Funktionen returnerar hur stor del av sökvägen som kunde tolkas, utan att anropa Simics HostFS. Värdet noll medför att anropet går vidare till andra 7.3 FakeFsIrpDirectoryControl Används för att lista en katalog anropa HostFsReadDir för att läsa in katalogen formatera returdata efter typ av förfrågan FileDirectoryInformation eller FileNamesInformation 7.4 FakeFsIrpQueryInformation Anropas för att ge information om just den här filen Stödjer bara förfrågan av typerna FileBasicInformation och FileNameInformation 7.5 FakeFsIrpQueryVolumeInformation Används för att ge information om volymen 7.6 FakeFsIrpRead Anropas för att läsa från filen Användarens minnesadress är Irp->UserBuffer positionera i filen genom Simics HostFS (med HostFsSeek) läser från Simics HostFS (med HostFsRead) 7.7 FakeFsIrpShutdown Städa upp allokering och stäng filer 7.8 Noll-operation Därutöver tillkommer nedanstående funktioner som är no-op:s FakeFsIrpFileSystemControl FakeFsIrpFlushBuffers FakeFsIrpInternalDeviceControl FakeFsIrpLockControl FakeFsIrpPlugnPlay FakeFsIrpQueryEa FakeFsIrpQueryQuota

12 FakeFsIrpQuerySecurity FakeFsIrpSetEa FakeFsIrpSetQuota FakeFsIrpSetSecurity FakeFsIrpSetInformation FakeFsIrpSetVolumeInformation 7.9 Hjälpfunktioner Dessutom finns en del funktioner som underlättar de andra funktionernas implementering. Framförallt rör det hanteringen av filkontrollblock och kontextkontrollblock, som är likartad för flera av FakeFS-funktionerna. 7.9.1 FakeFsLocateFcb Anropas med ett filnod-nummer, kontrollerar om filen är öppen (och redan har ett filkontrollblock) Om ja, referera filkontrollblocket och returnera det. Om nej, skapa ett nytt filkontrollblock, referera filkontrollblocket och returnera det 7.9.2 FakeFsFreeFcb Frigör filkontrollblocket 7.9.3 FakeFsAllocateCcb Skapar ett filhandtag och kopplar det till filkontrollblocket 7.10 Simicsspecifika Filsystemet interagerar med Simics HostFS-objektet över gränsytan i minnet. Protokollet är inte anpassat för i386 eller NT. Därför behövs ett mellanliggande gränssnitt som förenklar kommunikationen för filsystemet. HostFS-modulen skapar ett förenklat gränssnitt som kan användas av FakeFS-modulen. Dessa funktioner mappas nästan one-to-one till HostFS-protokollet. En av HostFSmodulens uppgifter är att omvandla från little-endian till big-endian. HostFsHandshake HostFsLookup HostFsOpen HostFsDebug HostFsClose HostFsRoot HostFsGetAttr

13 HostFsReaddir HostFsSeek HostFsRead HostFsParent HostFsUnmount 7.11 Hjälp till Simics HostFs Förutom en-till-en mappningen för HostFS-gränssnittet finns ett par funktioner som inte riktigt tillhör gränssnittet. 7.11.1 HostFsLookupRecursive Klarar av att spjälka upp en hel sökväg (med ", / och.. ) 7.11.2 HostFsInitialize Ockuperar HostFS-adressen i minnet 7.11.3 HostFsUninitialize Frigör HostFS-resursen ur minnet. 8 Implementationssteg Filsystemet är komplicerat i sin arkitektur. Implementationen sker etappvis för att filsystemet överhuvudtaget ska vara överblickbart. Ett något förenklat schema följer nedan 1. DriverEntry och DriverUnload, i sin helhet - redan från början 2. FakeFsInitIrpCallbacks och FakeFsInitFastIoCallbacks, tillhör DriverEntry 3. Alla dummy FakeFsFastIo 4. Alla dummy FakeFsIrp 5. Simics-support för handskakning och debug 6. Prova debug inifrån FakeFsIrpWrite 7. Simics-support för namnöversättning, öppning, attributinhämtning 8. real FakeFsIrpCreate, med stöd för öppning av riktiga filer 9. real FakeFsIrpClose och FakeFsIrpCleanup, det är bra att städa efter sig 10. real FakeFsRead, ger lässtöd 11. real FakeFsDirectoryControl, möjliggör lista katalog

14 12. real FakeFsQueryInformation, ställa frågor om filer Redan efter femte etappen finns möjlighet att testa ett grundläggande filsystem (med bara en fil). Nästa testtillfälle finns vid åttonde etappen då riktiga filer faktiskt kan öppnas. Efter tolfte etappen ska det vara möjligt att läsa in filer och lista katalog. 9 Referenser för filsystemet Det är svårt att hitta goda referenser till filsystem. Mycket handlar om att programmera hårdvaran istället för filsystemen i operativsystemet. En av de mer läsvärda är Windows NT Filesystem Internals, Rajeev Nagar. Företaget www.osr.com, har en del fria resurser. Bland annat ett register över en mängd funktioner och deras definitioner. Därutöver finns en gnu-version tillgänglig på www.acc.umu.se/ bosse. 9.1 Kort referenslista av funktioner och strukturer DEVICE_OBJECT - http://www.osr.com/ddk/kmarch/k112\_32cy.htm Här beskrivs c-strukturen DEVICE_OBJECT. Den representerar filsystemets monteringspunkt i namnrymden. Filsystemet tar bara hänsyn till en variabel i strukturen: DeviceExtension, som pekar ut filsystemets egen struktur där programmeraren kan placera egna variabler. Operativsystemet använder inte DeviceExtension. DRIVER_OBJECT - http://www.osr.com/ddk/kmarch/k112\_6jaq.htm Här beskrivs c-strukturen som representerar drivrutinen i minnet. Strukturen är lång, men filsystemet tar bara hänsyn till ett par variabler; FastIoDispatch och MajorFunction. IO_STACK_LOCATION - http://www.osr.com/ddk/kmarch/k112\_49bm. htm Representerar alla parametrar som skickas till filsystemets funktioner. Läsvärd. Typiska parametrar är: filnamn, filoffset, bufferlängd IRP - http://www.osr.com/ddk/kmarch/k112\_3z5e.htm Kapslar IO_STACK_LOCATION. Innehåller mer globala parametrar, exempelvis UserBuffer som pekar ut var filsystemet ska skriva/läsa. Alla IRPs byggs upp av en lista IO_STACK_LOCATION, en post för varje drivrutin i enhetsstacken. IoGetCurrentIrpStackLocation - http://www.osr.com/ddk/kmarch/k104\ _89pu.htm Funktionen tar en PIRP som inparameter och ger aktuell PIO_STACK_LOCATION i retur.