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.


Themen - Vogtinator

Seiten: [1]
1
Lowlevel-Coding / Qemu-Bug und Ideen
« am: 03. October 2012, 21:44 »
Hallo, ich hab` da mal ein paar Fragen:

Ich habe jetzt einmal eine eigene physische Speicherverwaltung geschrieben, die auch soweit alles macht, wie ich es will,
nur die Initialisierung funktioniertr nicht, ich hatte immer einen Nullpointer zurückbekommen, es wird phys_free(0) aufgerufen.
Diesen Fehler konnte ich nun dadurch beseitigen, dass ich
if (mmap->type == 1 && mmap->base != 0)geschrieben habe, aber woran kann es liegen, dass der Bootloader von Qemu einen Bereich ab 0 als frei markiert?
Wirklich frei ist er nicht, denn Qemu schmiert ab, wenn ich nach 0 etwas schreibe (Nullpointer sind auch einfach böse :evil:)

Dann habe ich noch eine Frage bezgl. Modulen:
Würde es funktionieren, wenn am Anfang eines Modules (als flache Binary wahrscheinlich) eine Funktion ist, die einen Kernel-Interrupt aufruft,
die einen Pointer auf eine Tabelle mit Kernel-Funktionen zurückgibt (darunter auch eine, die das Modul aufruft, um sich selbst zu registrieren)?
Oder kann es sein, dass ich gerade das Modulsystem von Linux beschrieben habe?  :roll:

Eine Idee, wie man eine Speicher-/Heapverwaltung umsetzen könnte, habe ich auch noch:
Am Anfang ist der ganze Speicher ein Bereich, am Anfang jedes Bereiches liegt ein uint32_t (vllt. überdimensioniert),
der die Größe des Bereiches angibt und ob er frei/belegt ist.
Will man nun zuerst Speicher allozieren, so setzt man den Anfang des ersten freien Bereiches, der groß genug ist,
die Größe des belegten Platzes und dass er belegt ist, geschrieben und hinter diesen Bereich die Größe des restlichen freien Speichers.
Um einen Bereich wieder frei zu geben, markiert man diesen wieder als frei und verbindet ihn wenn möglich mit dem freien Speicher dahinter.
Damit die Performance nicht auf der Strecke bleibt, wäre ein Array(begrenzter Größe, also eher Cache) der/einiger freien Bereiche ratsam,
sonst müsste man im schlimmsten Fall alle Bereiche durchgehen, bis man am Ende merkt, dass überhaupt kein Speicher mehr frei ist.
Kann man das so umsetzen?
Dass ich bei meiner Methode eine hohe Fragmentierung erzeuge, weiß ich, auch dass ich pro Bereich 4 Byte zusätzlich brauche.
Wenn man die maximale Größe eines Bereiches auf 2^16 Bytes begrenzt und auch freien Speicher teilt, lässt sich das verbessern.
Alle malloc(), die ich bis jetzt gesehen habe, waren viel komplizierter, oder hat meine Methode einen großen Denkfehler, man weiß ja nie  :roll:?

Edit: Ich hab noch was vergessen:
Warum funktioniert es nicht, wenn ich (wie von der Multiboot-Spez. vorgeschlagen) zur nächsten mmap wechsle, indem ich mmap->size Bytes überspringe?
Bei den ersten beiden mmap´s stimmts noch mit sizeof(struct multiboot) überein, aber danach kommen nur noch komische Werte, einer reicht ja schon, um rauszukommen.
2
Lowlevel-Coding / Kernel mit GCJ
« am: 11. September 2012, 14:26 »
Damit der Artikel http://www.lowlevel.eu/wiki/Java endlich mal einen Beispielkernel erhält, wurde unter http://www.lowlevel.eu/wiki/Diskussion:Java schon eifrig über die Theorie diskutiert. Das ganze kommt jetzt aber ins Forum, weil es einfach keine Diskussion mehr ist  :-D
Hier ist ersteinmal das, was ich getan habe:
-Tutorial-Kernel kopiert
-Makefile für *.java ergänzt
-Init.java erstellt, die in Funktion Init.main() die native Funktion write_char('a') aufruft
-Funktionen von java.lang.Object überschrieben so gut es ging
-Versucht zu linken:
Init.java:1: undefined reference to `java::lang::Object::Object()'
Init.o: In function `void Init::main()':
Init.java:5: undefined reference to `_Jv_InitClass'
Init.java:5: undefined reference to `hidden alias for void Init::write_char(wchar_t)'
Init.o: In function `_Jv_global_static_constructor':
Init.java:13: undefined reference to `_Jv_RegisterResource'
Init.o:(.data+0x24): undefined reference to `void java::lang::Object::throwNoSuchMethodError()'
Init.o:(.data+0x74): undefined reference to `hidden alias for void Init::write_char(wchar_t)'
Init.o:(.data+0x100): undefined reference to `vtable for java::lang::Class'
Init.o:(.data+0x110): undefined reference to `java::lang::Object::class$'

Was also noch getan werden muss:
-write_char nativ implementieren (Mit CNI, das verlangt nix externes, soweit ich weiß)
-C++-Support einbauen, dazu braucht man einen rudimentären Kernel
-herausfinden, was (und wie) man die anderen Funktionen implementieren kann, dazu sollte man sich vllt. mal den GCJ-Quelltext anschauen oder dekompilieren (wer will das schon...).

Projekt-Ordner ist hier: http://ritter-vogt.dyndns.biz/rv/files/gcj-kernel.zip

Viel Spaß beim rumprobieren!
Fabian

Edit: Wenn C++ drin ist, sollte Java kein Problem mehr werden, da GCJ Java C++-Kompatibel kompiliert, soweit ich das verstanden habe.
Seiten: [1]

Einloggen