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

Seiten: [1]
1
Was für eine Ausgabe erwartest du denn? Wenn die ersten beiden Pixel schwarz sind, (Wert 0x00) dann enthält der String Ausgabe ja gleich ein Nullterminierungzeichen und somit wird nichts ausgegeben. Vielleicht solltest du den Wert noch in einen String umwandeln?
2
Lowlevel-Coding / Re: FAT12 Handmade Frage
« am: 02. March 2016, 08:49 »
Zitat
1. Ich hab mal testweise die 3 Byte nach dem Bootloader weggelassen (db   0xff,0x0f,0xf8) und das Image wurde dennoch als FAT12 erkannt. Wozu braucht man die 3 Bytes also ?
Diese Werte sehen nach FAT12 Einträgen für die ersten beiden Cluster aus. Das setzt hier aber voraus, dass es nur eine FAT gibt. Disketten-Images nutzen üblicherweise 2 und dann müssten diese Einträge auch in der 2. FAT stehen.

Zitat
... erstellt man 22 Null-Sektoren. Mit den 22 Sektoren löscht man aber nur die beiden FATs und einen Teil des Root-Directories. Sollte man nicht nach dem Bootsektor die darauffolgenden 9+9+14 = 32 Sektoren löschen (FAT1+FAT2+RootDir) um ein jungfräuliches Diskettenimage zu erhalten ?
Wer sagt, dass das Root-Verzeichnis unbedingt 14 Sektoren haben muss? Nur weil es üblich ist, muss es hier nicht der Fall sein. Den richtigen Wert kannst du aus den Werten des Boot-Parameter-Blocks ermitteln.


Ich habe aber irgendwie das Gefühl, dass mit den Werten was nicht stimmt.
3
Offtopic / Re: Frohe Weihnacht
« am: 24. December 2015, 18:04 »
Von mir auch eine fröhliche Weihnacht und schöne Feiertage. :-)
4
Mach dir keine Sorgen, das ist normal. Paging ist super, um sich Knoten ins Hirn zu denken, bis man es mal kapiert hat. ;)
Oh ja, das kann ich nur bestätigen. Aber wenn man mal richtig dahinter gestiegen ist, merkt man auch, dass man oftmals gar nicht mehr so kompliziert denken muss. :-D
Ich habe aber auch an meiner Methode zum mappen einer Page zu knabbern gehabt. Dafür prüft sie jetzt, ob die Page schon gemappt ist, reagiert auf 4KB wie auch auf 4MB Pages, allokiert eine neue physische Page und sogar eine neue PageTable, wenn sie denn benötigt wird.
5
Lowlevel-Coding / Re: anfängerfrage: problem mit tutorial
« am: 12. November 2015, 09:07 »
Freut mich, dass ich helfen konnte.  :-)
6
Lowlevel-Coding / Re: anfängerfrage: problem mit tutorial
« am: 09. November 2015, 10:50 »
Ich habe noch einen Fehler in deinem Code gefunden: Beim Laden der GDT - Die Assembler Anweisung lgdt erwartet einen GDT Descriptor, nicht die GDT Selber.

Der Descriptor hat folgenden Aufbau

struct SGDTDescriptor {
    uint16_t size;        //die Größe der GDT in Bytes - 1
    uint32_t offset;     //die lineare Startaddresse der GDT
} __attribute__ ((packed));
7
Zitat
Ich wollte damit nur sagen, dass du manche Geräte erst sehen/ansprechen kannst, wenn du bestimmte andere Geräte funktionierend in deinen Kernel integriert hast.
Dessen bin ich mir bewusst. Aber trotzdem danke. :-)

Zitat
Was die I/O-Ports angeht: Das ist genau das, was ich weiter oben beschrieben habe. Einfache (ISA-)Geräte kannst du nicht identifizieren, sondern nur auf gut Glück ein paar Ports lesen/schreiben und schauen, ob das, was da passiert, ungefähr so aussieht wie das, was dein gesuchtes Gerät dort tun würde. Deswegen gibt es da nichts zu initialisieren.
Aber ein PCI Gerät kann in den BARs auch nach IO-Ports verlangen. Das wird durch eine 1 in Bit 0 im BAR angezeigt. ein Massenspeichercontroller für ATA oder SATA würde da z.B. die standard Ports 0x1F0 bis 0x1F7 haben.

Edit: Eine Frage noch zu den Descriptoren: Muss ich lgdt, lidt, usw. physische oder virtuelle Adressen nach der Aktivierung von Paging übergeben?
8
Zitat
Das weiß ich nicht. Ich kann mir aber gut vorstellen, dass manche BIOSse nur das initialisieren, was sie zum booten brauchen.
Soll ich also am besten alle Geräte neu initialisieren? Das stelle ich mir nur im Falle von I/O Ports schwer vor, da ich nicht weiß, welche Ports schon vom System benutzt werden...

