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 - jgraef

Seiten: [1] 2 3 4
1
Offtopic / Re: DAS GEHEIMNIS EURES NICKNAMENS!!!
« am: 04. July 2009, 18:38 »
Forum: jgraef
IRC: janosch
Daraus lässt sich ja schließen, dass mein Name Janosch Gräf ist^^
2
OS-Design / Re: einfache Keycode-Tabelle
« am: 26. April 2009, 19:44 »
Hier findest du meine Keycode-Tabellen:
http://repo.or.cz/w/meinos.git?a=tree;f=keyboard_layouts

Das sind eigentlich nur C-Programme, die die Keycode-Tabelle in Binär ausgeben. Damit werden dann Keylayout-Dateien erstellt, die dann später auf der CD liegen.
3
OS-Design / Re: Kerneldesignfrage
« am: 22. April 2009, 17:21 »
Ich wollte fragen ob der Aufbau meines Kernel richtig ist?
Mein Kernel soll ein Mikrokernel mit einem monolithischen Teil:
Monolith:
 - Physische speicherverwaltung
 - Virtuelle speicherverwaltung
 - SATA/ATA treiber
 - fat32 foramt lesen (um die einzelnen Module des kernels zu laden)
 - elf format lesen
Ist das soweit richtig was ist überflüssig was fehlt ?
Was muss dann in den Mikroteil rein?

grüße Paul

Es gibt keinen Microkernel mit monolithischen Teil. Entweder Microkernel oder Monolith. In deinem Fall ist das wohl eher ein Monolith. Du könntest den ATA- und FAT32-Treiber auch in eigene Module machen. Laden kann die dir Grub.
4
Das Wiki / Re: Aufklärung Versteckte Sektoren bei FAT DS
« am: 14. April 2009, 16:27 »
Willkommen im Forum. ;)

Der FAT-Artikel sagt das auch ungefähr so:
Zitat
Reservierte Sektoren
Nach dem Bootsektor folgen optionale reservierte Sektoren. In diesen Sektoren kann z.B ein Bootloader untergebracht werden, wenn der Platz im Bootsektor nicht reicht. Der Bootsektor wird von FAT zu den reservierten Sektoren dazugezählt.
Die Ausgaben des Magazins sind relativ alt und werden nicht mehr geändert, in den einzelnen Artikeln des Wikis sind deswegen oft die besseren Informationen.

Ich glaube er meint nicht die reservierten Sektoren sondern wirklich die versteckten Sektoren ;)
http://lowlevel.brainsware.org/wiki/index.php/FAT#Bootsektor Offset 0x1C
Wenn man einen richtigen HD-Treiber hat, ist das aber unrelevant, da dieser dann mit den Partitionen jongliert.
5
Lowlevel-Coding / Re: Speicherproblem
« am: 30. March 2009, 17:07 »
Woher der Fehler kommt, kann ich aus den bescheidenen Informationen jetzt nicht erkennen. Aber eine gute Methode solch einen Fehler zu finden, ist es mit z.B Debugausgaben die Quelle des Fehlers einzugrenzen.
6
Lowlevel-Coding / Re: Multitasking aufbauen
« am: 19. March 2009, 19:20 »
Wie du argv bekommst hängt davon ab, wie du das gestaltest. Bei meinOS werden beim Aufruf eines exec() Daten wie argv und environ in ein SharedMemory-Segment gelegt und die ID des Segmentes im Kernel gespeichert. Wenn der neue Prozess gestartet wird, lädt er die Daten aus dem SharedMemory-Segment.

environ ist ein Array von Umgebungsvariablen:
http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html

Bei Kernelmodulen musst du selbst die Adressen relocaten und dann die Symbole für Hooks (z.B driver_init()) auflösen.
7
OS-Design / Re: Designfragen zu meinem OS
« am: 17. March 2009, 13:20 »
Eigentlich reicht ein TSS (pro Prozessor, ich nehme mal an du machst noch kein Mehrprozessor-OS).
Vom Grunde geht das so:

1) Auf Timer-IRQ warten
2) Wenn zuvor ein Prozess aktiv war, Register sichern
3) Nächsten Prozess suchen
4) Register und Adressspace laden und in Prozess springen

