Systemkald DM14. 1. Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111



Relaterede dokumenter
DM14-1. Obligatorisk opgave F.06. System Call. Jacob Aae Mikkelsen Ingen andre gruppe medlemmer. 6. marts 2005

Systemkald i Unix/Linux

Programmering i C Intro og grundlæggende C 5. marts 2007

Design Systemkald. User-mode Linux, The Linux kernel/

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Processer og tråde. dopsys 1

Principper for Samtidighed og Styresystemer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Interconnect. Front end interface

Styresystemer og tjenester

Operativsystemer - dopsys

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

DM507 Algoritmer og datastrukturer

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med

Optimering af fraværsregistrering

Programmering og Problemløsning, 2017

Programmering i C. Lektion september 2009

NC_71 Quick Guide v1.0. CJ1W-NC_71 Mechatrolink-II Position Control Unit. Quick Guide

DM13-3. Obligatorisk opgave E.05 Håndoptimering af SPARC assembler-kode

Programmering i C. Lektion september 2009

Operativsystemer of C Efterår 2013 Virtuel hukommelse (kap. 9)

DM507 Algoritmer og datastrukturer

Skriftlig Eksamen Kombinatorik, sandsynlighed og randomiserede algoritmer (DM528)

Introduktion til C programmering

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Internt interrupt - Arduino

Processer. DS kursusgang nr. 2: Procestræer. ps: Vis processer

Sider og segmenter. dopsys 1

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

DM536. Rapport og debug

DANMARKS TEKNISKE UNIVERSITET

Koordinering. dopsys

PUT og INPUT funktionerne

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

C Programmering V1.37

Processer og koordinering

Metoder og værktøjer til programmering

Programmering og Problemløsning, 2017

Programmering i C Programmering af microcontroller i C (4 af 4) 12. april 2007

dmasark Aflevering - Uge 50

Jacob Christiansen, Institut for MAtematik og DAtalogi, Syddansk Universitet, Odense

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet)

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

1 Sælgeroplysningsskema Bygningssagkyndig udfylder...2

Netprøver.dk. Brugervejledning for elever

Netprøver.dk. Brugervejledning for elever

Kursusarbejde 3 Grundlæggende Programmering

DME Bootstrap Version 1.4x

program fibomain(input,output); var i, j,result : integer; var x, y: integer;

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Undtagelseshåndtering i C#

// Definition af porte og funktioner

Sproget Rascal (v. 2)

Python 3 kursus lektion 1:

Programmering i C. Lektion oktober 2008

Sider og segmenter. dopsys 1

Navn: Søren Guldbrand Pedersen Klasse: 2i Fag: up/ansi Opgave: Brev til Sigurd Lære: John Austin Side 1 af 8 Dato:

Online kursus: Programming with ANSI C

! #!! $ % $! & " &'"! & *+ "! " $ $ ""!,-! $!.! $! " # 1!! &' "

Modbus data modellen er opbygget af fire primære data typer. I nedenstående skema er en kort oversigt over disse.

Programmering i C. Lektion september 2009

Netprøver.dk. Brugervejledning for elever

Lær Python dag 1 - modul 1

Opgave Opgave

Softwareudvikling: Miljøer

Aftenskole i programmering sæson Core Data del 2. Sæson 2-13

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Programmering i C Videre med C (2 af 4) 19. marts 2007

Operativsystemer - dopsys. Erik Ernst

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

Navn: Søren Guldbrand Pedersen Klasse: 2i Fag: up/ansi C Opgave: Brev til Sigurd Lære: John Austin Side 1 af 13 Dato:

Introduktion til funktioner, moduler og scopes i Python

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag

Installation af et tilføjelsesprogram

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen

KOMPONENT BESKRIVELSE

Spil Master Mind. Indledning.

Projekt - RoboNet Del Journal.

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

Pointers. Programmering i C. 11. december Lektion 5. Eksempel: denne plads. Getting the address of a variable:

Skriftlig eksamen, Programmer som Data januar 2014

Programmering i C. Kursusintroduktion. Lektion september Målgruppe 2 Indhold 3 Form 4 Materiale. Målgruppe Indhold Form Materiale

Lær Python - Dag 3, modul 1 Læse og skrive filer

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 13/ Side 1 af 7

