Advent of Bio

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Antworten
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Advent of Bio

Beitrag von Biolunar »

Hallo zusammen!

Ich kam spontan auf die Idee als eine andere Variante von advent of code mal selbst meine Projekte täglich fortzuführen. Dazu hab ich mir überlegt, dass es doch möglich sei bis Weihnachten ein fertiges Image meines Betriebsystems fertig zustellen. Und mit „fertig“ ist nicht *fertig* gemeint, sondern das erste release ist draußen. Jeden Tag mal etwas dran arbeiten und mal schauen wie weit ich komme. Sollte doch irgendwie machbar sein :D
Mein Plan ist es bis zum 23.12. an diversen kleinen Programmen zu arbeiten und an Heiligabend das Image zusammenzustellen, damit man es booten kann. Viel wird man wohl nicht machen können, aber mal schauen. Das wird mich zwingen Kompromisse einzugehen und nicht jedes Programm perfekt und fehlerfrei zu haben. Schreiben werde ich alles in C, der Sprache der Könige ;)

Eigenes Betriebsystems? Ja, so halb. Ich nehme den Linux-Kernel als Grundlage und schreibe das komplette Userland von Grund auf, damit ich nicht die 1523485te Linux-Distribution erschaffen werde, sondern alles, bis auf den Kernel, selbst geschrieben ist. „Etwas“ Vorarbeit habe ich schon geleistet, denn es gibt schon:
- liblinux (https://git.sr.ht/~biolunar/liblinux)
- libfreestanding (noch nicht veröffentlicht)

liblinux beinhaltet *alle* syscalls, Typen und Konstanten, und nicht mehr. Diese Lib erspart es mir Assembly anfassen zu müssen und auf die kleinen fiesen Details bei den syscalls zu achten. Diese Lib ist so ziemlich feauture complete, bis auf die Tatsache, dass noch einige Typen und Konstanten fehlen, die man in die syscalls füttert. Aber das wächst halt mit der Zeit.

libfreestanding soll Betriebsystem-unabhängige Funktionalität beinhalten, unter anderem: memset und Konsorten, byte order Funktionen, ASCII Kram, random number generation, snprintf und Konsorten, Memory Allokatoren, usw.

Der Plan ist es jeden Tag hier mitzuteilen was ich an jenem Tag getan habe.

Bis dann :-)
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 1

Beitrag von Biolunar »

Habe angefangen den Kilo Texteditor (https://viewsourcecode.org/snaptoken/kilo) zu implementieren. Da muss ich mir nicht selbst Gedanken drum machen wie ich am besten einen Editor schreibe, sondern hangel mich einfach an dem Tutorial entlang. Ich bin noch nicht sicher wie lange mich der festhalten wird, denn ich muss einiges an Funktionalität der libc nachbauen, daher ist der Anfang etwas zäh. Hab es bisher nur bis ⅓ in Kapitel 2 geschafft, aber das Fundament ist gesetzt.

Projektideen waren bisher:
  • shell
  • ls
  • editor
  • mount
Hat mich irgendwie gereizt mit dem Editor anzufangen :)

Ich sehe schon, dass ich in ein paar Tagen soweit bin eine dritte Library zu erstellen, libcompat. Die soll den ganzen POSIX Kram beinhalten, den ich grad für Kilo schreibe.
Benutzeravatar
xq
Establishment
Beiträge: 1527
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Advent of Bio

Beitrag von xq »

Sehr geil, ich bin auf dein Ergebnis gespannt!
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 364
Registriert: 05.07.2003, 11:17

Re: Advent of Bio

Beitrag von Lord Delvin »

Bemerkenswertes Projekt. Bin gespannt, wie weit du kommst. Manches ist doch einfach auch ziemlich aufwändig. Viel Erfolg auf jeden Fall :)
Benutzeravatar
Krishty
Establishment
Beiträge: 7640
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Advent of Bio

Beitrag von Krishty »

