hmm weiß keine ne Lösung?
09. November 2026, 18:28
u32int* pointer = (u32int*)kernel_end; //Du greifst auf den inhalt an der Addresse von Kernelende zu, das willst du ja nicht
u32int* pointer = &kernel_end; //der Pointer zeigt auf das Ende des Kernelshmm weiß keine ne Lösung?Hey, wenn du Antwortzeiten von unter einer Stunde erwartest, komm ins IRC

Wo haste dir denn den Trick abgeschaut?bei Franck Ribery

Das mit dem Align auf 4K ist bei GRUB auf jeden Fall so. Bin mir nicht hundertprozentig sicher, ob es auch in der Spezifikation steht.Steht da sehr wohl drin, wobei man dafür bit0 der Flags setzen muss, siehe Multiboot Specification.
Gut dass du das sagst Junge, das Flag war bei meinem Kernel nämlich gelöscht.Das mit dem Align auf 4K ist bei GRUB auf jeden Fall so. Bin mir nicht hundertprozentig sicher, ob es auch in der Spezifikation steht.Steht da sehr wohl drin, wobei man dafür bit0 der Flags setzen muss, siehe Multiboot Specification.
Junge, was meinen die mit Bit1? Wenn keine mmap vorhanden ist, dass dann die mem-felder vorhanden sein müssen?hä?ZitatJunge, nenn mich nicht Junge!

ehm... hä? Da steht, dass wenn du Bit 1 der Multiboot Header setzt, dass dann mindestens die mem_* Elemente der Multiboot Information Structure gültig sind (Anmerkung: ansonsten darf der Bootloader dein OS nicht laden) und falls der Bootloader fähig ist eine Memory-Map dir mit auf den Weg zu geben und noch dazu einen Memory-Map vorhanden ist (Anmerkung: über das BIOS), dann darf der Bootloader auch die mmap_* Elemente füllen.Ja das kann ich auch lesen. Und wenn Bit1 nicht gesetzt ist? Was ist dann anders?
Dann darf der Bootloader dich auch laden wenn er nicht mem_* füllen kann.Mich darf er laden? oO besser nicht
die mem_* werden wohl eher "gefüllt" sein als die mmap_*. Bei meinem alten Notebook sind die mmap_* Felder z.B. nicht "gefüllt" aber die mem_* schon. __SIZE_TYPE__ eigentlich? const char *bla und char *bla?
So, welche Größe hatsizeof(__SIZE_TYPE__)Code: [Auswählen]__SIZE_TYPE__eigentlich?
Und was ist der Unterschied zwischenErsteres ist ein Zeiger der auf etwas was über diesen Zeiger nicht (ohne Cast) verändert werden darf zeigt. Letzteres ist ein "normaler" Zeiger.Code: [Auswählen]const char *blaundCode: [Auswählen]char *bla?
EDIT: Ah, const ist sozusagen ein Schreibschutz, stimmts? Ich kann dann *bla nicht beschreiben. Zumindest wenn ich mein Buch richtig verstanden habe.Ja.
EDIT2: Bin gerade dabei die ersten Sachen für die libc zu machen (also strlen und so). Jetzt muss ich den kram ja mit gcc compilieren und habe dann eine *.o. Und weiter? Ich habe gesehen, dass das in Linux in ein *.a Archiv gepackt wird. Wie mache ich das? Und wie bringe ich gcc dazu, dass er dieses Archiv kennt, damit umgehen kann und es "immer" heranzieht. Also das Archiv müsste ich ja mit ar bauen können. Nur bei mir tut sich da nichts.Beispiel: ar rc libc.a bla.o bla2.o
EDIT3: OK ich habs jetzt gebacken gekriegt mit dem Archiv. Aber wie sage ich dem gcc jetzt das er mit dem Archiv arbeiten soll?Beim Linken nimmt man einfach das Archiv dazu (genauso wie eine Objektdatei auch).
T *t = 0;
++t;
Unter der Annahme, dass T ein Typ der Größe s ist, ist nach diesem Codestück t = 0 + 1 * s = s, d.h. es wird anstatt ein Byte weiterzugehen einmal s Bytes weitergegangen.T *t = 0;
t = (T*)((uintptr_t)t + x)
wobei x die Anzahl der Bytes ist die du weiter möchtest.Du darfst mit dem sehr wohl rechnen, aber es wird nicht das sein was du dir vorstellst. zB:Äh ok, das mit dem inkrementieren/decrementieren habe ich schon gemerkt und in meinem Buch nachgelesen. Ich meinte mit "rechnen" jetzt aber was anderes. Aber ich habe es schon herausgefunden, mitCode: [Auswählen]T *t = 0;Unter der Annahme, dass T ein Typ der Größe s ist, ist nach diesem Codestück t = 0 + 1 * s = s, d.h. es wird anstatt ein Byte weiterzugehen einmal s Bytes weitergegangen.
++t;
Wenn du wirklich bytes weitergehen möchtest, dann macht man das so:Code: [Auswählen]T *t = 0;wobei x die Anzahl der Bytes ist die du weiter möchtest.
t = (T*)((uintptr_t)t + x)
(u32)boot_inf gehts. Aber trotzdem danke.