Et alfabet er en ordnet mængde af bogstaver og andre tegn

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

At klippe en streng over på det mest hensigtsmæssige sted

(fig.1. Eksempel på en almindelig entity)

Engelsk 5. klasse årsplan 2018/2019

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

poedit og oversættelse af sprogfiler

Netprøver.dk. Brugervejledning for elever ved studieretningsprojektet (SRP) og større skriftlig opgave (SSO) i skoleåret

DM507 Algoritmer og datastrukturer

Transkript:

DM14 1. Obligatoriske opgave Systemkald Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111 Side 1 af 5

Intro: Formålet med opgaven at et lave en system kald til en Linux kerne, i vores tilfælde en User-Mode- Linux kerne. Der skal implementeres en system kald, som ved hjælp af region based memory, gør det muligt at dele data mellem processer. Region based memory er en inter process communication (IPC) metode, som blandt andet bruges I distributed shared memory systems. Det vil sige det er en metode som gør det muligt for processer, at dele en klump hukommelse. Dette område kan tilgås ved hjælp specielle operationer, her et systemkald. Implementation: System kaldet er implementeret efter den opgivne guid på kursets hjemmeside. Det vil sige at følgende filer er ændret, for at tilføje systemkaldet: Unistd.h Sys_call_table.c Desuden er Makefile blevet opdateret, så systemkaldet bliver compilet, når UML kompiles. Herefter er header-filen implementeret. Dette gøres for at andre c-programmer i UML, kan kalde systemkaldet. Header-filen moffe42_mem.h er vedlagt som bilag. I filen er selve systemkaldet defineret, samt nogle globale variabler, som bruges når selve kaldet sker i et c-program (ie. MOFFE42_MEM_READ 1) Selve systemkaldet er implementeret I moffe42_mem.c. moffe42_mem.c er også vedlagt som bilag. I filen er der først inkluderet nogle header-filer, som gør det muligt at lave et nyt systemkald. Derefter defineres størrelsen på det hukommelses område, som systemkaldet skal kunne tilgå. Til sidst defineres selve systemkalds funktionen. Systemkaldet kaldes med 4 argumenter: int flag: Et integer argumet, som angiver om der skal skrives til hukommelses området eller læses. Char *buf: En pointer til et char array. Kilde eller destinations array, alt efter om der er tale om skrivning eller læsning. Int offset: Et integer argument, som angiver et offset fra starten af hukommelses område, der tilgås. Int length: Et integer argument, som angiver hvor lang char arrayet er eller hvor meget af den der skal skrives i hukommelses området. Det første der sker i funktionen er en erklæring af et char array, som bruges til at tilgå hukommelses området. Derefter tjekkes der om alle argumenter er korrekte. Er de ikke det, returnere funktionen en fejlværdig til hoved-programmet, ellers fortsættes der. Herefter kontrolleres der hvad flag er sat til og derefter læses eller skrives der til hukommelses området. Skulle funktionen, mod forventning ikke skrive eller læse hele char arrayet, vil funktionen returnere en fejl besked. Side 2 af 5

