Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - fabuloes

Seiten: [1]
1
Lowlevel-Coding / Re:Fehler bei IRQ-Behandlung
« am: 07. May 2011, 12:42 »
Also der Code sieht immo so aus:

    irq_handler: # Wird von jeder Exception ausgegeben

               pusha
               push %ds
               push %gs
               push %es
               push %fs

               call isr

               pop %fs
               pop %es
               pop %gs
               pop %ds       # Hier hängts

               popa

               iret

Und die dazugehörige ISR:

     isr:

               enter $0, $0

               # Einen String zum Test ausgeben (msg = "Hallo Interrupt!")
               pushl $msg
               call put_str # Gibt den String aus
               addl $4, %esp

               leave
               ret



2
Lowlevel-Coding / Re:Fehler bei IRQ-Behandlung
« am: 07. May 2011, 12:15 »
Okay, also die Exception 0x08 wird gefangen, der PIC ist aber richtig geremappt. Beim Aufruf der ISR für die Exception hängts dann beim pop des Datenselektors %ds, weiß jemand woran das liegen kann? (alle Datensegemtnselektoren zeigen auf den 2ten Eintrag in der GDT, aber nur bei %ds funktioniert irgendwas nicht :S)
3
Lowlevel-Coding / Fehler bei IRQ-Behandlung
« am: 05. May 2011, 20:58 »
N'Abend

Ich bin gerade dabei meine IDT für die IRQs einzurichten, also mit Software-Interrupts funktioniert alles super soweit.
Jetzt habe ich den PIC initialisiert, die IRQs alle unmaskiert und enablet , usw. aber wenn ich jetzt zum Test mal alle Einträge in der IDT auf eine Test-ISR (also mit Sicherung der Segmentregister, usw.) setze, erhalte ich sofort nach dem Start eine Exception 0x08 mit dem Errorcode e=0000...
Hat irgendjemand eine Ahnung was ich falsch machen könnte?

Gruß
4
Lowlevel-Coding / Re:Ein paar Verständnisfragen zum PM
« am: 03. May 2011, 20:23 »
Okay, danke an alle, ihr habt mir sehr geholfen :)
5
Lowlevel-Coding / Verständnisfragen zu Segmentregistern
« am: 03. May 2011, 19:56 »
Ich bins mal wieder, diesmal mit ein paar Fragen zu den Segmentregistern im PM

Die Register haben bei mir im Moment standardmäßig die Werte 0x10, bzw 0x08 (nur der Codesegmentregister), wenn
man das mal auflöst dann heißt das doch, dass alle Datensegmentregister gerade auf den 2. Eintrag der GDT zeigen (mit Privilege 0), und der Codesegmentregister auf den 1. (auch mit Privilege 0), oder? Meine GDT ist auch so aufgebaut, dass der 1. Eintrag das Codesegment für den Kernel ist und der 2. das Datensegment.
Werden jetzt dann später beim Wechseln in den Kontext eines Prozesses im Usermode einfach die Segmentregister auf die
für sie reservierten Segmente gesetzt? Weil das Verändern des %cs Registers bei mir noch eine Schutzverlezungsexception auslöst, weiß ich nämlich nicht wie ich das dann später handhaben soll...

Verbessert mich wenn ich totalen Stuss schreiben sollte...  :wink:
6
Lowlevel-Coding / Re:Ein paar Verständnisfragen zum PM
« am: 01. May 2011, 21:04 »
Also das heißt doch dann, dass ich erst Paging aktiviere (linear auf physisch) und danach die GDT lade oder?
Und wegen dem Videospeicher: Ich habe den Videospeicher von 0xB8000 bis 0xBFFFFF mit dem Code aus dem Tutorial gemappt, d.h. mit paging_map_physical(0x0, 0x0, 0xFFFFFFFF) gemappt, d.h. doch eigentlich, dass der gesamte Speicher auf eine Page gemappt ist (?)
7
Lowlevel-Coding / Re:Ein paar Verständnisfragen zum PM
« am: 01. May 2011, 19:00 »
Okay gut danke an alle :)
Jetzt habe ich noch eine Frage zum Paging. Wenn ich Paging aktiviere (nachdem ich die GDT und die IDT geladen habe, also die GDT so wie oben mit einem Code- und einem Kernelsegment mit Limit 0xfffff) und ein Pageframe auf den gesamten physischen Speicher mappe, funktioniert meine Ausgabe auf dem Bildschirm nicht mehr, also meine printf()-Funktion, die mit einem Zeiger auf den Videospeicher ab 0xB8000 zugreift. Eine Exception tritt nicht auf, aber es wird wie gesagt nichts auf dem Bildschrim ausgegeben und es muss mit dem Paging zu tun haben.
8
Lowlevel-Coding / Re:Ein paar Verständnisfragen zum PM
« am: 01. May 2011, 14:21 »
Okay, also ich setze die GDT dann also auf den gesamten physischen Adressraum und "lege" das Paging dann darüber.
Aber was für ein Deskriptor sollte das dann sein (Codesegement, Datansegment, ...) bzw. welche Flags soll ich für den einen Deskriptor setzen?
9
Lowlevel-Coding / Ein paar Verständnisfragen zum PM
« am: 30. April 2011, 12:13 »
Ich bins mal wieder :D