Man braucht natürlich als erstes mal eine IRQ-Verwaltung und eine Speicherverwaltung.

Beim Speichern und Laden von Registern muss man etwas tricksen, dass ist nämlich ein sehr kritischer Teil. Man muss ja direkt, wenn der Timer-IRQ aufgerufen wurde, die Register sichern (Viele finden sich auf dem Stack).
Am besten schaust du dir das mal bei einem anderen OS an.
Bei meinOS werden bei einem IRQ generell alle Register auf den Stack gepusht und dann ESP selbst. Die dann aufgerufene Funktion hat ESP dann als Parameter und erstellt dann eine Tabelle mit Pointern auf die Register. So können jeder Zeit Register gesichert und geladen werden.

Bei der Speicherverwaltung muss eigentlich nur möglich sein, die Executable zu laden und den Adressspace nachher schnell wechseln zu können. Außerdem musst du drauf achten, dass der Kernel in jedem Adressspace drin sein muss.

(Mit Adressspace meine ich eigentlich ein Pagedir, also ein abgeschotteter Adressraum für einen Prozess)
8
OS-Design / Re: Designfragen zu meinem OS
« am: 16. March 2009, 13:09 »
Das kannst du mit diesen Formeln ausrechnen:
port ist die Nummer des IO-Ports
byte ist das Offset des Bytes in der Bitmap
bit ist die Nummer des Bits im Byte

byte = port/8
bit = port mod 8 (in C: port%8)

Dh. in C kannst du so ein Bit setzen (und damit jemanden den Zugriff auf den Port sperren)
port und die Adresse von tss_bitmap musst du natürlich selbst wissen ;)
int port = 42;
char *tss_bitmap = 0xD00FC0DE;

tss_bitmap[port/8] |= 1<<(port%8);

PS: Bitmaps arbeiten meistens so, dass das erste Element das repräsentiert werden soll, mit dem ersten Bit repräsentiert wird.
9
Lowlevel-Coding / Re: Paging
« am: 11. March 2009, 17:26 »
Wenn ich dich richtig verstanden habe, suchst du nach einer Methode, freie virtuelle Adressen zu suchen.

meinOS macht das so:
'gefunden' = 0
gehe durch PD bis 'gefunden' = 'suche' {
  wenn PDE present dann {
    gehe durch PT {
      wenn PTE present dann {
        'gefunden' = 0
      }
      ansonsten {
        'gefunden'++
      }
    }
  }
  ansonsten {
    'gefunden' += 1024
  }
}
'gefunden' ist eine variable, die die anzahl an zusammenhängenden freien virtuellen pages angibt. 'suche' gibt an, wie viele pages gesucht werden.

Wenn man 1024 PDEs durch hat und immer noch nicht genug, dann sollte man natürlich auch abbrechen... aber dann hat man wohl auch ein problem ;)

Ist wohl nicht das schnellst (ohne caching und so), aber die einfachste methode.
10
OS-Design / Re: Kommandozeilendesign
« am: 05. March 2009, 17:17 »
Naja es geht ja nicht nur um Pipes. Implementieren muss man das dann natürlich immer noch. Aber das muss man sowieso.
11
OS-Design / Re: Kommandozeilendesign
« am: 04. March 2009, 19:25 »
Im Prinzip muss die Eingabe nur in einen Vektor gelesen werden. Das gestartete Programm bekommt das dann als argv. argv[0] gibt das Programm an (muss z.B in /bin gesucht werden).

Man kann natürlich auch noch Pipes und alles mögliche einbauen, aber das macht bestimmt viel Arbeit. Eine Lösung wäre es, sowas wie bash zu portieren.
12
Lowlevel-Coding / Re: Eigene stdlibc einbinden
« am: 13. February 2009, 20:11 »
1) Die Objektdateien deiner stdlibc zusammenpacken:
$ ar rs libc.a *.o
Mit ar packst du deine Objektdateien zu einer Lib (libc.a) zusammen.