Til sidst er testprogrammet implementeret, for at se om systemkaldet virker som det skal. Programmet virker som et hvilket andet, hvor man kalder systemkaldet. Først kaldes systemkaldet med READ og derefter WRITE. Efter hvert kald tjekkes der om systemkaldet har returneret en fejl og dermed ikke fuldført rigtigt. Her skal man huske at resette errno, da det ellers ikke er muligt at kalde perror igen. Rent implementationsmæssigt er det gjort som man kunne forvente, dog er der ting som kunne være gjort anderledes og nogle ting som ikke er implementeres. For eksempel kunne man have valgt ikke at lave length som et argument, men i stedet, når funktionen kaldes, kontrollere hvor lang char arrayet er og bruge det. Dog ville dette ikke give noget fordel, snare tvært imod. Samme princip, kunne man bruge til at tjekke om char arrayet virkelig er et char array og om det indeholder en end værdi. En end værdi vil være at foretrække, så frem man vil printe char arrayet efter det er læst. Desuden kunne erklæringen med MOFFE42_MEM_READ og MOFFE42_MEM_WRITE godt glemmes, da funktionen bare skal have et 1 eller 2. Det bruges dog, for letheden skyld, så kaldet af systemkaldet gøres mere gennemskueligt. Samtidige kald: En af de ting man altid er nød til at tage i betragtning, når man har en funktion, der kan kaldes samtidig fra flere processer samtidig, er selvfølgelig, hvad vil der ske i det tilfælde hvor 2 processer kalder funktionen samtidig. Umiddelbart er det ikke lige til at sige, så frem der ikke er en separat scheduler til at håndtere systemkald. Det mest oplagte er hvis systemkaldet, kan udføres i en timeslice. Så vil første kald køre efter planen. Det samme vil det andet, dog har man ingen anelse om hvad det er for data der vil ligge i hukommelses området. Et andet tilfælde vil være at systemkaldet ikke ville kunne blive færdig på en timeslice. Et lille eksempel: 1. Proces 1 bruger det sidste af sin timeslice, til lige at nå at læse de to første char i hukommelsen. 2. Proces 2 begynder lige ved systemkaldet når timeslicen starter. Proces 2 når at skrive 5 char til hukommelsen. 3. Process 1 læser videre i sin nye timeslice, men data passer ikke sammen, med det forventede. 4. Osv. En sidste mulighed er at der er en eller anden form for memory-manegement, som holder styr på hvilke processer der har adgang til hvilke dele af hukommelsen. I et sådant tilfælde, vil andet kald til samme område, returnere en fejl, da den ikke kan tilgå hukommelsen. Side 3 af 5

Test: For at vise at vores systemkald virker, er det nødvendigt at kalde det med rigtige argumenter, samt med forkerte. Følgende test er udført: 1. moffe42_mem(moffe42_mem_write, Hello region, 1024, 13) 2. moffe42_mem(moffe42_mem_write, Hello region, 1024, 13) moffe42_mem(moffe42_mem_read, out, 1024, 6) 3. moffe42_mem(moffe42_mem_write, Hello region, 1024, 6) 4. moffe42_mem(moffe42_mem_write, Hello region, 1024, -13) 5. moffe42_mem(moffe42_mem_write, Hello region, 1048576, 13) 6. moffe42_mem(4, Hello region, 1024, 13) Testene gav følgende output: 1. Output: Hello region 2. Output: Hello @HÞ@À 3. Output: Hello region 4. Write: Invalid argument 5. Write: Cannot allocate memory 6. Write: Invalid argument Alle test gav det forventede output på nær 2. Test 2 skriver mere end forventet. Dette skal dog ikke ses som en fejl i systemkaldet, men en fejl i funktionen printf. Funktionen printer ind til den møder et end tegn. Da systemkaldet ikke har skrevet et end tegn i char arrayet, vil den fortsætte med at printe ind til den møder et tilfældigt. Desuden giver test 3 også anledning til nærmere undersøgelse. Systemkaldet skulle kun skrive Hello, men alligevel kommer der Hello region ud. Dette skyldes at der i forvejen ligger resten, ligger der fra en forgående kørsel. Havde man i stedet skrevet det et andet sted i hukommelsen, havde vi fået samme besked som i test 2. Havde vi i stedet kaldt WRITE kun med Hello og ikke Hello region, ville det rigtige resultat komme ud, da printf, da printf ville finde et end tegn efter Hello. Side 4 af 5

Aflevering: Opgaven løb på at lave et systemkald, som gjorde det muligt at skrive til et hukommelses område. Dette er nu gjort, samt der er taget højde for at systemkaldet kun tager de rigtige argumenter. Desuden er der taget hånd om fejlhåndtering, så systemkaldet ikke terminer uhensigtsmæssigt.. Side 5 af 5

// // Main-prog til moffe42_mem syscall // //Include header-files #include "arch/um/include/moffe42_mem.h" #include <stdio.h> #include <errno.h> #include "asm/arch/unistd.h" //Definition of syscall _syscall4(void, moffe42_mem, int, flag, char *, buf, int, offset, int, length) //Main int main() { //Initialization char *in = "Hello region"; char out[13]; //Reset errno errno = 0; //Write to kernel mem moffe42_mem(moffe42_mem_write, in, 1024, 13); //Error handling if(errno) { perror("write"); return 0; } //Reset errno errno = 0; //Read from kernel ; //Error handling if(errno) { perror("read"); return 0; } //Print output printf("output: %s\n", out); return 0; }

Output: Hello region