Zitat
Eine PCI-PCI-Bridge schenkt dir einen neuen PCI-Bus, ...
Tja, da hapert es wohl noch mit meinem Verständnis. Auf PCI greife ich doch über 2 Register zu. (1 mal Adresse und 1 mal Daten) Das Adressregister ist aufgeteilt in Bus, Gerät und Funktion. Damit habe ich doch schon mehrere Busse. Wofür dann noch Bridges? Entweder kann ich auf die anderen Busse nur zugreifen, wenn die Bridge richtig angelegt ist, oder die Bridge selber stellt nochmal 2 Ports (Daten und Adresse) zur Verfügung. Das wird im Wiki leider nicht so richtig ersichtlich.

Ich dachte in diesem Fall auch eher, dass ich einen Treiber PCI habe, der alle Geräte durchsucht und dann Instanzen von PCIDevice anlegt. PCIDevice wiederum scannt das Gerät und lädt den entsprechenden Treiber nach. (Disk Controller, VGA, usw.)  In dem Falle hat der Treiber PCI einfach eine Methode "rescan", die erneut nach Geräten sucht, aber nur für neue Geräte die Treiber lädt.
(Wenn ich vom Treiber laden rede, dann meine ich, dass der Treiber nur geladen wird, wenn er noch nicht geladen ist, und dass dann eine neue Instanz von der Klasse angelegt wird.)

Zitat
Dann brauchst du dir über meine Hinweise auch keine großen Gedanken machen.
Hab ich auch erst gedacht, aber dann ist mir eingefallen, dass ich trotzdem Treiberklassen brauche und mir somit über alles klar werden muss. :-D Außerdem will ich ja lernen... :wink:
9
Zitat
oder jedes Dateisystem stellt sein eigenes VFS-Interface bereit ("Laufwerksbuchstaben").
Die Idee gefällt mir, weil ich sowieso auf Laufwerksbuchstaben hinaus wollte. Aber dise Buchstaben müssen ja auch verwaltet werden. (Damit es keine doppelten gibt) Also werde ich doch ein zentrales VFS benötigen... Das kann ich dann bei Bedarf auch schnell zu einem Linux-Style VFS umprogrammieren.  :-D Da fällt mir ein: Das VFS kann sich ja einfach alle Instanzen der Dateisystem Treiber geben lassen. 8-)

Zitat
dass du die Treiber in einer gewissen Reihenfolge laden musst, und dass du gewisse Treiber u.U. auch mehrfach laden musst (z.B. PCI-PCI-Bridges).
Das mit den PCI-PCI-Bridges verstehe ich noch nicht so ganz. Ich weiß, dass sie 2 Busse miteinander verbinden, aber sind die nicht schon vom BIOS initialisiert? Ist nicht alles vom BIOS initialisiert was PCI betrifft?
Allerdings muss ich Treiber nicht mehrfach laden; Ich erstelle nur eine weitere Instanz vom Treiber. (c++) ;)

Ich denke, ich programmiere erst mal den kernel fertig. Der muss noch die physiche und virtuelle Speicherverwaltung bekommen. Danach fange ich einfach mal mit den Interfaces an und merke ja sofort, wenn sich Probleme ergeben und. Danach kommt Multithreading und die Treiber. Und dann als erstes eine Shell...

Edit: Vielleicht sollte ich einfach alle Treiber in den Kernel integrieren. Das ist ja nur ein Hobbyprojekt und so groß wird das sicher auch nicht.
10
Zitat
Das Treiber-Interface sollte aber natürlich weder FAT12 noch FAT sein, sondern was allgemeines für Dateisysteme, wo du dann später auch z.B. einen ext2-Treiber einfach reinhängen kannst.
Da hast du natürlich recht. :D Ich war anscheinend schon bei der Implementierung. Diese kann man bei FAT ja eigentlich zusammenfassen.

Die Funktion GetInfo soll ja unter anderem eine Interface-ID zurückgeben, damit man weiß, welches Interface der Treiber implementiert. (getInstance liefert ja nur einen Zeiger auf ein Objekt zurück) Jetzt muss mir nur noch eine Lösung für folgendes Problem einfallen: Wer und wie erkennt wann, welcher Treiber benötigt wird? Um bei den Dateisystemen zu bleiben: Der ATA Treiber erkennt eine Festplatte, wie erkenne ich, ob ich eine Instanz von FAT, EFS, oder sonstwas brauche? Soll einfach jeder Treiber mal geladen und getestet werden? Soll der ATA Treiber das Dateisystem erkennen sollen? (Dann hätte er wissen, das er nicht haben dürfte. Wird problematisch, wenn es einen Treiber für ein neues Dateisystem gibt. Dann müsste man auch den ATA Treiber anpassen)