2) Kernel kompilieren
$ gcc <deine ganzen optionen> -L <verzeichnis indem libc.a liegt> -lc
Das -L bewirkt, dass gcc auch in dem angegebenen Verzeichnis nach Libs sucht. Mit -lc wird die Library libc.a eingebunden.
13
Lowlevel-Coding / Re: Multibootstruktur funktioniert nicht
« am: 12. December 2008, 18:53 »
Darüber habe ich mich ja auch gewundert.
Meine Methode zur Bestimmung der Zahlen stimmt aber.
Das habe ich getestet.
Anscheinend hast du nicht recht, sonst würde ja nicht "n" rauskommen.
14
OS-Design / Re: Frage zu meinem Kerneldesign
« am: 03. December 2008, 19:29 »
Wie kann ich mir das mit den Interrupts dann vorstellen?
Ich kann meine Prozesse dann in die Liste eintragen wenn ich möchte, oder?
Welche Art von Interrupt muss es denn dann sein, damit ich den Prozess anspreche?
Kann ich damit dann Abhängigkeiten realisieren, oder wie?
Also dass ein Prozess das Ergebnis eines anderen braucht um zu beginnen.
Ist das der Sinn dahinter?
Wenn ja, woher weiß mein Kernel, dass der Prozess auf den gewartet werden muss fertig ist?
Also langsam wird's exotisch ;)
Interrupts haben eigentlich nichts mit Prozessen zu tun. Die brauchst nur den IRQ 0 für den Scheduler und dann wollen Prozesse eventuell einen Handler für IRQs anmelden.
Abhängigkeiten? Warten? Das ist eine ganz andere Ebene. Das wirst du dann wahrscheinlich über IPC realisieren.

Du musst jetzt erstmal grundlegende Dinge für deinen Kernel haben. Für den Anfang wäre eine Speicherverwaltung (phys und ein malloc() für den Kernel) nicht schlecht. Wenn du damit fertig bist, kannst du eine Prozessverwaltung bauen, wobei du dann auch den Speicher deiner Prozesse verwalten musst. Erst wenn dann dein erster Prozess läuft kannst du dir Gedanken darüber machen, wie diese miteinander kommunizieren.
15
OS-Design / Re: Frage zu meinem Kerneldesign
« am: 02. December 2008, 23:53 »
Nabend zusammen,

ich habe mir mal Gedanken über meinen Kernel gemacht.
Mein Kernel soll wirklich nur das Nötiggste machen.
 - GDT/IDT/ISR/IRQ/PIC/PIT initialisieren
 - den Scheduler bereitstellen
 - Methoden für den Speicher (memset, etc)
Ich denke du brauchst Sachen wie malloc() (womit eine Menge anderer Sachen verbunden sind)
Zitat
Der Rest soll über Treiber gemacht werden:
 - Dateisystem , Paging und alles was sonst noch an Treibern fehlt
Diese Treiber sollen erst nachgeladen werden (sprich nicht mitkompilieren).
Wie kann ich die denn zur Laufzeit laden?
ELF in den Speicher laden (deswegen wäre es außerdem günstig Paging im Kernel zu haben) und Symbole auflösen.
Zitat
Nun zu meinen Fragen:
Ist dieser Aufbau überhaupt sinnvoll?
Naja bis auf, dass ich Speicherverwaltung auch in den Kernel reinmachen würde, sieht das für mich zumindestens sinnvoll aus. Ist natürlich nicht besonders ausführlich, deswegen kann ich das nicht 100%ig beurteilen.
Zitat
Bei dem Scheduler habe ich ein paar Verständnisfragen:
 - Was brauch ich denn alles an Strukturen?
Du brauchst eine Struktur für einen Prozess. Diese Struktur muss sachen, wie Register und Speicherzuordnung (z.B Pagedir) enthalten. Aber auch Dinge wie Name, PID, Parent, Children, geöffnete Objekte (z.B Dateien) kann man reinmachen.
Zitat
   Ich habe mir gedacht, dass ich einerseits einen Prioritätsparameter habe, dann habe    ich noch einen counter der die Rechenzeit mit zählt und dann die Strukturen für die Register und den Stack.
