Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultńt Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Betriebssysteme
 
  Vorlesung
    - UnivIS-Infos
    - Inhalt
    - Folien
 
  Übungen
    - UnivIS-Infos
    - Inhalt
    - Mailingliste
    - Ergänzendes Material
    - Terminübersicht
    - Aufgaben
       * Umgebung
       * Typische Fehler
       * Aufgabe 1
          Dokumentation
       * Aufgabe 2
          Dokumentation
       * Aufgabe 3
          Dokumentation
       * Aufgabe 4
          Dokumentation
       * Aufgabe 5
          Dokumentation
       * Aufgabe 6
          Dokumentation
       * Aufgabe 7
          Dokumentation
 
  Evaluation
Department Informatik  >  Informatik 4  >  Lehre  >  WS 2010/11  >  Betriebssysteme  >  ├ťbungen  >  Aufgaben  >  Aufgabe 7

Aufgabe 7: Eine Anwendung f├╝r OO/MPStuBS (Nur f├╝r 3er Gruppen ist die Bearbeitung von Aufgabe 7 verpflichtend)

Lernziel

  • Anwendung von Programmf├Ąden und Semaphoren

Aufgabenbeschreibung

Im Rahmen dieser Aufgabe sollt ihr eine OOStuBS-Anwendung eurer Wahl implementieren. Dabei sollten m├Âglichst mehrere F├Ąden zum Einsatz kommen, die ├╝ber Semaphore synchronisiert werden.

Vorgabe

Die Vorgabe unter /proj/i4bs/vorgaben/vorgabe-7.tar.gz enth├Ąlt einen Zufallszahlengenerator (random.*) und einen einfachen Grafikmodus. Wenn ihr den Grafikmodus verwenden wollt, m├╝sst ihr dazu jedoch noch ein wenig Hand anlegen:

Analog zu CGAScreen ben├Âtigt ihr ein globales Objekt der Klasse Guarded_VESAGraphics (sinnigerweise in main.cc) und ruft im Rahmen der Systeminitalisierung in main die Methode Guarded_VESAGraphics::init() auf. Mit Guarded_VESAGraphics::find_mode() k├Ânnt ihr nun nach den Kriterien Aufl├Âsung und Farbtiefe einen Grafikmodus aussuchen und falls ein valider Modus gefunden wird mit Guarded_VESAGraphics::set_mode() setzen.

#include "syscall/guarded_vesagraphics.h" 
 
char buffer1[1280*1024*4]; 
char buffer2[1280*1024*4]; 
 
Guarded_VESAGraphics vesa(buffer1, buffer2); 

...

void main() {
...
    vesa.init();
    VBEModeData_t* mode = vesa.find_mode(1024, 768, 24);
    if (mode != 0) {
        vesa.set_mode(mode);
    }
...
}

Jetzt m├╝sst ihr noch daf├╝r sorgen, dass der Inhalt der Puffer auch in den Speicher der Grafikkarte geschrieben wird. Dazu dient die Methode Guarded_VESAGraphics::scanout_frontbuffer(). Diese ruft ihr entweder als Teil des Zeichenloops auf, immer dann wenn ein neuer Frame fertiggezeichnet wurde, oder f├╝hrt sie im Watch-Epilog (dort allerdings die Variante ohne Guard) aus, was daf├╝r sorgt, dass der Framebuffer der Grafikkarte mit einer festen Frequenz aktualisiert wird. Wenn ihr die mitgelieferte Beispielapplikation (user/santas_house.h) ohne Modifikationen ausf├╝hren wollt, dann m├╝sst ihr zweitere Variante implementieren.

Damit die Systemlast durch den Scanout nicht zu hoch wird, empfielt es sich, den Scanout nicht bei jedem Timerinterrupt durchzuf├╝hren, Ca. 40ms sind ein tragbarer Kompromiss zwischen der Bildschirmaktualisierungsfrequenz und dem Overhead durch die vielen Kopiervorg├Ąnge. Dabei sollte die Timerfrequenz im Bereich von ca. 10ms belassen, den Scanout, dann aber nur noch jedes zweite oder dritte mal durchf├╝hren.

Einbinden von Bitmaps

Wenn man analog zum Beispielprogramm eigene Bitmaps einbinden m├Âchte, so kann man diese mit GIMP einfach als C-Sourcecode (*.c) exportieren. Dabei sollte man KEINE Glib Typen verwenden. Dar├╝berhinaus muss das Bild MIT Alpha-Kanal exportiert werden. In der *.c Datei findet man dann die entsprechenden Bin├Ąrdaten, welche die Grafikbibliothek darstellen kann.

Durch die Verwendung von Bitmapgraphiken direkt im Sourcecode kann das erzeugte Systemimage jedoch sehr gro├č werden (allein das mit Optimierungen ├╝bersetzte Image der Beispielapplikation mit Grafik ist schon fast 500kb gro├č!). Der vom QEMU Makefile-Target verwendete Diskettenbootloader kann jedoch nur Systemimages mit maximal 512kb Gr├Â├če laden. Bei Verwendung des Netzwerkbootloaders existiert diese Einschr├Ąnkung allerdings nicht. Damit man jetzt nicht bei jedem Testen zum Test-PC rennen muss, ist im CIP-Pool eine neue QEMU-Version installiert, die auch direkt Systemimages, wie sie der Netzwerkbootloader verwendet, wie folgt booten kann:

benjamin@faui48b:~/mpstubs/loesung> /proj/i4bs/qemu-0.12.2/bin/qemu -kernel build/system -smp 2

Abgabe

3er Gruppen, welche die 7. Aufgabe zum Scheinerwerb abgeben m├╝ssen, sollten mit uns vorher absprechen, bis zu welchem Zeitpunkt sie ihre Aufgabe abgeben wollen und auch in etwa, was sie implementieren wollen. F├╝r alle anderen ist sowohl der Inhalt als auch der Zeitrahmen der Bearbeitung offen.

Die Abgabe selbst kann pers├Ânlich erfolgen, oder auch per Mail an Benjamin. Dabei ist es von unserer Seite her sehr w├╝nschenswert, wenn wir sowohl Sourcecode als auch das Bootimage erhalten w├╝rden.

L├Âsungen fr├╝herer Jahre

L├Âsungen fr├╝herer Jahre findet ihr unter /proj/i4bs/aufgabe7_loesungen. Die Images machen allerdings mit QEMU Probleme und sollten deswegen mit bochs verwendet werden. Dazu verwendet ihr einfach das startimage-Skript.
  Impressum Stand: 2011-01-31 10:46   BO, DL