Also ich habe ein paar Fragen zum PM, v.a. der Segmentierung, der GDT und Paging:

1. Wenn ich Paging verwende, brauche ich dann eine GDT?

2. Wenn ich mit GRUB mein OS boote, befinde ich mich ja im PM, und eine (grundlegende?) GDT ist auch schon angelegt. Wenn ich nun keine GDT benötige (kommt auf die Antwort oben an), da ich pagen will, kann ich diese GDT irgendwie deaktivieren?

3. Hängt die IDT von der GDT ab, oder kann ich die auch mit Paging implementieren?

Grundlegende, noobige OS-Fragen, aber ich hoffe dass sich doch jemand erbarmt mir zu helfen :)
10
Okay danke nochmal taljeth, ich schau mir die Basics nochmal an  :-)

Dann bau ich meinen bisherigen Code mal um.

Danke an alle die sich beteiligt haben :)
11
Also vielleicht sollte ich noch sagen, das ich die OS-Entwicklung nicht mit lowlevel begonnen hab, sondern hierüber:http://www.tutorials.de/c-c-tutorials/304626-ein-betriebssystem-mit-c-entwickeln.html

Dort wird ein einfacher Kernel mit dem GNU C Compiler und Assembler erstellt, und ich habe mir da auch keine weiteren Gedanken über den Compiler gemacht.
Zur Frage "Warum im Realmode?": Ich wollte einfach klein anfangen, und mein Ziel war nicht unbedingt ein umfangreiches OS zu kreieren, sondern viel mehr ein bisschen hardwarenah zu programmieren, und ein wenig Grundverständnis für Betriebssysteme (wenn auch nur im RM) zu sammeln, und sich vielleicht später mal mit dem PM genauer zu beschäftigen.

Welchen Compiler empfehlt ihr zur OS-Entwicklung?
12
Also ich benutze den GNU C Compiler, und ich hab jetzt ein bisschen recherchiert und rausgefunden, dass es beim gcc gar keine FAR LAbels oder Makros gibt :(

Danke an erik.vikinger, ich habe mich noch mal um die Segmentierung gekümmert, aber ich versteh das immer noch nicht so wirklich.
Mit einem 32-Bit Prozessor kann ich doch bis zu 4GB RAM direkt adressieren (also 0x00000000 bis 0xFFFFFFFF), und da ich im Realmode arbeite müsste ich doch jede beliebige Adresse per Zeiger erreichen können oder (also ohne Segmentierung)?

Tut mir Leid wenn das vielleicht eine ziemlich kiddiemäßige Frage zur Adressierung ist  :oops:
13
Also Danke erstmal für die schnelle Antworten :-)

@taljeth
Also ich habe bisher nur versucht die Adresse, die mir der Adressoperator & liefert mit einem Zeiger an der Stelle 0x24 (also jetzt IRQ 9) zu setzen, da ich bei der Sache mit Segmentierung und Offsets nicht so ganz durchblicke.  :oops:
Das Interruptflag müsste gesetzt sein (ist doch nur aus wenn der cli-Befehl ausgeführt wurde?), und ein EOI dürfte ich nicht vergessen haben können, da ich selbst noch keine Interrupts vorher verwendet habe. Achja das Keyboard ist initialisiert ( outb(0x60,0xF4) ), und der Eingabepuffer des KBC müsste auch leer sein :-(

Also ich habe versucht die Adresse an 0x24 (Müsste eigentlich IRQ 9 sein) zu setzen, aber es tut sich immer noch nichts.
Ich wäre sehr dankbar wenn sich jemand die Mühe macht, den Teil mit der Manipulation der IVT mal mit einem Codeschnippsel zu verdeutlichen.  :-)
14
Hallo,

Wie genau setze ich eine eigene Funktion als ISR (z.B. einen Tastaturhandler, der bei einem IRQ 1 von der Tastatur aufgerufen wird)? Ich habe schon versucht einfach die Adresse der Funktion per Zeiger an die Stelle 0x4 (die Stelle in der IVT für Tastatur IRQs), aber die Funktion wird bei einem IRQ 1 einfach nicht aufgerufen.

Kann mir das jemand nochmal genau erklären? :)
Seiten: [1]

Einloggen