Jo, wie ich oben gesagt habe, aber Speicher wäre noch wichtig.
Zitat
Wie rette ich den gesamten Prozessor in die Strukturen?
Mein Programm wird doch über einen Interrupt unterbrochen, wenn ich nun die Behandlungsroutine aufrufe steht in meinem PC doch schon eine andere Befehlsadresse. Wo bekomme ich die alte her, damit ich sie speichern kann?
Wenn der Interrupt aufgerufen wird, liegen einige Register (darunter auch EIP und ESP) auf dem Stack. Da kannst du die dann herholen und in die Struktur "retten".
Zitat

Wenn mein Scheduler arbeitet muss ich doch ein paar Interrupts maskieren, oder?
Nicht dass ich wüsste.
Zitat
Dachte jetzt mal an den PIT und Software-Interrupts.
Wie mache ich das?
Der PIT muss am Anfang ge-remappt werden. Bei mir ist er imho auf 0x20 bis 0x30 (0x00-0x1F sind Exceptions). Dann hast du da deine IRQs. Danach kommen bei mir ein paar andere Interrupts (APIC, unwichtig für dich). Und dann hab ich meinen Softwareinterrupt bei 0x37. Du kannst ihn natürlich auch woanders hinmachen (Linux hat ihn z.B bei 0x80). Du musst eigentlich nur den Interrupt in der IDT registrieren und den Handler zuweisen. Im Handler kannst du dann Daten (z.B welcher Syscall aufgerufen werden soll, usw.) aus dem Speicher des Prozesses oder aus den Registern holen.
Zitat
Das war es erst einmal an Fragen.
Da kommen bestimmt noch mehr.
Fragen sind bei uns immer willkommen, solange der Gegenüber vorher selbst nachdenkt :) (was, wie ich finde, du gut gemacht hast)
16
Offtopic / Re: Grub Shell in makefile
« am: 29. November 2008, 15:06 »
Ich weiß dass es da eine sinnvollere Möglichkeit gibt, aber mir fällt im Moment nicht ein, wie das ging. Aber du kannst einfach per Pipe reinschreiben.
echo -e "device (fd0) /tmp/testimg\nroot (fd0)\nsetup (fd0)\nquit" | grub
17
Lowlevel-Coding / Re: Escape-Scancode an falscher Stelle
« am: 15. November 2008, 01:02 »
Nein da kann das auch nicht passieren:
1. Wird das im Moment noch ohne IPC an den Kernel geschickt (per Syscall)
2. Würde er es dann auch nicht falsch interpretieren
18
Lowlevel-Coding / Re: Escape-Scancode an falscher Stelle
« am: 14. November 2008, 15:00 »
Hi,

Der Treiber liest den Scancode ja selbst per inb() ein und gibt dann den Scancode aus.

static char keyboard_read() {
  if (inb(KEYBOARD_PORT_STATUS)&1) return inb(KEYBOARD_PORT_DATA);
  else return 0;
}
...
  scancode = keyboard_read();
  fprintf(stderr,"Scancode: 0x%02x\n",scancode&0xFF);
...
19
Lowlevel-Coding / Re: Escape-Scancode an falscher Stelle
« am: 13. November 2008, 17:09 »
Big und Little Endian irgendwie verdreht?
Liest du byte-oder wordweise ein?
Byteweise.
Und sonst wuerd ich sagen da is evt irgendwo ein Byte verloren gegangen....
So, viel mehr als im IRC konnt ich jetz auch nich sagen :P
Aber ich komm grad nich ins IRC, is hier blockiert; d.h. ich muss mich anderweitig beschaeftigen...
Wo soll denn da was verloren gegangen sein?
20
Lowlevel-Coding / Escape-Scancode an falscher Stelle
« am: 08. November 2008, 22:02 »
Hi,

Ich bin gerade dabei einen Tastatur-Treiber zu schreiben. Funktioniert auch alles super, bis auf Tasten, die escaped werden. Irgendwie bekomme ich erst den normalen Scancode und dann den Escape-Code. Dadurch denkt mein Treiber natürlich dass die normale Taste gedrückt wurde.

Wenn ich '/' auf dem Numpad drücke bekomme ich folgende Scancodes:
Zitat
Scancode: 0x35
Scancode: 0xe0
Scancode: 0xb5
Scancode: 0xe0
Wird dann natürlich als '-' erkannt, wegen dem 0x35.
Seiten: [1] 2 3 4

Einloggen