Leb meinen Traum!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 2

Beitrag von Biolunar »

Danke für die Aufmerksamkeit :)

Heute war ich recht lange beschäftigt, denn realloc, free und scanf sind ziemliche Brocken. Um scanf habe ich mich erfolgreich gedrückt, da die Funktion bisher nur in einem Kompatibilitätsfall aufgerufen wird, der unter Linux nie auftreten sollte. Aber ich halte mich schon ziemlich exakt an das Tutorial, also musste zumindest ein stub her, der immer fehlschlägt. Immerhin hab ich bereits ein simples fprintf in meiner libfreestanding gehabt, was ich nur um einen conversion specifier erweitern musste.

Zu realloc und free:
Die einfachste Implementierung, die mir eingefallen ist, bei jeder Allokation ein mmap zu machen und den alten Bereich in den neuen hinein kopieren. Warum ist das so schlecht? Nun mmap hat eine Granularität von ganzen pages, auf x86_64 also 4 KiB. Bei jeder noch so furzeligen Allokation reserviere ich somit ganze 4 KiB :D Aber das ist einer dieser Kompromisse, die ich bereit bin einzugehen. Für Kopfzerbrechen hat, wie immer bei Allokatoren, das richtige alignment für die pointer gesorgt…

Damit kann der Editor nun die Textausgabe erst ins memory scheiben, statt für jenen kleinen write jedesmal einen syscall zu verwenden.

Denke mein Ziel sollte es sein Kapitel 5 abzuschließen, denn auf search und syntax highlighting kann ich momentan verzichten. Bisher stecke ich mitten in Kapitel 3.

LOC zwischenstand
main.c: 214
compat.c: 426
compat.h: 103
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 364
Registriert: 05.07.2003, 11:17

Re: Tag 2

Beitrag von Lord Delvin »

Biolunar hat geschrieben:
03.12.2021, 00:24
Aber das ist einer dieser Kompromisse, die ich bereit bin einzugehen.
Ich könnte mir auch ehrlich gesagt nicht vorstellen, wie du bis Ende Jahr irgendwas zustande bekommst, wenn du diese Kompromisse nicht eingehen würdest.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Advent of Bio

Beitrag von Biolunar »

Ist teilweise schwierig den Drang zur Perfektion zu unterdrücken…
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 3

Beitrag von Biolunar »

Heute gibt es nicht viel zu erzählen. Kapitel 3 ist abgearbeitet, in Kapitel 4 wird fopen/fclose/getline verwendet, was vermutlich länger dauern wird zu implementieren. Deshalb mache ich das stattdessen mit den syscalls, sowie mit fester maximallänge von Zeilen in den Dateien. Sollte erstmal genügen für heute.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 4

Beitrag von Biolunar »

Irgendwo sind bugs, SIGSEGV lässt grüßen :D Aber heute hab ich kaum Zeit, daher nur einen Codedump: https://git.sr.ht/~biolunar/libfreestanding
Debuggen werd ich wohl morgen.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 5

Beitrag von Biolunar »

Bin gestern Abend eingeschlafen ohne das Update, daher nun der Stand von gestern.
Bugs (es waren mehrere gleichzeitig) sind behoben und bin nun in der Mitte von Kapitel 4. Beim debuggen hab ich doch noch eine „richtiges“ getline geschrieben, es gibt also keine Beschränkung in der Zeilenlänge der Textdateien mehr. Den Editorcode kann ich nun testweise mit einer richtigen libc kompilieren um zu schauen, ob zumindest der Tutorialcode so funktioniert wie er soll. Das hilft bei der Eingrenzung der Fehler (denn es gibt ca. doppelt so viel compat code von mir, als es den Tutorialcode gibt). Und copy&paste verwende ich nicht, ich tippe alles ab und verstehe was dort alles passiert.
Der Editor kann nun beliebige Textdateien anzeigen und scrollen (vertikal und horizontal) ist auch möglich.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 6