Ich wollte erstmal einfach alle Treiber aus dem Verzeichnis Driver laden. Wahrscheinlich erstelle ich eine Liste pro Interface mit den zugehörigen Treibern. Vielleicht bekommt der Kernel auch eine Funktion Interface getDriverByIID(InterfaceID, index), dann könnte jeder Treiber sich seinen Subtreiber selber erstellen. Aber wie mache ich das bei folgender Struktur? PCI Treiber durchsucht alle PCI Geräte, für jeden gefundenen DiskController erstellt er eine Instanz des zugehörigen Treibers, dieser erstellt pro angeschlossenem ATA/ATAPI Device wieder eine Instanz, diese wiederum pro Dateisystem ebenfalls eine Instanz. Aber am Ende muss es genau eine Instanz des VFS Treibers geben, der dann alle Instanzen der Dateisysteme zusammenführt.

Viele Grüße
Krendor
11
Hallo Kollegen der Hobbybetriebssystementwicklung,

nach langer Zeit steige ich nun wieder in die Betriebssystementwicklung ein und habe auch schon eine Vorstellung davon, was mein Betriebssystem können soll. Die Featureliste ist schon recht lange, aber nur, weil ich alles im Detail erwähne. Zusammengefasst in folgende Begriffe:
Paging, multithreading, Inter process communication, vga text modus, shell, porting gcc + standard c lib, executing elf files, read cdrom, read/write hdd, FAT12/16/32 und iso9660.
Damit sollte man schon etwas arbeiten können. Später kann man das ganze ja um Sound, netzwerk, acpi, usw. erweitern.

Jetzt langsam zu meiner Frage. Ich will nur sicher gehen, dass ich keinen Denkfehler mache. Ich definiere Interfaces (C++) für die Treiber und die Treiber implementieren diese dann. Z.B. gibt es ein Interface FAT12 oder meinetwegen auch FAT allgemein, und für jedes Filesystem wird dann ein Objekt dieses Interfaces angelegt. Die Treiber laufen also im Ring 0, also im Kernel. Die Treiber liegen als ELF Relocation Datei vor und werden vom Kernel geladen. Es gibt 4 Funktionen, die implementiert werden müssen: GetInfo gibt z.B. zurück, was für ein Treiber das überhaupt ist | getInstance gibt ein Object des Treibers zurück (das sich an das Interface hält), Initialize and Release sind wohl selbsterklärend. GRUB2 lädt nur die Treiber als Module, die für das nachladen weiterer Treiber nötig sind. Der Kernel geht die Module durch, schaut nach was für ein Treiber es ist, löst die Relocations auf, und kann ihn dann nutzen. Für Anwenderprogramme in Ring 3 gibt es dann eine eigene API, die per Interrupt mit dem Kernel kommuniziert.

Habe ich dabei irgendwas übersehen?

Viele Grüße
Krendor
12
Offtopic / Re: Binäruhr
« am: 26. August 2009, 13:06 »
Du musst nur aufpassen, dass der Mikroprozessor auch genug Strom für die LEDs liefern kann.

Schau im Datenblatt nach etwas wie "Maximum Output Current", meißt
abgekürzt mit Io, und merke dir den Wert. Wenn er kleiner ist, als die
LED braucht, dann musst du einen Treiber (nicht Software :P) benutzen.
Dazu kannst du entweder einfach einen Transistor benutzen oder du
nimmst bestimmte ICs. Wenn du 7-Seg.-Anzeigen benuten
möchstest, kannst du auch den CMOS-4511 benutzen. Der hat 4
Eingänge (BCD), 7 Ausgänge (Für die Segmente) und ein paar Extras wie
einen Lamptest und Ripple-Blanking. Dieser wandelt BCD auf die 7
Segmente um und treibt sogar noch bis max. 20 mA.

Egal, was du verwendest: Vorwiderstand nicht vergessen.

Viele Grüße
Sebihepp
13
Danke, danke. Ich habe meine Quellen unten vermerkt. Ich schreibe den Artikel jedoch ganz frei, also ich kopiere nichts.

Es wird noch ein wenig dauern, bis ich da alles durch habe. Und das mit dem "Du" werde ich baldmöglichst verbessern. Ich war mir nicht sicher.
14
Hallo,

ich werde in nächster Zeit aktiv an dem VGA Artikel der WIKI schreiben. Da dies mein erster Beitrag ist, würde ich mich über Lob und Kritik sehr freuen.

