Low Level C
-
Storm.Xapek.de schrieb:
Aha
Und wie genau soll das dann funktionieren,
ohne bibliotheken da hab ich ja nur den sprachumfang un mit dem kann ich nicht viel anfangenGenau das ist auch der Grund warum man ein OS nicht in reinem C schreiben kann. Du must dir selber erstmal deine ganzen Funktionen schreiben. Zum Beispiel heißt die printf Version des Linux-Kernels printk. Du hast am Anfang nichts. Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler. Ohne Assembler kein OS.
-
Linux-Hobby-Entwickler schrieb:
Storm.Xapek.de schrieb:
Aha
Und wie genau soll das dann funktionieren,
ohne bibliotheken da hab ich ja nur den sprachumfang un mit dem kann ich nicht viel anfangenGenau das ist auch der Grund warum man ein OS nicht in reinem C schreiben kann. Du must dir selber erstmal deine ganzen Funktionen schreiben. Zum Beispiel heißt die printf Version des Linux-Kernels printk. Du hast am Anfang nichts. Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler. Ohne Assembler kein OS.
Also erstmal in assembler die Grundfunktionen wie aus und eingabe machen, und die kann ich dann in C einbinden und benutzen, oder so ungefähr.
Ich interessiere mich für dieses thema glaubst du es würde sich lohnen mal zu versuchen einen eigenen kernel zu schreiben (ich stell mir ddas so vor dsa ich am ende den kernel vom grub booten lasse und das der mir dann hallo welt ausgibt und dann vielleicht runterfährt) oder wäre das auch bei einem so kleinen ziel zuviel arbeitfür eine person alleine die fast keine ahnung davon hat?
(ich wäre vielleicht bereit 1-2 tage arbeit dahineinzustecken, realistisch?)
-
Das wäre zu schaffen. Wie gesagt. Schau dir die Links an. Da findest du für das, was du vor hast schon massenweise Beispiele.
Edit:
Wenn du noch nicht mit Assembly vertraut bist, ist es sicher die Beste wahl, sich erstmal den Kernel von GRUB laden zu lassen. Ein bisschen Assembly brauchst du aber, wie hier eben schon erwähnt immer. Zum Beispiel, um die Interrupt Tabelle zu laden, oder IO Ports zu verwenden. Es kann also nicht schaden, sich auch damit auseinander zu setzten.
-
Ich hab jetzt mal einen eigenen thread im assemblerforum aufgemacht.
Wer lust hat kann mir ja da von zeit zu zeit mal helfen
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1009265.html#1009265
-
steht irgendwo ab wann ich mein programm (offiziell) Betriebssystem nennen darf?
also gibts da eine definition für, was ein betriebssystem alles können muss?
-
nö
-
Für PC sowas zu machen ist ausserdem langweilig. Such dir doch lieber irgendeine exotische Plattform wenn du hardware nah rumfrickeln willst. Da kann dann eventuell sogar was nützliches bei rauskommen was anderen Leuten etwas nützt. Z.b. PSP ist ganz nett zum frickeln.
-
icepacker schrieb:
steht irgendwo ab wann ich mein programm (offiziell) Betriebssystem nennen darf?
also gibts da eine definition für, was ein betriebssystem alles können muss?Ein OS sollte schon mp3's abspielen können
-
Also ich habe jetzt mal so ein paar Kernel gesehen. Bei diesem Code blicke ich irgendwie nicht durch. (Ich weiss das ist ziemlich simpler Code)
int main() { char *Text = "Willkommen"; char *VideoMem = (char*)0xB8000; while(*Text) { *VideoMem = *Text; *VideoMem++; *VideoMem = 7; *VideoMem++; *Text++; } return(0); }
-
osdeveloper schrieb:
Ein OS sollte schon mp3's abspielen können
Du meinst, dass in jeden OS Kernel ein MPEG 3 Decoder gehört? Dann kannst du nach deiner Definition noch der Erste sein, der ein OS erstellt. :p
-
lilian schrieb:
Also ich habe jetzt mal so ein paar Kernel gesehen. Bei diesem Code blicke ich irgendwie nicht durch. (Ich weiss das ist ziemlich simpler Code)
int main() { char *Text = "Willkommen"; char *VideoMem = (char*)0xB8000; while(*Text) { *VideoMem = *Text; *VideoMem++; *VideoMem = 7; *VideoMem++; *Text++; } return(0); }
Du schreibst den Text "Willkommen" an die stelle 0xB8000 im RAM. Ist doch Alles nur C. Das solltest du am besten können, wenn du ein OS schreiben willst.
Edit: Wenn ich mich nicht irre, dann müsste das aber so aussehen:
while(*Text) { *VideoMem = *Text; VideoMem++; *VideoMem = 7; VideoMem++; Text++; }
-
Linux-Hobby-Entwickler schrieb:
Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler.
falsch.
Linux-Hobby-Entwickler schrieb:
Ohne Assembler kein OS.
auch falsch.
-
net schrieb:
Linux-Hobby-Entwickler schrieb:
Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler.
falsch.
Wie schaltest Du aus dem System-Mode in den User-Mode?
Wie sicherst Du die Register eine Prozesses der von einem Interrupt unterbrochen wurde?
-
@Linux-Hobby-Entwickler: mit C *lol* ... *rofl*
-
Linux-Hobby-Entwickler schrieb:
Wie schaltest Du aus dem System-Mode in den User-Mode?
das ist architekturabhängig, viele compiler haben für sowas eine library oder machen das per 'intrinsics'
Linux-Hobby-Entwickler schrieb:
Wie sicherst Du die Register eine Prozesses der von einem Interrupt unterbrochen wurde?
dafür gibts #pragmas oder spezielle schlüsselwörter
z.b.void __interrupt myISR(void) { .... }
oder
#pragma INTERRUPT void myISR(void) { ... }
da wird der context automatisch gesichert und ans ende 'ne 'return from interrupt' instruction gepackt
-
net schrieb:
Linux-Hobby-Entwickler schrieb:
Wie schaltest Du aus dem System-Mode in den User-Mode?
das ist architekturabhängig, viele compiler haben für sowas eine library oder machen das per 'intrinsics'
Ok, dass wusste ich nicht, bzw. ist mir vom GCC auch nicht bekannt. Läuft aber letzenendes auf das selbe hinaus, dass es mit ANSI C alleine nicht möglich ist.
net schrieb:
Linux-Hobby-Entwickler schrieb:
Wie sicherst Du die Register eine Prozesses der von einem Interrupt unterbrochen wurde?
dafür gibts #pragmas oder spezielle schlüsselwörter
z.b.void __interrupt myISR(void) { .... }
oder
#pragma INTERRUPT void myISR(void) { ... }
da wird der context automatisch gesichert und ans ende 'ne 'return from interrupt' instruction gepackt
Das setzt aber voraus, dass nach dem Interrupt der selbe Prozess weiter ausgeführt werden soll. Ich nutze aber auch Interrupts für das scheduling. Wenn ich aus meiner Prozesstabelle den nächsten Prozess zum weiterführen auswähle, muss ich dessen Kontext wiederherstellen. Das ist ebenfalls mit ANSI C nicht möglich.
-
Linux-Hobby-Entwickler schrieb:
Das setzt aber voraus, dass nach dem Interrupt der selbe Prozess weiter ausgeführt werden soll. Ich nutze aber auch Interrupts für das scheduling. Wenn ich aus meiner Prozesstabelle den nächsten Prozess zum weiterführen auswähle, muss ich dessen Kontext wiederherstellen. Das ist ebenfalls mit ANSI C nicht möglich.
naja, wenn man einen scheduler bastelt, der mangels mehrerer cpus und per timer-interrupt multithreading simuliert musss man schon tricksen, klar, mit ansi-c kommt man da nicht besonders weit. aber es gibt ja auch betriebssysteme, die ohne solche tricks auskommen, z.b. diese:
http://www.tinyos.net/
http://home.eunet.no/~jen/nenesos.htmlnesos is completely processor independent. It can be used with any ANSI C compiler. There is no need for assembly files or architecture dependent features
-
net schrieb:
Linux-Hobby-Entwickler schrieb:
Das setzt aber voraus, dass nach dem Interrupt der selbe Prozess weiter ausgeführt werden soll. Ich nutze aber auch Interrupts für das scheduling. Wenn ich aus meiner Prozesstabelle den nächsten Prozess zum weiterführen auswähle, muss ich dessen Kontext wiederherstellen. Das ist ebenfalls mit ANSI C nicht möglich.
naja, wenn man einen scheduler bastelt, der mangels mehrerer cpus und per timer-interrupt multithreading simuliert musss man schon tricksen, klar, mit ansi-c kommt man da nicht besonders weit.
Darauf wollte ich hinaus. Um bestimmte Features zu erreichen braucht man Assembler. Was im Prinzip auch nicht weiter schlimm ist, da es zum einen prozentual sehr sehr wenig ist und zum anderen diesen prima mit inline assemlby einbetten kann.
net schrieb:
aber es gibt ja auch betriebssysteme, die ohne solche tricks auskommen, z.b. diese:
http://www.tinyos.net/
http://home.eunet.no/~jen/nenesos.htmlnesos is completely processor independent. It can be used with any ANSI C compiler. There is no need for assembly files or architecture dependent features
Danke! Ich wusste nicht, dass man ein minimal OS mit reinem ANSI C schreiben kann. Werde ich mir auf jeden Fall mal anschauen.