Beitrag von Biolunar »

Heute einen freien Tag gehabt und viel geschafft!
Kapitel 5 ist abgeschlossen und der Texteditor kann ist nun völlig funktionabel.
LOC
main.c: 838
compat.h: 142
compat.c: 637

Alle anderen Programme werde ich alleine schreiben, ich wollte nur nicht, dass ich sehr lange an dem Editor festhänge. 6 Tage ist akzeptabel, wobei ich heute ziemlich viel gemacht hab. Denke als nächstes werde ich ein ls programmieren. Was recht einfaches, wobei ich vermutlich mein printf etwas ausbauen werden muss, damit ich gute Formatierung hin bekomme. Würde auch helfen ein TODO aus dem Editor zu entfernen.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 7

Beitrag von Biolunar »

Gestern wieder nicht zum update gekommen …

Hab den Tag damit verbracht zu verstehen wie die komische API des getdent64 syscalls funktioniert und angefangen mein printf um den precision parameter zu bereichern. Endergebnis: Hab bisher nur mein ls angefangen, aber funktionieren tut es noch gar nicht.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 8

Beitrag von Biolunar »

Heute hab ich wieder einiges geschafft.

Mein printf kann nun sowohl die verschiedenen Integertypen (int, long, …), sowie die precision von strings (%.20s) und integern verstehen.
Das rudimentäre ls Programm funktioniert. Es zeigt momentan aber nur den inode, den Dateityp und den Namen an. Und das ganze unsortiert :)
Hab nun auch Code in meine compat Sources eingefügt, die es erlauben mit stack protector zu kompilieren.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 9

Beitrag von Biolunar »

Heute hab ich mit dem init Prozess angefangen und gemerkt, dass ich eine Shell brauche auf die init warten kann. Daher hab ich auch mit der Shell angefangen ;-)
War nicht wirklich viel, hatte kaum Zeit.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 10

Beitrag von Biolunar »

Am 10. Tag befand sich leider nichts hinter der Codetür, da keine Zeit.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 11

Beitrag von Biolunar »

Heute bin ich zu etwas gekommen.
Meine Shell nimmt Formen an! Und mit Formen meine ich Funktionen :) Es funktionieren: exit, cd, pwd und das Ausführen von beliebigen Programmen. Da es bisher kein Pendant zu $PATH oder so gibt, müssen alle Progamme durch Angabe ihres Pfades gestartet werden. Ist erstmal kein Problem und kann so bleiben, bis mir was schlaues einfällt. Was noch fehlt: Piping und file redirection, sowie ein halbwegs guter Tokenizer, mit dem man durch Anführungszeichen das splitten der Parameter für Programme unterbinden kann. Im Moment trennen Leerzeichen noch alle Parameter und das sollte ich irgendwann in naher Zukunft noch ändern. Pipes und file redirection sind da eher weniger wichtig. Wobei es im Moment noch keine Möglichkeit gibt den Output von Programmen (zB. ls) zu pagen. Wenn man zu viele Dateien in einem Verzeichnis hat und diese mit ls anzeigen möchte, hat man Pech gehabt :D
Aber morgen geht es wieder an den init Prozess, der ist so ziemlich das wichtigste Programm.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 12

Beitrag von Biolunar »

Mal wieder verspätetes Update von gestern :-)
Es gibt zwei neue Programme: reboot und poweroff. Arbeit am init Programm geht voran, aber ich muss mal eine VM aufsetzen, damit ich den unter realen Bedingungen testen kann.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 13

Beitrag von Biolunar »

Schon wieder ein Update für gestern … Ich bin irgendwie einen Tag hinterher :D

Hab gestern kaum was geschaft, bis auf meinen compat Code zu einer libcompat gemacht, damit ich die in jedem Programm verwenden kann.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 14

Beitrag von Biolunar »