Viele Grüße
Sebihepp
15
Offtopic / Re: WIKI erweitern
« am: 25. June 2009, 18:11 »
Vielen Dank. Wie man Beiträge schreibt, formatiert, etc. werde ich schon
finden. Ich wollte eher danach fragen, ob es erlaubt ist, dass ich Beiträge
verfasse.  :-D
Das hat sich durch dich jetzt geklärt, danke. Ich werde mich demnächst
registrieren.

Viele Grüße
Sebastian
16
Offtopic / WIKI erweitern
« am: 25. June 2009, 15:48 »
Hallo,

ich habe leider noch nicht viel Ahnung, wie genau eine WIKI funktioniert.
Aber ich würde gerne ein paar Dinge hinzufügen. Ein Tutorial für VGA
zum Beispiel. Natürlich achte ich darauf, alle Quellen anzugeben.

Ist das möglich, oder wie funktioniert das?

Viele Grüße
Sebastian
17
Lowlevel-Coding / Re: Kernel mit Pascal
« am: 03. June 2009, 23:46 »
Ich war Anfangs auch gegen GRUB.

Ich will auf niedrigstem Level programmieren um unabhängig zu sein.
Warum soll ich dann GRUB benutzen. Dann hätte ich ja nichts gelernt.

Ich habe dann ein paar BootLoader selber geschrieben, die konnten
mehr oder weniger. Jedenfalls hat es keiner zu einem FAT12 Treiber
geschafft. Aber ich habe sehr viel gelernt! Ich habe kleine RealMode
Programme geschrieben, alle in Assembler ohne auf andere Programme
zurückzugreifen. Darunter eines um den jeweils ersten Sektor der Diskette
oder der Festplatte auszulesen, eines um Musik mit dem Speaker beim
Booten auszugeben, ...

Inzwischen programmiere ich an einem (sehr kleinem) OS, für welches
ich GRUB benutze, um mir den CDROM Treiber aufzuschieben. Und dann
programmiere ich nebenbei noch niedliche und nützliche kleine RMode
Programme.

Wenn du also ein OS entwickeln willst: Ich rate dir dringenst zu GRUB!
Geht es dir darum, den PC besser kennenzulernen und einfach kleine
und unabhängige Programme zu schreiben, dann versuch dich mal an
einem kleinen Bootloader. Erwarte aber nicht zu viel. Und du kannst im
Nachhinein eine ELF datei mit dem Linker zu einer Binary linken.

Viele Grüße
Sebastian
18
Lowlevel-Coding / Re: Stack funktioniert nicht (rmode)
« am: 03. June 2009, 23:38 »
Hihi, den Fehler hatte ich auch schon gemacht.  :-D

Bei einem call wird die Rücksprungadresse auf den Stack gelegt.
Den Rest kannst du dir ja zusammen reimen...

Viele Grüße
Sebastian
19
Offtopic / Keine Aktivierungsmail bei AOL
« am: 15. May 2009, 14:52 »
Hallo,

endlich habe ich es geschafft, mich zu registrieren und zu aktivieren.
Ich versuche nun schon seit mehr als 2 Jahren in dem Forum hier
mitzuwirken. Leider bekam ich nie eine Mail als AOL user. Auch nicht,
nachdem ich sie mir erneut zuschicken lies. Im Spam-Ordner war auch
nix (Ausserdem habe ich den Filter deaktiviert).

Jetzt endlich fand ich die Möglichkeit, die Mailadresse zu ändern.  :-D
Ich habe mir einfach eine weitere Mailbox bei GMX gemacht.

Ich spiele jetzt seit etwa 3 Jahren auf dem Gebiet der hardwarenahen
Programmierung herum und habe bereits kleinere Programme geschrieben,
die alle ohne ein OS laufen. Einmal ein Programm zum auslesen des
ersten Sektors der Festplatte (MBR) und der Diskette, ein Anderes spielt
mit Hilfe des Speakers eine kleine Melodie (Hymne der Zeit, Zelda Ocarina of
Time) ab, ... . Demnächst will ich auch ein kleines OS schreiben. Kleiner als DOS. Ich bin gerade dabei das zu Planen. Ich dachte natürlich an HD und
FD support (vorerst nur FAT), Tonausgabe per Speaker, 25x80x16 Farben
Textmodus, und natürlich das ausführen von Programmen. Das OS soll
natürlich im ProtectedMode mit Singletasking laufen. Nun versuche ich das
alles zu Ordnen und mir einen Plan zu machen, welche Module ich aufteile.

Mein Name ist Sebastian, ich bin jetzt 22 Jahre alt und wohne in Heidelberg
(BW). Ich studiere jetzt Informatik im 2. Semester.

Herr Gott S.., das blöde Textfeld springt nach der Eingabe immer wieder nach oben. Was soll das!?

Viele Grüße
Sebihepp
Seiten: [1]

Einloggen