Fällt aus, weil weiß auch nicht. Hab nix gemacht :(
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 15

Beitrag von Biolunar »

Irgendwie bin ich aus dem Schwung raus. Heute hab ich meine Programme in ein initrd image gesteckt und erfolgreich mit qemu gebootet. Und viel zu viel Zeit verschwendet heraus zu finden wie das ganze mit TLS funktioniert, damit ich das TODO aus meinem compat code entfernen kann für errno, welches _Thread_local sein soll (obwohl ich noch gar keine Threads habe :D).

Noch weiß ich auch nicht wie ich ein image machen soll, wo nicht nur das initrd, sondern auch der Kernel dabei ist und es ein root filesystem gibt. Muss ich mal herausfinden.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 16

Beitrag von Biolunar »

Ist irgendwie zur Gewohnheit geworden das Türchen einen Tag später zu öffnen :(

Codetechnisch ist heute nicht bei herum gekommen, hab aber herum experimentiert wie ich ein disk image erstellen kann. Werde vermutlich bei der Variante, die von xq im IRC vorgeschlagen wurde, vorerst verbleiben: nur eine FAT32 Partition zu nehmen (ohne Partitionstabelle). Zuerst hatte ich eine GPT Tabelle und dort zwei Partitionen (FAT32 als die EFI Partition und ext4 für die root Partition) genommen. Um das vernünftig zu bewerkstelligen braucht man scheinbar Rootrechte und das ist mir grad zu viel gefummel. Außerdem ist so das Image viel zu groß geworden, da FAT32 schon mindestens ca 32 MB braucht, und mein Kernel wiegt nur um die 10 MB. Dann noch die root Partition dazu … neeeeee. Erstmal nicht. Sobald ich mehr Kram habe um diese zu befüllen, werde ich das wohl ändern.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 17

Beitrag von Biolunar »

Ich mache mal weiter :D

Wie man sieht hab ich irgendwann aufgehört meinen Fortschritt zu dokumentieren. Aber es gab Fortschritt! Muss mich nur wieder dran erinnern was ich gemacht habe…
Aus irgendeinem Grund hab ich angefangen meine liblinux auf den PowerPC zu porten. Der Port ist noch nicht fertig, aber ich steckte mitten drin, als ich wieder was anderes Interessantes fand. Vielleicht sollte ich das mal abschließen.

Achso ich hab erfolgreich ein bootfähiges Image (x86_64) erstellen können, was ich unter qemu und VirtualBox starten konnte. Wollte auch noch auf richtiger Hardware testen, hab ich aber bis heute noch nicht. Oh mann.
Benutzeravatar
Biolunar
Establishment
Beiträge: 152
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Tag 18

Beitrag von Biolunar »

An der Library Front gab es Fortschritte:

Abgesehen vom PowerPC port hab ich meine liblinux entschlackt: Bisher hatte ich jeden Syscall zur verfügung, aber es gibt sooo viele, dass ich haufenweise überflüssige entfernt habe. Mein Herz hat dabei ein bisschen geblutet :( Fall ich sie vermisse, kann ich sie ja wieder hinzufügen. Alle entfernten Syscalls sind entweder deprecated oder ein anderer Syscall ist allgemeiner. Wer braucht z.B. noch 16 Bit UIDs oder open, wenn es openat2 gibt? Diese Entschlackung wird hoffentlich helfen schneller alle wichtigen Typen und Konstanten hinzuzufügen.

Weiterhin gab es einige Neuerugen in die libfreestanding, aber nicht mehr sicher welche (ohne das gitlog zu durchwühlen).

Es gibt eine neue Lib: libbio, die auf liblinux und libfreestanding aufbaut um alle gemeinsame Funktionalität der Programme zu bündeln.

(Fast) das ganze Projekt kann man nun auf https://sr.ht/~biolunar/Biolunix/ finden. Dort muss ich noch mein init fixen und die Skripte, um das Image zu erstellen, hinzufügen, aber sonst ist das recht up to date.
Antworten